Mybatis原理详解,适合新手,,大神绕过,

  • Post author:
  • Post category:其他


Mybatis框架使用总结:

首先简单总结一下Mybatis使用的原理:

Mybatis就是一个框架,将连接数据库并查询的操作等全部交给框架进行操作
实现的方法就是配置一系列的xml文件
首先关注一个关键的SQLMapperConfig.xml文件,当然文件名字是可以更改的,这个xml文件主要定义两个东西:数据库的连接配置和mapper映射文件
数据库的连接配置注意两点:
	一、environment表示的是数据库的环境,该环境可以定义好多个,但是只能使用一个。比如
	<environments default="mysql">
        <environment id="mysql">
            ...
        </environment>
        <environment id="oracle">
        	...
        </environment>
    </environments>
我在标签里面定义了很多个environment,有mysql,有oracle等等,但是我default设定的是mysql,因此使用mysql
	二、DataSource的设定有两种--pooled与unpooled,表示是不是用连接池,,使用连接池效率会更高,因此无脑选择pooled就是了

mapper映射文件则是配置映射文件的位置,具体的映射文件中定义的是一系列的sql语句,用于查询

下面可以简单想象一下执行的步骤:
	首先是读取SQLMapperConfig.xml文件的内容作为输入流(意思是读取配置文件,根据文件中的标签让Mybatis进行环境的配置)
	接着使用构建者模式创建一个builder
	让builder根据输入流建造一个工厂
	再使用工厂模式创建一个事务Session
	Session是具体操作数据库的,但是要操作哪个表呢?因此要将设定的mapper给加载进来
	一个mapper有一个namespace,namespace代表的就是数据库中的某一个表,一个表在Java中被抽象为一个类,因此将类加载进来就好,常用的加载方式就是读取字节码文件,也就是用反射***.class
	现在就完成了所有的初始化操作

下面是具体的操作数据库:
	前面提到了mapper的工作空间是一个表,一个表对应一个被抽象出来的类,但是我们还没有定义操作,比如查询,更新?因此我们需要定义一个操作类,这些操作在Java中是用函数来表示的。在不用Mybatis的时候我们采用的方式是在类中定义一组具体的方法,而使用了Mybatis我们还定义类中的具体方法就体现不出Mybatis的优势了
	Mybatis将该方法优化为定义一个操作接口即可,操作接口中定义一组抽象方法,在实际使用的时候我们加载字节码文件就是加载这个接口的字节码文件
	比如我们定义了
		interface userDao{
	List<User> findAll();
}
    然后加载的是userDao.class文件,我们就可以使用当中定义的方法findAll;但是我们只定义了方法名,具体的方法实现在哪里呢?具体实现的地方就是在之前提到的mapper中
    也就是说,一个表中的元素对应一个类,一个表的操作名称对应一个接口,一个表的具体操作方法对应的是一个mapper文件
    现在我们就很明确了,接下来要知道的就是如何将这三个文件以及数据库中的表给关联起来。。
    Mybatis声明类的属性名称要与数据库中表的列名称相同,这样就实现了表到类的映射,两者关联起来了
    Mybatis声明mapper文件中的方法的id与接口中的方法名称相同,这样方法名与方法的具体实现也关联起来了
    接口中的方法操作的是表,这样类与接口之间也实现了关联
    
    这样Mybatis的基础我们就很明确了
        1、读取配置
       	2、建造工厂
        3、打开事务session
        4、事务与具体的mapper文件关联
        5、事务调用接口中的方法
        	根据SqlMapperConfig.xml找到mapper资源的位置
        	根据位置找到对应的具体mapper(也就是一个表对应的xml文件)
        	读取***.class文件中的配置得到方法名
        	根据方法名获取mapper文件中的同名id的标签
        	执行该标签体
        6、事务提交
        7、各种流关闭
这样Mybatis的基础就OK了
其他关于Mybatis要学习的就是多表查询,具体的sql语句该怎么配置,Mybatis缓存,取别名操作等等

使用步骤:

1、创建对应的Dao接口,例如:com.Dao.UserDao

2、创建相应的资源文件,例如:SqlMapperConfig.xml

​ 配置该文件:(要求该文件的全类型名与UserDao文件的全类型名相同)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="mysql"><!--默认的环境-->
        <environment id="mysql"><!--创意一个环境-->
            <!--类型为JDBC-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据源为连接池-->
            <dataSource type="POOLED">
                <!--连接池的属性-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/userdb?characterEncoding=utf-8&amp;amp&amp;serverTimezone=UTC&amp;useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="qaz987123"/>
            </dataSource>
        </environment>
    </environments>

    <!--映射文件的位置-->
    <mappers><!--要求是-->
        <mapper resource="com/domain/Dao/UserDao.xml"></mapper>
        <!--取别名操作,将上面这句话换做
		<package name="com.Dao"/>
		这句话就是说该路径下所有的接口都可以直接写接口名称,不用写具体的路径使用
		比如在后面要用到的
		<select id="findAll" resultType="com.domain.User">...</select>
		可以写作
		<select id="findAll" resuleType="User">
		-->
    </mappers>
</configuration>

3、创建相应的资源配置文件,例如:resources/com.Dao.UserDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.domain.Dao.UserDao"><!--namespace要求是对应的Dao接口 文件的空间-->
    <!--配置sql语句-->
</mapper>

4、在UserDao中配置相应的函数,并且关联到对应的mapper中去

例如在UserDao中写:
void insertUser(User user);//在数据库中插入user对象
List<User> findAll();
void saveUser(User user);
void updateUser(User user);
void deleteUser(User user);
User findUserById(Integer id);
List<User> findByName(String name);
int findTotal();
则在UseeDao.xml中的mapper配置
<!--id与函数名称相同,parameterType表示接收到的数据类型-->
	<insert id="saveUser" parameterType="com.domain.User">
        insert into user values (null ,#{name}, #{gender}, #{age}, #{address}, #{qq}, #{email});
    </insert>
    <!--id与函数名称相同,resultType表示将返回值封装成的类型-->
    <!--因此要求JavaBean中的数据类型与数据库中表的字段名相同-->
    <select id="findAll" resultType="com.domain.User">
        select * from user;
    </select>
    <insert id="saveUser" parameterType=



版权声明:本文为qq_41582910原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。