MyBatis配置文件基础总结

        

目录

1、核心配置文件

2、MyBatis接口代理实现Dao层

2.1 @Param注解

3、动态SQL

3.1 动态SQL标签

3.1.1  标签

3.1.2  标签

3.2、SQL片段抽取

3.3 动态SQL

4、分页插件介绍

4.1 分页

5、MyBatis多表操作

5.1 一对一

5.2 一对多

5.3 多对多

5.4 多表操作总结

6、MyBatis注解实现多表操作

6.1 一对多

6.2 多对多

6.3、注解多表操作小结

7、MyBatis构建SQL语句



1、核心配置文件

核心配置文件包含了Mybatis最核心的设置和属性信息,如数据库连接、事务、连接信息等

  • <configuration>:核心根标签
  • <properties>:引入数据库连接信息配置文件标签
  • <typeAliases>:起别名标签
  • <environments>:配置数据库环境标签
  • <environment>:配置数据库信息标签
  • <transactionManager>:事务管理标签
  • <dataSource>:数据源标签
  • <property>:数据库连接信息标签
  • <mappers>:引入映射配置文件标签

2、MyBatis接口代理实现Dao层

  • 传统方式实现Dao层,既要写接口,还要写实现类,而MyBatis框架可以帮助省略编写Dao层接口的实现步骤,程序只要编写接口,由Mybatis框架根据接口的定义来创建该接口的动态代理对象。
  • 实现规则:
  1. 映射文件中的名称空间必须和Dao层接口的全类名相同
  2. 映射配置文件中的增删改查标签的id属性必须和Dao层接口的方法名相同
  3. 映射配置文件中的增删改查标签的parameterType属性必须和Dao层接口方法的参数相同
  4. 映射配置文件中的增删改查标签的resultType属性必须和Dao层接口方法的返回值相同
  • 分析动态代理对象如何生成:通过动态代理开发模式,只编写一个接口,不实现类,通过getMapper()方法最终获取到org.apache.ibatis.binging.MapperProxy代理对象,然后执行功能,而这个代理对象正是MyBatis使用了JDK的动态代理技术,帮助我们生成了代理实现类对象,从而可以进行相关持久化操作。
  • 分析方法如何执行的:动态代理实现类对象在执行方法的时候最终调用了mapperMethod.execute()方法,这个方法中通过switch语句根据操作类型来判断是新增、修改、删除、查询操作,最后一步返回到了MyBatis最原生的SqlSession方式来执行增删改查。

2.1 @Param注解

作用是给参数起名字的

当我们的SQL语句中有多个参数,而且没有封装到一个具体对象时,就可以借助这个注解来给每一个参数起不同的名字

参数命名之后就能根据名字得到参数值,正确得将参数传入到SQL语句中

3、动态SQL

MyBatis映射配置文件中,当业务比较复杂时,SQL就是动态变化的,此时简单的SQL就不能满足要求了

例如:

1、id:3       name:王五     age:25

SELECT * FROM student WHERE id = ? AND name=? AND age = ?

2、id:3     name:王五

SELECT * FROM student WHERE id = ? AND name=?

3.1 动态SQL标签

<if>:条件判断标签

<foreach>:循环遍历标签

3.1.1  <if>标签

例如:上面两个例子,传入的参数不同,分别为三个和两个,那么需要写两次sql语句,但是动态只需写入一次,如下:

<select id="selectCondition" resultType="student" paramterType="student">
SELECT * FROM student
<where>
    <if test="id != null">
        id = #{id}
    </if>
    <if test="name != null">
       AND name = #{name}
    </if>
     <if test="id != null">
       AND age = #{age}
    </if>
    
</where>
</select>

3.1.2  <foreach>标签

  • <foreach>:循环遍历标签,适用于多个参数或者的关系
<foreach collection="" open="" close="" item="" separator="">
    获取参数
</foreach>

属性:

collection:参数容器类型,(list-集合,array-数组)

open:开始的SQL语句

close:结束的SQL语句

item:参数变量名

separator:分隔符

例如:获取id为1或者2或者3的学生

<select id="selectByIds" resultType="student" parapmeterType="list">
    SELECT * FROM student WHERE id IN (1,2,3)
</select>

使用动态SQL语句则为

<select id="selectByIds" resultType="student" parapmeterType="list">
    SELECT * FROM student 
    <where>
            <foreach collection="list" open="id IN (" close=")" item="id" separator=",">
                #{id}
            </foreach>
    </where>
</select>

3.2、SQL片段抽取

 可以将重复性的SQL语句进行抽取,以达到复用的效果

  • <sql>:抽取SQL语句标签

                <sql id="片段唯一标记"> 抽取的sql语句</sql>

  • <include>:引入SQL片段标签

                <include refid="片段唯一标识" />

3.3 动态SQL

  • 动态SQL指的就是SQL语句可以根据条件或者参数的不同进行动态的变化
  • <where>:条件标签
  • <if>:条件判断标签
  • <foreach>:循环遍历的标签
  • <sql>:抽取SQL片段的标签
  • <include>:引入SQL片段的标签

4、分页插件介绍

 在企业级开发中,分页也是一种常见的技术,而目前使用的MyBatis是不带分页功能的,如果想实现分页的功能,需要手动编写LIMIT语句。但是不同的数据库实现分页的SQL语句也是不同的,所以手写分页成本较高。这个时候可以借助分页插件来帮助我们实现分页的功能

  • PageHelper:第三方页助手,将复杂的分页操作进行封装,从而使分页功能变得非常简单

4.1 分页

  • 分页:可以将很多结果进行分页显示
  • 分页插件jar包:pagehelpher-5.1.10.jar    jsqlparser-3.1.jar
  • <plugins>:集成插件标签
  • 分页助手相关API
  1.  PageHelper:分页助手功能类
  2. startPage():设置分页参数
  3. PageInfo:分页相关参数功能类
  4. getTotal():获取总条数
  5. getPages():获取总页数
  6. getPageNum():获取当前页
  7. getPageSize():获取每页显示条数
  8. getPrePage():获取上一页
  9. getNextPage():获取下一页
  10. isIsFirstPage():获取是否是第一页
  11. isIsLastPage():获取是否是最后一页

5、MyBatis多表操作

 多表模型分类:

  • 一对一:在任意一方建立外键,关联对方的主键
  • 一对多:在多的一方建立外键,关联一的一方的主键
  • 多对多:借助中间表,中间表至少两个字段,分别关联两张表的主键

5.1 一对一

  • <resultMap>:配置字段和对象属性的映射关系标签      

                id属性:唯一标识

                type属性:实体对象类型  

  • <id>:配置主键映射关系标签
  • <result>:配置非主键映射关系标签

                column:表中字段名称

                property属性:实体对象变量名称

  • <association>配置被包含对象的映射关系标签

                property属性:被包含对象的变量名

                javaType:被包含对象的数据类型

pubilc class Card{
    private Integer id;
    private String number;
    private Person p;
}

pubilc class Person{
    private Integer id;
    private String name;
    private Integer age;
}
<resultMap id="oneToOne" type="card">
    <id column="cid" property="id"/>
    <result column="number" property="number"/>
    <!--
        association:配置包含对象的映射关系
        property:被包含对象的变量名
        javaType:被包含对象的数据类型
    -->
    <assocation property="p" javaType="person">
        <id column="pid" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
    </assocation>
<resultMap>

<select id="selectAll" resultMap="oneToOne">
    SELECT c.id cid, number, pid ,NAME, age FROM card c, person p WHERE c.pid = p.id
</select>

5.2 一对多

  • <resultMap>:配置字段和对象属性的映射关系标签      

                id属性:唯一标识

                type属性:实体对象类型  

  • <id>:配置主键映射关系标签
  • <result>:配置非主键映射关系标签

                column:表中字段名称

                property属性:实体对象变量名称

  • <collection>配置被集合对象的映射关系标签

                property属性:被包含对象的变量名

                ofType:被包含对象的数据类型

pubilc class Student{
    private Integer id;
    private String name;
    private Integer age;
}

pubilc class Classes{
    private Integer id;
    private String name;
    private List<Student> students;
}
<resultMap id="oneToMany" type="classes">
    <id column="cid" property="id"/>
    <result column="cname" property="name"/>
    <!--
        association:配置包含对象的映射关系
        property:被包含对象的变量名
        ofType:被包含对象的数据类型
    -->
    <collection property="students" ofType="student">
        <id column="sid" property="id"/>
        <result column="sname" property="name"/>
        <result column="sage" property="age"/>
    </collection>
<resultMap>

<select id="selectAll" resultMap="oneToMany">
    SELECT c.id cid, c.name cname,s.id  sid, s.name sname, s.age age FROM classes c, student s WHERE c.id = s.cid
</select>

5.3 多对多

  • <resultMap>:配置字段和对象属性的映射关系标签      

                id属性:唯一标识

                type属性:实体对象类型  

  • <id>:配置主键映射关系标签
  • <result>:配置非主键映射关系标签

                column:表中字段名称

                property属性:实体对象变量名称

  • <association>配置被包含对象的映射关系标签

                property属性:被包含对象的变量名

              ofType:被包含对象的数据类型

5.4 多表操作总结

  • <resultMap>:配置字段和对象属性的映射关系标签      

                id属性:唯一标识

                type属性:实体对象类型  

  • <id>:配置主键映射关系标签
  • <result>:配置非主键映射关系标签

                column:表中字段名称

                property属性:实体对象变量名称

  • <association>配置被包含对象的映射关系标签

                property属性:被包含对象的变量名

                javaType:被包含对象的数据类型

  • <collection>配置被集合对象的映射关系标签

                property属性:被包含对象的变量名

                javaType:被包含对象的数据类型

6、MyBatis注解实现多表操作

6.1 一对多

  • @Results:封装映射关系的父注解
  • Result[] value():定义了Result数组
  • @Result:封装映射关系的子注解
  • column属性:查询出的表中字段名称
  • property属性:实体对象中的属性名称
  • javaType属性:被包含对象的数据类型
  • many属性:一对多查询固定的属性
  • @Many:一对多查询的注解
  • select属性:指定调用某个接口中的方法

例如:一个班级对应多个学生

public class Classes{
    private Integer id;
    private String name;
    private List<Student> students;
}
@select("SELECT * FROM classes")
@Results({
            @Result(column="id", property="id"),
            @Result(column="name", property="name"),
            @Result(
                     property="students",  //被包含对象的变量名
                     javaType=List.class,    //被包含对象的实际数据类型
                     column="id",            //根据查询出的classes表的id字段来查询student表
                     /*
                        many,@many一对多查询的固定写法
                        select属性:指定调用哪个接口中的多个查询方法
                     */
                      many = @Many(select="com.one_to_many.StudentMapper.selectByCid")
                        )
        })

6.2 多对多

  • @Result:封装映射关系的父注解
  • Result[] value():定义了Result数组
  • @Result:封装映射关系的子注解
  • column属性:查询出的表中字段的名称
  • property:实体对象中的属性名称
  • javaType属性:被包含对象的数据类型
  • many属性:一对多查询固定属性
  • @Many:一对多查询的注解
  • select属性:指定调用某个接口中

例如:多个学生对应多个课程,(其中有个中间表stu_cr,sid为学生表的外键,cid为课程的外键)

public class Student{
    private Integer id;
    private String name;
    private Integer age;

    private List<Course> courses;
}
public interface CourseMapper{
    //根据学生id查询所选课程
    @select("SELECT c.id, c.name FROM stu_cr sc, course c WHERE sc.cid = c.id AND sc.sid=#{id}*)
    public abstract List<Course> selectBySid(Integer id);
}

 

@select("SELECT * FROM Student")
@Results({
            @Result(column="id", property="id"),
            @Result(column="name", property="name"),
            @Result(column="age", property="age"),
            @Result(
                     property="courses",  //被包含对象的变量名
                     javaType=List.class,    //被包含对象的实际数据类型
                     column="id",            //根据查询出的classes表的id字段来查询student表
                     /*
                        many,@many一对多查询的固定写法
                        select属性:指定调用哪个接口中的多个查询方法
                     */
                      many = @Many(select="com.many_to_many.CourseMapper.selectBySid")
                        )
        })

6.3、注解多表操作小结

  • @Results:封装映射关系的父注解
  • Result[] value():定义了Result数组
  • @Result:封装映射关系的子注解
  • column属性:查询出的表中字段名称
  • property属性:实体对象中的属性名称
  • javaType属性:被包含对象的数据类型
  • one属性:一对一查询固定属性
  • many属性:一对多查询固定属性
  • @One:一对一查询的注解
  • select属性:指定调用某个接口中的方法
  • @Many:一对多查询的注解
  • select属性:指定调用某个接口中的方法

7、MyBatis构建SQL语句

  • Org.apache.ibatis.jdbcSQL:构建SQL语句的功能类,通过一些方法来代替SQL语句的关键字

        SELECT()

        FROM()

        WHERE()

        INSERT_INTO()

        VALUES()

        UPDATE()

        DELETE_FROM()

  • @SelectProvider:生成查询用的SQL语句注解
  • @InsertProvider:生成新增用的SQL语句注解
  • @UpdateProvider:生成修改用的SQL语句注解
  • @DeleteProvider:生成删除用的SQL语句注解

                type属性:生成SQL语句功能类对象

                method属性:指定调用的方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值