Mybatis框架的主要作用是让程序的主要精力都放在sql上,通过my提供的映射,半自动化的生成sql操作数据。通过想PrepareStatement中输入的参数自动进行输入映射,将结果集ResultSet映射成java对象作为输出映射。
一、Mybatis运行流程及相关核心类
1、SqlMapConfig.xml是Mybatis的全局配置文件,类似于Hibernate中的hibernate.cfg.xml,主要用于配置数据源、事务、加载实体mapper.xml配置文件(同上图Config.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis管理 --> <transactionManager type="JDBC" /> <!-- 数据库连接池 ,由mybatis管理 --> <dataSource type="POOLED"> <property name ="driver" value ="com.mysql.jdbc.Driver" /> <property name ="url" value ="jdbc:mysql://127.0.0.1:3306/mybatisdemo?characterEncoding=utf-8"/> <property name ="username" value ="root" /> <property name ="password" value ="dannyhoo" /> </dataSource> </environment> </environments> <!-- 使用resource方式加载映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers> </configuration>
2、SqlSessionFactory:会话工厂 是每一个MyBatis Application必有的,根据config配置文件创建,它主要用于创建Sqlsession会话,由sqlSessionBuilder通过new 的方式创建,SessionFatoryBuider可直接当作一个工具类使用,不需要使用单例进行管理,而由它创建的SqlSessionFactory是最好通过单例模式来创建,保证工厂一旦创建一次,就使用一个SqlSessionFactory实例。并且SqlSessionFactory的作用范围是应用程序级的,在一个application中可仅有一个SqlSessionFactory,所以用单例控制SqlSessionFactory的创建。
3、Sqlsession:会话工厂创建出Sqlsession会话后,回话方可执行DB操作,执行sql语句、事务控制等,执行后可commit提交到数据库;SqlSession的作用范围和生命周期需要开发人员特别注意,因为它不是线程安全的,除了操作方法之外,还有数据属性。所以它的作用范围最好界定到方法级别,定义为方法的局部变量,也就是一个方法独有一个SqlSession实例。
Exucutor:Mybatis在Sqlsession中提供了Exucutor类(执行器),是SqlSession用于执行sql操作数据库的接口类
Mapped Statement:另外Mapped Statement是底层封装对象,对操作数据库的参数进行封装,包括sql语句、输入参数、输出参数
1、properties
1)以JDBC为例,如果将上面datasource属性灵活可配置,例如换一个数据库连接,可将value参数值以${}变量的形式传入
抽象db.properties文件如下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/max?characterEncoding=utf-8
jdbc.username=rootjdbc.password=123456
修改datasource 标签,同时在SqlMapConfig.xml中加载db.properties文件
<properties resouce=”db.properties”/>
.................
<dataSource type="POOLED">
<property name ="driver" value ="${jdbc.dirver}" />
<property name ="url" value ="${jdbc.url"/>
<property name ="username" value ="${jdbc.username}" />
<property name ="password" value ="${jdbc.password}" />
</dataSource>
2)配置读取优先级问题
如果在db中有一个username参数,同时,在user实体的mapper映射中也有一个username参数,则my存在一个读取配置优先级问题,properties元素体内定义的属性优先于properties元素中的resource或url加载的属性,最后读取parameterType传递的属性。如果出现同属性名,则后面读取的属性值会覆盖前面已经读取的相同属性名的值。
针对这个问题,首先保证properties resource加载的文件中属性名具有一定特殊性,如jdbc.username;其次,不要再properties元素体内添加其他属性值,均将它定义到.properties文件中,统一加载。
2、settings
Mybatis的全局配置参数,用于添加延迟加载、缓存配置信息。后面详细介绍
3、aliase
别名的使用场景也非常广泛,例如在输入、输出映射中,如果输入pojo类型,则需要填写这个pojo的全路径,这时可以把这些pojo类使用别名标记,简化开发;
1)自定义别名
<typeAliases> <typeAliase type=”cn.max.po.User” alias=”user”/> </typeAliases>在resultType中引用别名
<!-- 查询--> <select id="findUserById" parameterType="int" resultType="user"> select * from user where id=#{id} </select>
2)批量定义别名
<typeAliases> <!--自动扫描包中的类,为每一个类定义别名,别名==类名--> <package name=”cn.max.po”/> <package name=”cn.max.server”/> <package name=”cn.max.en”/> </typeAliases>
4、typeHandlers类型处理器
Mybatis自动提供多中类型处理器,主要用于处理输入、输出映射、参数java类型和jdbc数据类型的映射。、
5、mapper映射
1)通过resouce加载单个pojo映射文件
<mapper resource="mapper/UserMapper.xml"/>
2)通过mapper接口class加载
<mapper class=”cn.max.po.UserMapper”/>
通过class加载的好处在于可以直接写到包名,如class=“cn.max.po”,则po包下的所有mapper.java接口都会被加载,但这要求mapper.java接口和mapper.xml配置文件在同一目录下且名称一致,通过mapper代理可找到该映射信息。
3)通过url加载
<mapper url=”file:///d:\work\map\User.xml”/>-本地全路径