- 一、整合MyBatis
- 1.创建pom.xml
- 2.application.properties配置文件
- 3.数据类User
- 4.定义所使用的Mapper组件的接口
- 5.UserMapper组件的测试用例类
- 二、直接使用SqlSession
- 1.数据类User
- 2.DAO组件的接口
- 3.UserDaoImpl实现类
- 4.UserMapper.xml
- 5.application.properties
- 6.UserDao组件的测试用例类
- 三、Springboot整合MyBatis-plus框架
SpringBoot整合Mybatis相关博文:
- Springboot整合Mybatis框架
MyBatis只需要定义Mapper接口,MyBatis就能动态地为Mapper生成实现类,这些Mapper组件就相当于DAO组件。
当MyBatis整合SpringBoot时,Spring容器会负责生成Mapper组件,并能将Mapper组件注入其他组件(如Service组件)
SpringBoot识别Mapper方式:
- 为每个Mapper接口添加@Mapper注解即可
继承spring-boot-starter-parent,并添加mybatis-spring-boot-starter.jar依赖。本例使用SpringBoot的测试支持测试DAO组件,添加spring-boot-starter-test.jar依赖。
2.application.properties配置文件4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.2 org.crazyit mybatis 1.0-SNAPSHOT mybatis UTF-8 11 org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.4 mysql mysql-connector-java org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools true org.springframework.boot spring-boot-maven-plugin
# 数据库驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 数据库URL spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC # 连接数据库的用户名 spring.datasource.username=root # 连接数据库的密码 spring.datasource.password=32147 # 指定HikariCP最大连接数为20 spring.datasource.hikari.maximum-pool-size=20 # 为Mapper组件指定日志级别为DEBUG,用于输出Mapper组件执行的SQL语句 logging.level.org.crazyit.app.dao=debug3.数据类User
mybatissrcmainjavaorgcrazyitappdomainUser.java
public class User
{
private Integer id;
private String name;
private String password;
private int age;
public User(){}
public User(String name, String password, int age)
{
this.name = name;
this.password = password;
this.age = age;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@Override
public String toString()
{
return "User{" +
"id=" + id +
", name='" + name + ''' +
", password='" + password + ''' +
", age=" + age +
'}';
}
}
4.定义所使用的Mapper组件的接口
import java.util.List;
import org.apache.ibatis.annotations.*;
import org.crazyit.app.domain.User;
@Mapper
public interface UserMapper
{
@Select(value="select user_id id, name, password, age from " +
"user_inf where user_id = #{b}")
User get(Integer id);
@Insert("insert into user_inf values "
+ "(null, #{name}, #{password}, #{age})")
int save(User user);
@Update("update user_inf set name=#{name}, "
+ "password=#{password} where user_id=#{id}")
int update(User user);
@Delete("delete from user_inf where user_id=#{a}")
int delete(Integer id);
@Select("select user_id id, name, password, age from " +
"user_inf where age between #{startAge} and #{endAge}")
List findByAgeBetween(int startAge, int endAge);
@Select(value="select user_id id, name, password, age from " +
"user_inf where name like #{name}")
List findByNameLike(String name);
}
- 上面的Mapper组件添加了@Mapper注解修饰,这样Spring就能识别出它是Mapper组件,从而在Spring容器中创建该Mapper组件,并能将该Mapper组件注入其他任何组件(比如Service组件)
- 上面Mapper接口用到了@Insert、@Update、@Delete、@Select等注解,都属于MyBatis本身的用法。
- MyBatis的Mapper组件其实就相当于DAO组件,当SpringBoot为这些Mapper接口生成Mapper组件之后,SpringBoot自然能将它们注入Service组件,当然也能注入测试用例。
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.crazyit.app.domain.User;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserMapperTest
{
@Autowired
private UserMapper userMapper;
@ParameterizedTest
@ValueSource(ints = {3, 4})
public void testGet(Integer id)
{
System.out.println(userMapper.get(id));
}
@ParameterizedTest
@CsvSource({"fkjava, fkjava123, 23", "crazyit, crazyit23, 24"})
public void testSave(String name, String password, int age)
{
var user = new User(name, password, age);
System.out.println("受影响的记录条数:" + userMapper.save(user));
}
@ParameterizedTest
@CsvSource({"3, foo", "4, bar"})
public void testUpdate(Integer id, String name)
{
var user = userMapper.get(id);
user.setName(name);
System.out.println("受影响的记录条数:" + userMapper.update(user));
}
@ParameterizedTest
@ValueSource(ints = {1, 2})
public void testDelete(Integer id)
{
System.out.println("受影响的记录条数:" + userMapper.delete(id));
}
@ParameterizedTest
@CsvSource({"18, 20", "22, 25"})
public void testFindByAgeBetween(int startAge, int endAge)
{
userMapper.findByAgeBetween(startAge, endAge).forEach(System.out::println);
}
@ParameterizedTest
@ValueSource(strings = {"玉面%", "白%"})
public void testFindByNameLike(String name)
{
userMapper.findByNameLike(name)
.forEach(System.out::println);
}
}
- 上面测试用例类的各测试方法依次测试了UserMapper组件的每个数据访问方法
- 执行UserMapper中的get()方法,就是执行该方法上@Select注解指定的SQL指定的SQL查询语句的效果。
Mybatis会自动在Spring容器中配置SqlSession(其实是SqlSessionTemplate实现类),并能将它注入其他组件(如DAO组件),DAO组件就能直接调用SqlSession的方法来操作数据库。
public class User
{
private Integer id;
private String name;
private String password;
private int age;
public User(){}
public User(String name, String password, int age)
{
this.name = name;
this.password = password;
this.age = age;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@Override
public String toString()
{
return "User{" +
"id=" + id +
", name='" + name + ''' +
", password='" + password + ''' +
", age=" + age +
'}';
}
}
2.DAO组件的接口
import java.util.List;
import org.apache.ibatis.annotations.*;
import org.crazyit.app.domain.User;
public interface UserDao
{
int delete(Integer id);
List findByAgeBetween(int startAge, int endAge);
}
- 本例需要自行使用SqlSession来实现所有的Dao方法,这里只为DAO接口定义两个方法,接下来在DAO组件实现类中使用SqlSession实现这些方法即可。
- 此处的DAO组件就相当于前一个示例的Mapper组件,只不过该DAO组件的接口没有使用任何注解修饰。
- 接下来为该DAO接口编写实现类,该实现类需要实现接口中的每一个方法——使用SqlSession来操作数据库。
import org.apache.ibatis.session.SqlSession;
import org.crazyit.app.dao.UserDao;
import org.crazyit.app.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public class UserDaoImpl implements UserDao
{
@Autowired
private SqlSession sqlSession;
@Override
public int delete(Integer id)
{
return sqlSession.delete("org.crazyit.app.dao.UserMapper.delete", id);
}
@Override
public List findByAgeBetween(int startAge, int endAge)
{
return sqlSession.selectList("org.crazyit.app.dao.UserMapper.findByAgeBetween",
Map.of("startAge", startAge, "endAge", endAge));
}
}
- 从上面的方法实现来看,程序调用SqlSession操作数据库非常简单,调用SqlSession的insert()、update()、delete()来执行DML语句,调用selectList()或selectOne()来执行查询语句,这种用法是MyBatis最简单的也是最传统的用法
- SqlSession调用insert()、update()、delete()、selectList()、selectOne()执行SQL语句时,如果SQL语句中没有占位符参数,就只需要传入第一个参数——该参数代表要执行的SQL语句。如果要执行的SQL语句中带一个占位符参数,那么就传入第2个参数——该参数用于为SQL语句中的占位符参数设置值。如果要执行的SQL语句中带多个占位符参数,那么第2个参数可使用Map来传入多个值。
上面程序中的sqlSession调用delete()、selectList()方法的第1个参数并不是SQL语句本身,而是来自XML Mapper定义这些SQL语句。
delete from user_inf where user_id=#{a}
- 上面XML Mapper的作用就是定义SQL语句,并为SQL语句指定id。
- 在指定了id属性之后,接下来MyBatis组件即可通过"namespace+id"的形式来引用这些SQL语句—如UserDaoImpl实现类中的代码所示。
- 在定义了UserMapper.xml之后,还要告诉SpringBoot到哪个路径下加载XML Mapper文件。
- 因此,本例在application.properties文件中增加如下两行。
# 数据库驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 数据库URL spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC # 连接数据库的用户名 spring.datasource.username=root # 连接数据库的密码 spring.datasource.password=32147 # 指定HikariCP最大连接数为20 spring.datasource.hikari.maximum-pool-size=20 # 为Mapper组件指定日志级别为DEBUG,用于输出Mapper组件执行的SQL语句 logging.level.org.crazyit.app.dao=debug #=========================================== # 设置Mapper XML配置文件的位置 mybatis.mapper-locations=classpath*:org/crazyit/app/dao/*.xml # 设置为指定包下所有类型分配别名 mybatis.type-aliases-package=org.crazyit.app.domain6.UserDao组件的测试用例类
sqlsessionsrctestjavaorgcrazyitappdaoUserDaoTest.java
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.crazyit.app.domain.User;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserDaoTest
{
@Autowired
private UserDao userDao;
@ParameterizedTest
@ValueSource(ints = {1, 2})
public void testDelete(Integer id)
{
System.out.println("受影响的记录条数:" + userDao.delete(id));[添加链接描述](https://blog.csdn.net/zhengzaifeidelushang/article/details/115166913?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163310456816780269872437%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163310456816780269872437&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-11-115166913.pc_v2_rank_blog_default&utm_term=mybatis&spm=1018.2226.3001.4450)
}
[添加链接描述](https://blog.csdn.net/zhengzaifeidelushang/article/details/115275360?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163310456816780269872437%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163310456816780269872437&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-10-115275360.pc_v2_rank_blog_default&utm_term=mybatis&spm=1018.2226.3001.4450)
@ParameterizedTest
@CsvSource({"18, 20", "22, 25"})
public void testFindNameByAgeBetween(int startAge, int endAge)
{
userDao.findByAgeBetween(startAge, endAge).forEach(System.out::println);
}
}
测试用例类的各测试方法依次测试了UserDao组件的两个数据访问方法。
三、Springboot整合MyBatis-plus框架SpringBoot整合MyBatis-plus相关博客:
- Springboot整合MyBatis-plus:完整代码
- Springboot整合MyBatis-plus
- Springboot整合MyBatis-plus:单条数据删除、批量删除、条件删除、逻辑删除
- Springboot整合MyBatis-plus:数据库增删改查
- Springboot整合MyBatis-plus:单条数据查询,批量查询,条件查询,分页查询
- Springboot整合MyBatis-plus:代码生成器
- Springboot整合MyBatis-plus:日志配置查看SQL执行过程
- Springboot整合MyBatis-plus:数据库主键生成策略
- Springboot整合MyBatis-plus:乐观锁和悲观锁
- Springboot整合MyBatis-plus:条件构造器
- Springboot整合MyBatis-plus:自动填充时间字段



