项目中使用到了MyBatis框架,使用通用Mapper和PageHelper分页插件将极大的简化我们的操作。通用Mapper可以简化对单表的CRUD操作,PageHelper分页插件可以帮我们自动拼接分页SQL,并且可以使用MyBatis Geneator来自动生成实体类,Mapper接口和Mapper xml代码,非常的方便。插件地址及作者链接 https://gitee.com/free
一:引入依赖
(注意:踩过的坑,mybits和PageHelper版本需对应,否则运行报错)
创建最新的springboot 2.0.3版本,选择web,thymeleaf,mysql,mybits,jdbc插件创建,pom.xml依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.5</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- mybits自动生成实体 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
自动生成插件:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- mybatis generator 自动生成代码插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.5</version>
</dependency>
</dependencies>
<configuration>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!-- 自动生成的配置 -->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
</plugin>
</plugins>
通用Mapper关于参数的说明,参考https://gitee.com/free/Mapper/blob/master/wiki/mapper3/2.Integration.md中的可配参数介绍。
除此之外,我们需要定义一个MyMapper接口:
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface MyMapper <T> extends Mapper<T>, MySqlMapper<T>{
}
在Spring Boot配置文件application.yml中配置MyBatis+PageHelper+通用Mapper:
server:
port: 8080
spring:
datasource:
name: test
url: jdbc:mysql://127.0.0.1:3306/jhpay
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapping/*.xml
type-aliases-package: com.dl.model
property:
order: BEFORE
#mappers 多个接口时逗号隔开
mapper:
mappers: com.dl.config.MyMapper
not-empty: false
identity: mysql
#pagehelper分页插件
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
配置Geneator:在路径src/main/resources/下新建generatorConfig.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>
<!--指定了驱动jar包的位置,我用的是mysql -->
<classPathEntry
location="E:/profilm/apache-maven-3.5.4/repository/mysql/mysql-connector-java/5.1.46/mysql-connector-java-5.1.46-sources.jar" />
<context id="mysql" targetRuntime="MyBatis3">
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<!-- 该配置会使生产的Mapper自动继承MyMapper -->
<property name="mappers" value="com.dl.config.MyMapper" />
<!-- caseSensitive默认false,当数据库表名区分大小写时,可以将该属性设置为true -->
<property name="caseSensitive" value="false"/>
</plugin>
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/jhpay" userId="root" password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.dl.bean" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.dl.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="jh_account" domainObjectName="jhAccount" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
代码生成
配置好MyBatis Geneator后,在eclipse中运行Maven build 运行命令mybatis-generator:generate
Mapper
生成代码之后,要让Spring Boot扫描到Mapper接口,需要在Spring Boot入口类中加@MapperScan("com.dl.dao")
注解。
通用Service
我们可以定义一个通用的Service,在其中定义一些通用的方法:
IService:
import java.util.List;
import org.springframework.stereotype.Service;
@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 java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;
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);
}
/**
* 保存一个实体,null的属性也会保存,不会使用数据库默认值
*/
@Override
public int save(T entity) {
// 说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
return mapper.insert(entity);
}
/**
* 根据主键字段进行删除,方法参数必须包含完整的主键属性
*/
@Override
public int delete(Object key) {
// 说明:根据主键字段进行删除,方法参数必须包含完整的主键属性
return mapper.deleteByPrimaryKey(key);
}
/**
* 根据主键更新实体全部字段,null值会被更新
*/
@Override
public int updateAll(T entity) {
// 说明:根据主键更新实体全部字段,null值会被更新
return mapper.updateByPrimaryKey(entity);
}
/**
* 根据主键更新属性不为null的值
*/
@Override
public int updateNotNull(T entity) {
// 根据主键更新属性不为null的值
return mapper.updateByPrimaryKeySelective(entity);
}
/**
* 这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
*/
@Override
public List<T> selectByExample(Object example) {
// 说明:根据Example条件进行查询
// 重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
return mapper.selectByExample(example);
}
}
接下来让AccountService接口继承IService接口:
public interface AccountService extends IService<jhAccount>{
}
其实现类AccountServiceImpl:
@Repository("accountService")
public class AccountServiceImpl extends BaseService<jhAccount> implements AccountService{
}
这样即可在AccountService中使用BaseService中的通用方法。
Example example = new Example(jhAccount.class);
example.createCriteria().andCondition("username like '%i%'");
example.setOrderByClause("id desc");
List<jhAccount> userList = this.userService.selectByExample(example);
for (jhAccount u : userList) {
System.out.println(u.getUsername());
}
List<jhAccount> all = this.userService.selectAll();
for (User u : all) {
System.out.println(u.getUsername());
}
jhAccount user = new jhAccount();
user.setId(1l);
user = this.userService.selectByKey(user);
System.out.println(user.getUsername());
测试删除:
jhAccount user = new jhAccount();
user.setId(4l);
this.userService.delete(user);
分页测试,从第二页开始,每页2条数据:
PageHelper.startPage(2, 2);
List<jhAccount> list = accountService.selectAll();
PageInfo<jhAccount> pageInfo = new PageInfo<jhAccount>(list);
List<jhAccount> result = pageInfo.getList();
for (jhAccount u : result) {
System.out.println(u.getUsername());
}
插件已经帮我自动拼接好了。
其他注意事项参考官方说明。