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>