- 通用Mapper可以简化对单表的CRUD操作
- PageHelper分页插件可以帮我们自动拼接分页SQL
1.引入依赖
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
<!-- 引入mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
2.配置文件
2.1 pom.xml
注意版本,过高可能会报错,不要改动版本
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<!-- mybatis自动生成代码-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
</dependencies>
<configuration>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!-- 自动生成的配置 -->
<configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
</configuration>
</plugin>
2.2 application.yml
# 配置mybatis
mybatis:
# type-aliases扫描路径
type-aliases-package: com.springboot.bean
# mapper xml实现扫描路径
mapper-locations: classpath:mapper/*.xml
property:
order: BEFORE
#mappers 多个接口时逗号隔开
mapper:
mappers: com.suruomo.springboot10mybatis.config.MyMapper
not-empty: false
identity: mysql
#pagehelper
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
#数据源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: suruomo
url: jdbc:mysql://127.0.0.1:3306/demo
2.3 mybatis-generator.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包,路径不要出现中文-->
<classPathEntry
location="D:\Java\MAVEN\maven_repository\mysql\mysql-connector-java\5.1.34\mysql-connector-java-5.1.34.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<!-- 该配置会使生产的Mapper自动继承MyMapper -->
<property name="mappers" value="com.suruomo.springboot10mybatis.config.MyMapper"/>
<!-- caseSensitive默认false,当数据库表名区分大小写时,可以将该属性设置为true -->
<!-- <property name="caseSensitive" value="false"/>-->
</plugin>
<commentGenerator>
<property name="javaFileEncoding" value="UTF-8"/>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="trur"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/demo?useUnicode=true" userId="root"
password="suruomo">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.suruomo.springboot10mybatis.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.suruomo.springboot10mybatis.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="true"></table>
</context>
</generatorConfiguration>
3.自动执行生成代码
生成UserMapper+User+UserMapper.xml
插件执行
4.代码
4.1 创建Mapper接口
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* @author suruomo
* @date 2020/7/29 10:18
* @description: 该接口不能被扫描到,应该和自己定义的Mapper分开。自己定义的Mapper都需要继承这个接口。
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
4.2 让生成的UserMapper接口继承MyMapper接口
@Mapper
public interface UserMapper extends MyMapper<User> {
}
4.3 创建公共Service
IService接口:
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author suruomo
* @date 2020/7/29 13:26
* @description:
*/
@Service
public interface IService<T> {
List<T> selectAll();
T selectByKey(Object key);
int save(T entity);
int delete(Object key);
int updateAll(T entity);
int updateNotNull(T entity);
List<T> selectByExample(Object example);
实现类BaseService:
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
/**
* @author suruomo
* @date 2020/7/29 13:26
* @description:
*/
public class BaseService<T> implements IService<T> {
@Autowired
protected Mapper<T> mapper;
public Mapper<T> getMapper() {
return mapper;
}
@Override
public List<T> selectAll() {
//说明:查询所有数据
return mapper.selectAll();
}
@Override
public T selectByKey(Object key) {
//说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
return mapper.selectByPrimaryKey(key);
}
@Override
public int save(T entity) {
//说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
return mapper.insert(entity);
}
@Override
public int delete(Object key) {
//说明:根据主键字段进行删除,方法参数必须包含完整的主键属性
return mapper.deleteByPrimaryKey(key);
}
@Override
public int updateAll(T entity) {
//说明:根据主键更新实体全部字段,null值会被更新
return mapper.updateByPrimaryKey(entity);
}
@Override
public int updateNotNull(T entity) {
//根据主键更新属性不为null的值
return mapper.updateByPrimaryKeySelective(entity);
}
@Override
public List<T> selectByExample(Object example) {
//说明:根据Example条件进行查询
//重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
return mapper.selectByExample(example);
}
}
4.4 创建自定义Service
UserService接口:
import com.suruomo.springboot10mybatis.model.User;
import com.suruomo.springboot10mybatis.service.common.IService;
/**
* @author suruomo
* @date 2020/7/29 13:30
* @description:
*/
public interface UserService extends IService<User> {
}
实现类:
import com.suruomo.springboot10mybatis.mapper.UserMapper;
import com.suruomo.springboot10mybatis.model.User;
import com.suruomo.springboot10mybatis.service.common.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
/**
* @author suruomo
* @date 2020/7/29 13:31
* @description:
*/
@Repository("userService")
public class UserServiceImpl extends BaseService<User> implements UserService{
}
4.5 测试
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.suruomo.springboot10mybatis.model.User;
import com.suruomo.springboot10mybatis.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 测试
*/
@SpringBootTest
class Springboot10MybatisApplicationTests {
@Resource
private UserService userService;
/**
* 通用mapper的插入测试
*/
@Test
void save() {
User user = new User();
user.setUserId("susu");
user.setUserName("suruomo");
user.setEmail("1232@qq.com");
user.setSex("1");
user.setPassword("xMpCOKC5I4INzFCab3WEmw==");
userService.save(user);
}
/**
* 通用mapper的删除测试
*/
@Test
void delete() {
User user = new User();
user.setUserId("susu");
this.userService.delete(user);
}
/**
* 通用mapper的查询单个测试
*/
@Test
void select(){
String userId="a";
System.out.println(userService.selectByKey(userId).getEmail());
}
/**
* 通用mapper的查询全部测试
*/
@Test
void selectAll(){
List<User> list=new ArrayList<>();
list=userService.selectAll();
for(User user:list){
System.out.println(user.getUserId());
}
}
/**
* 通用mapper的example自定义查询
*/
@Test
void selectByExample(){
Example example = new Example(User.class);
example.createCriteria().andCondition("user_name like '%a%'");
List<User> userList = this.userService.selectByExample(example);
for (User u : userList) {
System.out.println(u.getUserName());
}
}
/**
* 通用mapper的更改
*/
@Test
void updateAll(){
User user=userService.selectByKey("zxc");
user.setLoginIp("127.0.0.1");
userService.updateAll(user);
}
/**
* 分页查询
*/
@Test
void selectByPage(){
PageHelper.startPage(1 ,2);
List<User> list = userService.selectAll();
PageInfo<User> pageInfo = new PageInfo<User>(list);
List<User> result = pageInfo.getList();
for (User u : result) {
System.out.println(u.getUserName());
}
}
/**
* 自定义mapper查询
*/
@Test
void selectByUserName(){
String userName="b";
System.out.println(userService.selectByUserName(userName));
}
}