MyBatis基础
入门基础
MyBatis :一款优秀的框架,用于简化JDBC的开发。应用于DAO层
- 实体类的属性最好用包装类
配置数据库连接信息的四要素代码
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=数据库密码
MyBatis的入门步骤
- 创建Spring Boot 工程、数据库表,实体类
- 引入Mabatis的相关依赖,配置Mybatis(数据库连接信息)
- 编写Sql语句(通过注解的方式)创建一个接口,接口上加@Mapper注解,会自动生成接口的实现类对象,并将该对象交给IOC容器管理
JDBC
Java DataBase Connectivity
就是使用java语言操作关系型数据库的一套API
- 各个厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC 开发代码过于繁琐,开发效率低下,所以不使用,仅了解
记录第一个Mapper程序
@Mapper//在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理,这样就可以在其他类中通过@Autowired注解实现这个接口
public interface UserMapper {
@Select("select * from user")//将从user数据表中的数据查询再封装到User类中,表中字段与类的属性一一对应
public List<User> list();//抽象方法
}
数据库连接池
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许程序复用现有的数据库的连接,而不是重新创建一个
- 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
优势
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
lombok
了解就好,添加相关注解可以减少代码量更美观,但是难以修改维护,ptg插件可一键生成
Mybatis 基础操作CRUD
delete
@Mapper
public interface EmpMapper {
@Delete("delete from emp where id=#{id}")
public void delete(Integer id);
}
#{…}占位符,可以接收可变的数据传输,为提高可读性,{}里面的属性应与形参名相同
占位符里面的属性名一定要与实体类的属性名完全一样!!!
测试代码
@Autowired
private EmpMapper empMapper;
@Test
public void testDelete()
{
empMapper.delete(17);
}
#{…}占位符还可以预编译sql,性能更高,使用预编译sql可以使缓存区不需要反复重建,可以防止sql注入
不要使用${…},会存在sql注入问题,改变原先的sql语句
新增
代码
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)"+
"values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptid},#{creatTime},#{updateTime})")
//新增员工
public void insert(Emp emp);
注意
- value占位符李的字段名要与实体类的属性名完全一样,不然无法运行
主键返回
注解代码
@Options(useGeneratedKeys = true,keyProperty="id")//id为指定封装进bean类的某个属性
会自动将生成的主键值赋给emp对象的id属性,id是自增的,没有人为赋值
更新
更新的代码
@Update("update emp set username=#{username},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate}," +
"dept_id=#{deptid},update_time=#{updateTime} where id=#{id}")
//修改员工
public void update (Emp emp);
修改的id通过实体类的setId方法进行修改
查询操作
如果类中的属性名与表中的字段名不一致就不会返回具体的数据.而是返回null
三种解决方法
条件查询
//条件查询
@Select("select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and " +
" entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name,Short gender , LocalDate begin,LocalDate end);
因为#{…}不能直接放到%…%之间,所以需要使用contact()函数进行拼接
XML映射文件
通过配置XML文件实现sql语句,之前是通过注解来实现
规范
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mpper接口放置在相同的包名下(同包同名)
- XML映射文件的namespace属性为Mapper接口全限定名一致
- XML 映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
具体见下图
xml文件的约基本机构,包括官方约束
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itsen.springbootmybatiscrud.mapper.EmpMapper">
</mapper>
mapper配置代码
<mapper namespace="com.itsen.springbootmybatiscrud.mapper.EmpMapper">
<!-- resultType单条记录所封装的类型就是只封装类的全类名-->
<select id="list" resultType="com.itsen.springbootmybatiscrud.pojo.Emp">
select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and
entrydate between #{begin} and #{end} order by update_time desc
</select>
</mapper>
通过配置xml映射文件,久不需要在接口方法上添加注解
注解和XML文件两种方式的选择
使用Mybatis的注解,主要是来完成一些简单的增删改查功能.如果要实现复杂的SQL功能,建议使用XML来配置SQL语句
动态SQL
if where标签
当客户端要求值需要使用所有条件中的某几个条件进行查询时,就需要使用if语句,对传入的条件不为空的进行查询,查询语句用标签进行包裹,就会自动过滤语句中的and或者是or
代码例子
<select id="list" resultType="com.itsen.springbootmybatiscrud.pojo.Emp">
select *
from emp
<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>
order by update_time desc
</select>
标签动态地在行首插入SET关键字,并会删掉额外的逗号(用在update语句中)
foreach标签
按照员工id遍历删除员工信息的xml配置代码
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
- collection:需要遍历的集合
- item: 遍历出来的元素,一般写成删除依据的字段名
- separate: 分隔符
- open: sql语句中遍历开始前拼接的sql片段
- close: 遍历结束后拼接的sql片段
sql include 标签
将一些通用的sql片段用标签包裹,需要时,用来进行引用对应的sql片段用于提高代码的复用性,便于维护
以上就是Mybatis的基本操作了,主要包括简单的基于注解或者XML映射文件的CRUD和动态sql的标签
pageHelper分页插件
了解,想用也可以
依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
操作步骤