MyBatis是一个半自动ORM框架,其本质是对JDBC的封装。使用MyBatis重点需要程序员编写SQL命令,不需要写一行JDBC代码。
Mybatis官网
1. 原生的JDBC实现CURD的问题
- 编码繁琐
- 需要我们自己将结果集映射成对象
- 性能不太好,连接池,缓存配置麻烦
-
2. 如何使用MyBatis
引入jar包
<!-- 1. mysqlConnector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 2. mybatis 核心jar包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
idea中安装Lombok插件和MyBatisX插件。
- idea设置配置,该设置是针对项目进行设置的,不同项目都需要进行该操作。
- 准备Mapper映射文件和核心配置文件
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
在官网中找到XML文件的内容,复制到项目model中resources目录下sqlMapConfig.xml中(当然也有可能不叫sqlMapConfig.xml)
项目目录结构图如下:
注意:
- resources目录下的文件夹要分层级创建,不要com.yin.mapper直接创建出来。
- *Mapper.xml对应一个接口,所以不同的*Mapper.xml中namespace的值不能相同。
项目编译编译以后*Mapper.xml和*Mapper是在同一个目录下。
**Mapper.xml文件解析
id里面的值是对应Java接口文件中的方法名。
- parameterType里面的值是对应Java接口文件中参数的类型。
- resultType对应的是SQL语句返回值的类型。
多个参数,如果放到指定的位置- arg* arg0 arg1 arg2
- param* param1 param2 param3
- 给参数起别名,在接口中为参数添加 @Param(“*“)
如果使用了第三种方式,那么就不支持第一种方式,但是支持第二种方式**
参数是Map的形式,{}里面写map中的key。参数如果是对象的形式,{}里面写对象的属性。参数是多个引用数据类型,param 或 arg 加上. 把属性带出来。参数是多个引用数据类型,也可以使用别名的形式.使用别名的话,arg无法使用,但是param可以正常使用。
- 参数使用别名只需要在Java接口文件中,在对应接口方法的参数中加上@Param注解。
- 模糊查询中的%,可以在传参数的是时候就带上,也可以在SQL语句中使用concat函数去拼接。
- useGeneratedKeys 关键字(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键。默认值是false。
首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性(就是对应自增字段名称)就 OK 了。 - where 标签可以处理and问题,不用加1=1的条件了。
- choose标签和when标签的作用是如果第一个判断为true,后面的判断不会再执行。
- 使用set标签以后,SQL语句中不用再加set关键字了,同时也会干掉第一个逗号。
- prefix 是动态要添加的前缀(即trim标签中第一个符合的字符)
prefixOverrides 是要删除的前缀(即trim标签中第一个符合的字符)
suffix 是要补充的后缀(即trim标签中最后一个符合的字符)
suffixOverrides 是要删除的后缀(即trim标签中最后一个符合的字符)。
- bind标签可以在xml文件中去定义key,value是value标签中的值
- 定义公共SQL,可以让当前xml文件使用该公共SQL。
```xml
empno ,ename,job,mgr,hiredate,sal,comm,deptno
13. SQL语句带in查询
```xml
<!--collection 遍历的集合或者数组
separator 多个元素取出的时候 使用什么文字分隔
open 以什么文字开头
close 以什么文字结尾
item 中间变量名称-->
<!-- arrayList方式-->
<select id="findByEmpnos" resultType="emp">
select * from emp where empno in
<foreach collection="list" separator="," open="(" close=")" item="eno">
#{eno}
</foreach>
</select>
<!-- int[] 方式-->
<select id="findByEmpnos2" resultType="emp">
select * from emp where empno in
<foreach collection="array" separator="," open="(" close=")" item="eno">
#{eno}
</foreach>
</select>
xml文件定义实体类和数据库表映射关系 ```xml
<select id="findAll" resultMap="empResultMap">
select *
from emp
</select>
15. 一对一查询<br />一对多的查询,需要在查询出来的实体对象中添加另一个实体对象
16. 一对多查询
```xml
<resultMap id="DeptJoinEmp" type="dept">
<!-- 如果字段是主键,用id,其他用result-->
<id column="DEPTNO" property="deptno" javaType="int" jdbcType="INTEGER"></id>
<result column="DNAME" property="dname"></result>
<result column="LOC" property="loc"></result>
emp 是对象信息
empList是对象属性
<collection property="empList" ofType="emp">
<id column="EMPNO" property="eno" javaType="int" jdbcType="INTEGER"></id>
<result column="ENAME" property="name"></result>
<result column="JOB" property="job"></result>
<result column="MGR" property="mgr"></result>
<result column="HIREDATE" property="hiredate"></result>
<result column="SAL" property="sal"></result>
<result column="COMM" property="comm"></result>
<result column="DEPTNO" property="dno"></result>
</collection>
</resultMap>
<select id="findDeptJoinEmpByDeptNo" resultMap="DeptJoinEmp">
select *
from dept d
left join emp e on d.DEPTNO = e.DEPTNO
where d.DEPTNO = #{deptno}
</select>
- 多对多查询
```xml
<!-- 如果字段是主键,用id,其他用result-->
<id column="pid" property="pid" ></id>
<result column="pname" property="pname"></result>
<result column="money" property="money"></result>
<collection property="projectrecordList" ofType="projectrecord">
<id column="empno" property="empno"></id>
<id column="pid" property="pid"></id>
<association property="emp" javaType="emp">
<id column="EMPNO" property="eno" javaType="int" jdbcType="INTEGER"></id>
<result column="ENAME" property="name"></result>
<result column="JOB" property="job"></result>
<result column="MGR" property="mgr"></result>
<result column="HIREDATE" property="hiredate"></result>
<result column="SAL" property="sal"></result>
<result column="COMM" property="comm"></result>
<result column="DEPTNO" property="dno"></result>
</association>
</collection>
</resultMap>
<select id="findByProjectJoinEmpsByPid" resultMap="projectJoinEmps">
select *
from project p
left join projectrecord pr
on p.pid = pr.pid
LEFT JOIN emp e
on e.EMPNO = pr.EMPNO
where p.pid = 2;
</select>
```