一、简单案例-编写入门程序
1、创建项目,创建一个springboot项目,并引入mybatis依赖
2、依赖支持,在pom文件中主要就是这三个依赖
3、设置springboot数据库链接信息
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=
#连接数据库的密码
spring.datasource.password=
4、根据数据库表创建实体类
5、创建Mapper包
mapper类似于三层架构下面的dao层
创建一个简单的查询
6、利用单元测试测试代码
利用依赖注入的方式来调用接口进行测试
二、配置SQL提示
默认情况下mybatis中编写sql语句是不识别的,可以进行以下设置
1、选中sql语句
2、右键
这样设置后就会提示sql语句,同时在连接数据库的时候可以指定要使用的表,这样idea可以对你进行提示,避免报错。
三、切换数据库连接池
官方默认的连接池为hikari,如果需要切换Druid,首先就需要去pom文件配置
四、lombok
Lombok是一个使用的Java类库,能够通过注解的形式自动生成构造器。。。。,并可以自动化生成日志变量,简化java开发
1、引入依赖
在pom文件中加入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
然后就可以在实体类中取消掉getter setter这些直接使用注解的方式
五、日志输出
可以在application.properties中打开mybatis日志,并输出到控制台
#输入到日志到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
六、mybatis基础操作
占位符 #{ }
执行sql时会生成预编译sql 自动设置参数值
使用时机:参数传递都使用#
占位符 ${ }
拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题
使用时机:如果对表名、列表进行动态设置时使用
6.1、删除
6.2、新增
如果插入的数据过多,可以通过直接插入对象的方式,利用#{}获取对象属性进行插入
6.2.1、主键返回
在某些场景下添加成功后需要获取刚插入的主键,例如点外卖时候添加购物车功能
@Options(keyProperty = "id",useGeneratedKeys = true)
将自动生成的主键值,赋值给对象的id属性
6.3、更新
6.4、查询
使用这个可能会导致你没有查询的字段为null,可以使用@Results,手动映射封装(不太推荐)
也可以使用mybatis自带的驼峰命名自动映射开关(推荐)
需要再application.properties中配置
#开启驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
6.4.1、条件查询
根据自己的开发需求来进行模糊匹配或者精确匹配
‘%${name}%’ 不建议这样使用,利用content进行字符拼接防止sql注入
七、XML映射文件
规范
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
- XML映射文件的namespace属性为Mapper接口全限定名一致。
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
7.1、配置过程
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
与mapper结构和名字一致,在xml里面写上规范
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>
</mapper>
XML映射文件的namespace属性为Mapper接口全限定名一致。
<mapper namespace="com.example.crudtest.mapper.EmpMapper">
</mapper>
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
八、动态SQL
随着用户的输入或者外部条件变换而变化的sql
8.1、if标签
用于判断条件是否成立,用test属性进行条件判断
<if test="name !=null">
name like concat('%', #{name}, '%')
</if>
8.2、where标签
用于在子元素中有内容的时候出现,会自动去除子句中的and或者or
<where>
<if test="name !=null">
name like concat('%', #{name}, '%')
</if>
<if test="gender !=null">
and gender = #{gender}
</if>
<if test="begin !=null and end != null">
and entrydate between #{begin} and #{end}
</if>
</where>
8.3、set标签
动态地在行首插入SSET关键字,并会删除额外的逗号。(update语句中)
update emp
<set>
<if test="username!=null">username = #{username},</if>
<if test="name !=null">name = #{name},</if>
<if test="gender !=null">gender = #{gender},</if>
<if test="image !=null">image = #{image},</if>
<if test="job !=''">job = #{job},</if>
<if test="entrydate !=null">entrydate = #{entrydate},</if>
<if test="deptId !=null">dept_id = #{deptId},</if>
<if test="updateTime !=null">update_time = #{updateTime}</if>
</set>
where id = #{id}
8.4、foreach标签
用于批量操作
<!--批量删除
-->
<!--
collection:遍历的集合
item:遍历出来的元素
separator:分隔符
open:遍历开始前凭借的sql片段
close:遍历结束后拼接的片段
-->
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="list" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
注意这里的需要写成list,, mybatis 会把这个集合参数重新封装到一个 map中, 而 map 中这个集合对应的key 写死成了 list.
8.5、sql标签
用于查询出复用的表id字段
<sql id="commonSelect">
select id,username,password,name,gender,image,job,entrydate,dept_id,create_time,update_time
from emp
</sql>
将查出来的字段封装到commonSelect
在需要使用的地方使用include引入
<include refid="commonSelect"></include>