MyBatis学习总结
一、MyBatis实现原理
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,
SqlSessionFactory在根据配置(表映射配置文件、Java代码注解)获取一个SqlSession。
SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等。
用完之后关闭SqlSession。
二、Mybatis架构
1、 2个配置文件,三个接口
1)sqlMapConfig.xml:Mybatis核心配置文件,功能:加载外部属性配置文件,配置日志文件等相关设置,配置数据源和事务管理,配置类别名,加载映射配置文件。
2)表名Maper.xml:表映射配置文件,该文件配置了针对一张表需要执行所有sql语句;一张表对应一个表名Mapper.xml;一张表对应一个Pojo类;表映射文件需要在sqlMapConfig.xml中加载。
3)SqlSessionFactory:会话工厂对象,用来获取SqlSession对象。
4)SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成数据库增删改查功能。
5)Executor:
a)通过MappedStatement在执行sql前将输入的java对象映射至sql中;给?赋值并执行;
b)Executor通过MappedStatement在执行sql后将输出结果映射至java对象或集合中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
三、sqlMapConfig.xml文件的配置
<?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> </configuration>
configuration 配置:
1、properties标签
功能:加载外部属性配置文件,与spring整合时不需要写
<properties resource="db.properties"><!-- 加载src根目录下的db.properties --> <propertyname="username" value="dev_user"/> <propertyname="password" value="F2Fa3!33TYyg"/> </properties>
注:属性同名时,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
2、settings标签
功能:MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
<settings> <!-- web项目中应用log4j输出日志 --> <setting name="logImpl" value="LOG4J"/> </settings>
3、typeAliases标签
功能:为Java 类型设置一个短的名字。它只和XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。在核心配置文件中为类定义别名,表映射文件参数和返回值类型都可以用别名表示。
<typeAliases> <!-- 为一个类定义别名--> <typeAliasalias="Student" type="com.t1.mybatis.pojo.Student"/> <!-- 为一个包及其子孙包下所有类定义别名 --> <package name="com.t1.mybatis.pojo"/> </typeAliases>
4、environments标签
功能:配置事务管理及数据源,spring整合时不需要配置该标签
5、mappers标签
功能:导入表映射文件,spring整合时可以不定该标签
<mappers> <!-- 加载该包及其子孙包下所有表映射文件 --> <package name="com.t1.mybatis.mapper"/> <!-- 加载一个表映射文件 --> <mapper resource="com.t1.mybatis.mapper.StudentMapper.xml"/> <!-- 加载一个与类同名的表映射文件 --> <mapperclass="com.t1.mybatis.mapper.StudentMapper"/> </mappers>
四、关联查询
一对多关联查询:查询一方表,并查询出关联的多方表信息。
一对一关联查询:查询多方表,并查询出关联的一方表信息。
1、一对多关联查询
1)实现步骤:
<1>定义多方pojo类(set,get)
<2>定义一方pojo类,包含一个多方类的集合属性(set,get)
<3>定义一方接口
<4>定义一方表映射文件
<5>测试类中获取多方代理对象
关联体现三处:创建表的sql外键约束;Pojo;表映射文件。
以一方表作为中心进行查询;实现时可以假装多方表不存在。
2)配置方式:一对多关联,以一方表作为中心,关联多方
-----------------------------------------------------------------------------------------------------------
<resultMap type="BanJi"id="otmresultMap"> <id column="bid"property="bid"/> <result column="cname"property="bname"/> <collection property="list" ofType="Student"> <id column="sid"property="sid"/> <result column="sname"property="sname"/> <result column="age"property="age"/> </collection> </resultMap> <select id="queryBanJiById"parameterType="int" resultMap="otmresultMap"> select b.bid,b.bname ascname,b.renshu,s.sname,s.age,s.sid from banji b join student s on b.bid=s.banji_id where b.bid=#{x} </select>
3)说明
1) 一对多联合查询时,只有属性名和字段名在resultMap映射,才能从表中查询出来,不映射查不出来;不会根据属性和查询结果集中字段名相同而自动获取表中字段值。
2) resultMap需要配置2张表的信息。
3)定义resultMap时用sql查询结果中的字段名与各属性关联(不是表存储的字段名)
2、一对一关联查询
1)实现步骤:
<1>定义一方pojo类(set,get)
<2>定义多方pojo类,包含一方类对象做属性(set,get)
<3>定义多方接口
<4>定义多方表映射文件
<5>测试类中获取多方代理对象
以多方表作为中心进行查询;实现时可以假装一方表不存在
2)配置方式:一对一关联查询,以多方为中心,关联一方
-----------------------------------------------------------------------------------------------------------
<resultMap type="Student"id="otoresultMap"> <result column="sname"property="sname"/> <result column="score"property="score"/> <association property="bjm" javaType="BanJi"> <id column="bid"property="bid"/> <result column="bname"property="bname"/> </association> </resultMap> <select id="queryAllStudent"resultMap="otoresultMap"> select st.sname,st.score,b.*from banji b join student st on b.bid=st.banji_id </select>