MyBatis知识总结

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 属性中指定的属性。

2settings标签

功能:MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

<settings>
    <!-- web项目中应用log4j输出日志 -->
    <setting name="logImpl" value="LOG4J"/>
</settings>

3typeAliases标签

功能:为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>

猜你喜欢

转载自blog.csdn.net/Mr_Z_CSDN/article/details/80640831