MyBatis是一个半自动ORM框架,其本质是对JDBC的封装。使用MyBatis重点需要程序员编写SQL命令,不需要写一行JDBC代码。
Mybatis官网

1. 原生的JDBC实现CURD的问题

  1. 编码繁琐
  2. 需要我们自己将结果集映射成对象
  3. 性能不太好,连接池,缓存配置麻烦
  4. SQL语句和Java代码耦合度很高

    2. 如何使用MyBatis

  5. 引入jar包

    1. <!-- 1. mysqlConnector -->
    2. <dependency>
    3. <groupId>mysql</groupId>
    4. <artifactId>mysql-connector-java</artifactId>
    5. <version>8.0.28</version>
    6. </dependency>
    7. <!-- 2. mybatis 核心jar -->
    8. <dependency>
    9. <groupId>org.mybatis</groupId>
    10. <artifactId>mybatis</artifactId>
    11. <version>3.5.9</version>
    12. </dependency>
  6. idea中安装Lombok插件和MyBatisX插件。

  7. idea设置配置,该设置是针对项目进行设置的,不同项目都需要进行该操作。
    image.png
  8. 准备Mapper映射文件和核心配置文件

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
在官网中找到XML文件的内容,复制到项目model中resources目录下sqlMapConfig.xml中(当然也有可能不叫sqlMapConfig.xml)
image.png
image.png
项目目录结构图如下:
image.png
image.png
注意:

  1. resources目录下的文件夹要分层级创建,不要com.yin.mapper直接创建出来。
  2. *Mapper.xml对应一个接口,所以不同的*Mapper.xml中namespace的值不能相同。
  3. 项目编译编译以后*Mapper.xml和*Mapper是在同一个目录下。

    **Mapper.xml文件解析

  4. id里面的值是对应Java接口文件中的方法名。

  5. parameterType里面的值是对应Java接口文件中参数的类型。
  6. resultType对应的是SQL语句返回值的类型。
    多个参数,如果放到指定的位置
    1. arg* arg0 arg1 arg2
    2. param* param1 param2 param3
    3. 给参数起别名,在接口中为参数添加 @Param(“*“)
      如果使用了第三种方式,那么就不支持第一种方式,但是支持第二种方式**

参数是Map的形式,{}里面写map中的key。参数如果是对象的形式,{}里面写对象的属性。参数是多个引用数据类型,param 或 arg 加上. 把属性带出来。参数是多个引用数据类型,也可以使用别名的形式.使用别名的话,arg无法使用,但是param可以正常使用。

  1. 参数使用别名只需要在Java接口文件中,在对应接口方法的参数中加上@Param注解。
  2. 模糊查询中的%,可以在传参数的是时候就带上,也可以在SQL语句中使用concat函数去拼接。
  3. useGeneratedKeys 关键字(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键。默认值是false。
    首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性(就是对应自增字段名称)就 OK 了。
  4. where 标签可以处理and问题,不用加1=1的条件了。
  5. choose标签和when标签的作用是如果第一个判断为true,后面的判断不会再执行。
  6. 使用set标签以后,SQL语句中不用再加set关键字了,同时也会干掉第一个逗号。
  7. prefix 是动态要添加的前缀(即trim标签中第一个符合的字符)

prefixOverrides 是要删除的前缀(即trim标签中第一个符合的字符)
suffix 是要补充的后缀(即trim标签中最后一个符合的字符)
suffixOverrides 是要删除的后缀(即trim标签中最后一个符合的字符)。

  1. bind标签可以在xml文件中去定义key,value是value标签中的值
  2. 定义公共SQL,可以让当前xml文件使用该公共SQL。 ```xml empno ,ename,job,mgr,hiredate,sal,comm,deptno

select from emp

  1. 13. SQL语句带in查询
  2. ```xml
  3. <!--collection 遍历的集合或者数组
  4. separator 多个元素取出的时候 使用什么文字分隔
  5. open 以什么文字开头
  6. close 以什么文字结尾
  7. item 中间变量名称-->
  8. <!-- arrayList方式-->
  9. <select id="findByEmpnos" resultType="emp">
  10. select * from emp where empno in
  11. <foreach collection="list" separator="," open="(" close=")" item="eno">
  12. #{eno}
  13. </foreach>
  14. </select>
  15. <!-- int[] 方式-->
  16. <select id="findByEmpnos2" resultType="emp">
  17. select * from emp where empno in
  18. <foreach collection="array" separator="," open="(" close=")" item="eno">
  19. #{eno}
  20. </foreach>
  21. </select>
  1. xml文件定义实体类和数据库表映射关系 ```xml

  1. <select id="findAll" resultMap="empResultMap">
  2. select *
  3. from emp
  4. </select>

  1. 15. 一对一查询<br />一对多的查询,需要在查询出来的实体对象中添加另一个实体对象
  2. 16. 一对多查询
  3. ```xml
  4. <resultMap id="DeptJoinEmp" type="dept">
  5. <!-- 如果字段是主键,用id,其他用result-->
  6. <id column="DEPTNO" property="deptno" javaType="int" jdbcType="INTEGER"></id>
  7. <result column="DNAME" property="dname"></result>
  8. <result column="LOC" property="loc"></result>
  9. emp 是对象信息
  10. empList是对象属性
  11. <collection property="empList" ofType="emp">
  12. <id column="EMPNO" property="eno" javaType="int" jdbcType="INTEGER"></id>
  13. <result column="ENAME" property="name"></result>
  14. <result column="JOB" property="job"></result>
  15. <result column="MGR" property="mgr"></result>
  16. <result column="HIREDATE" property="hiredate"></result>
  17. <result column="SAL" property="sal"></result>
  18. <result column="COMM" property="comm"></result>
  19. <result column="DEPTNO" property="dno"></result>
  20. </collection>
  21. </resultMap>
  22. <select id="findDeptJoinEmpByDeptNo" resultMap="DeptJoinEmp">
  23. select *
  24. from dept d
  25. left join emp e on d.DEPTNO = e.DEPTNO
  26. where d.DEPTNO = #{deptno}
  27. </select>
  1. 多对多查询 ```xml
    1. <!-- 如果字段是主键,用id,其他用result-->
    2. <id column="pid" property="pid" ></id>
    3. <result column="pname" property="pname"></result>
    4. <result column="money" property="money"></result>
  1. <collection property="projectrecordList" ofType="projectrecord">
  2. <id column="empno" property="empno"></id>
  3. <id column="pid" property="pid"></id>
  1. <association property="emp" javaType="emp">
  2. <id column="EMPNO" property="eno" javaType="int" jdbcType="INTEGER"></id>
  3. <result column="ENAME" property="name"></result>
  4. <result column="JOB" property="job"></result>
  5. <result column="MGR" property="mgr"></result>
  6. <result column="HIREDATE" property="hiredate"></result>
  7. <result column="SAL" property="sal"></result>
  8. <result column="COMM" property="comm"></result>
  9. <result column="DEPTNO" property="dno"></result>
  10. </association>
  11. </collection>
  12. </resultMap>
  13. <select id="findByProjectJoinEmpsByPid" resultMap="projectJoinEmps">
  14. select *
  15. from project p
  16. left join projectrecord pr
  17. on p.pid = pr.pid
  18. LEFT JOIN emp e
  19. on e.EMPNO = pr.EMPNO
  20. where p.pid = 2;
  21. </select>

```