配置之前请注意版本问题
最近公司在用的技术,是国内的大神写的Mybatis插件,我自己也尝试搭了一个小demo,搭起来也不复杂,但也有一些坑要注意一下
首先介绍一下这两项技术:Mapper与Pagehelper,
Mapper:通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。极其方便的使用MyBatis单表的增删改查。支持单表操作,不支持通用的多表联合查询。通用 Mapper 支持 Mybatis-3.2.4 及以上版本。(此段来自官方文档)
Pagehelper:Pagehelper是一个非常好用的分页插件,配合前端的数据表格,简直不要太爽,只需填好分页参数,在你使用查询的时候就会有拦截器拦截,添加分页的通用逻辑,并且无视数据库,只需配好数据库方言。
插件开源地址为:https://github.com/abel533
注意:本文只介绍搭建的步骤,如需实现原理请移步该作者的个人网站
创建表:非常简单只有两个字段
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`stu_id` int(11) PRIMARY KEY AUTO_INCREMENT,
`stu_name` varchar(20) NOT NULL
);
项目结构:去掉了一些不相关代码,只保留了基本的数据访问层,使用junit测试接口,整个项目非常简洁.
pom文件:
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF8
1.8
org.springframework.boot
spring-boot-starter-web
com.alibaba
fastjson
1.2.15
mysql
mysql-connector-java
5.1.40
com.alibaba
druid
1.1.9
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0
tk.mybatis
mapper-spring-boot-starter
1.2.3
com.github.pagehelper
pagehelper
4.1.6
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0
org.projectlombok
lombok
provided
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
properties文件:
########################################################
###datasource -- mysql
########################################################
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/studentdb
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
# Mybatis
mybatis.typeAliasesPackage=com.zhanghui.entity
mybatis.mapperLocations=classpath:mapper/*.xml
创建实体类:了解hibernate看这注解看起来是不是很熟悉,hibernate是面向对象的CRM框架嘛,所以需要实体类跟表进行映射,通用Mapper生成的SQl语句也需要知道你实体类字段对应表的那个字段从而生成SQl语句,所以需要这些注解,也可以使用@NameStyle进行规则映射,比如使用"驼峰转下划线大写形式",实体类字段为"stuName",则认为你的表字段为"stu_name"
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import lombok.Data;
@Data//lombok,可以省略set,get等常用方法
@Table(name="student")//对应数据库表名
public class Student {
@Id//表明此列为主键
@Column(name="stu_id")//数据库的字段名
@GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成规则,当你使用它的添加方法时会用到
private Integer id;
@Column(name="stu_name")
private String name;
@Transient//忽略该字段,也就是该字段在表中不存在
private String clazz;
}
创建StudentMapper接口:因为我们使用通用Mapper提供的方法,所以你不需要写实现,你会发现继承了一个BaseMapper的接口,不着急,后面会讲到,如果你需要一些自定义的方法,原来怎么写现在一样的写,没有任何变化
import com.zhanghui.config.BaseMapper;
import com.zhanghui.entity.Student;
public interface StudentMapper extends BaseMapper{
}
创建StudentMapper映射文件:因为上面没有编写方法,所以这里自然也不需要写实现,写映射文件的目的是为了Mybatis能生成对应的实现类
创建BaseMapper:通过源码可以看到这些接口的顶级接口最后又被分为增删改查四大类,所以上面的StudentMapper通过继承BaseMapper,就间接实现了这些通用的增删改查接口。当然这一部分接口不需要你自己实现,所以它不能和其它的mapper放在一起,以免被@MapperScan("com.*.Mapper")扫描到,Mybatis扫描后发现你实现了这么多接口但是在映射文件却一个也没有实现,这时候就会报错。但是这些接口一定要被通用Mapper的MapperScan扫描到,由它来根据你在实体类与表中配关系生成通用的增删改查方法。
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* 通用mapper,注意:这个mapper不能和其它mapper放在一起
* 也就是不能被Mybatis扫描到
*/
public interface BaseMapper extends Mapper, MySqlMapper, IdsMapper {
}
创建MyBatisMapperScannerConfig:这个是最关键的一个类,由它进行配置,配置的解释在注释中都已经说明白了,记得把mapper类的包名换成自己项目中实际的包名
/**
* 通用mapper与分页插件的一些配置
*/
@Configuration
public class MyBatisMapperScannerConfig {
/**
* 使用通用Mapper之前需要初始化的一些信息
* 使用通用Mapper插件时请勿使用热加载,否则报错,插件作者后续应该会修复
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage("com.zhanghui.mapper");//普通mapper的位置
Properties properties = new Properties();
properties.setProperty("mappers", BaseMapper.class.getName());//通用mapper的全名
properties.setProperty("notEmpty", "false");
properties.setProperty("IDENTITY", "MYSQL");//配置数据库方言
mapperScannerConfigurer.setProperties(properties);
return mapperScannerConfigurer;
}
/**
* 配置mybatis的分页插件pageHelper
*/
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
//设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用
properties.setProperty("offsetAsPageNum","true");
//置为true时,使用RowBounds分页会进行count查询
properties.setProperty("rowBoundsWithCount","true");
//合理化查询,启用合理化时,
//如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
//未开启时如果pageNum<1或pageNum>pages会返回空数据
properties.setProperty("reasonable","true");
//配置mysql数据库的方言
properties.setProperty("dialect","mysql");
pageHelper.setProperties(properties);
return pageHelper;
}
}
创建SpringBoot启动类:这个懂SpringBoot的都懂,这里就不讲了
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.zhanghui.config.BaseMapper;
@SpringBootApplication
@MapperScan(basePackages = { "com.zhanghui.mapper" },markerInterface = BaseMapper.class)
public class App extends WebMvcConfigurerAdapter{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
创建MapperTest:这一步不是必须的,我这里是为了方便,也为了快速定位问题。可以看到selectAll与select这两个方法并不是我实现的而是通用Mapper生成的,更多方法请见通用Mapper方法大全
/**
* 为了简单只有数据访问层,
* 写测试类测试
* 这里只用到了查询的方法,mapper提供
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MapperTest {
@Resource
private StudentMapper studentMapper;
@Test
public void test1() {
//不分页查询
List lis1 = studentMapper.selectAll();
for (Student stu : lis1) {
System.out.println(stu);
}
System.out.println("-------------------------------------------------------------------");
System.out.println("-------------------------------------------------------------------");
//分页查询,显示第一页,每页五条
PageHelper.startPage(1,5);
List lis2 = studentMapper.selectAll();
for (Student stu : lis2) {
System.out.println(stu);
}
System.out.println("-------------------------------------------------------------------");
System.out.println("-------------------------------------------------------------------");
//分页查询,显示第一页,每页五条,按id降序
PageHelper.startPage(1,5,"stu_id desc");
List lis3 = studentMapper.selectAll();
for (Student stu : lis3) {
System.out.println(stu);
}
System.out.println("-------------------------------------------------------------------");
System.out.println("-------------------------------------------------------------------");
//分页查询,显示第一页,每页五条,按id降序
PageHelper.startPage(1,5,"stu_id desc");
Student student = new Student();
student.setName("二班张三");
List lis4 = studentMapper.select(student);
for (Student stu : lis4) {
System.out.println(stu);
}
}
}
两个插件到这里就整合完了,貌似PageHelper完全没提到,因为太简单了,简单配置然后可以直接使用了,如果这个插件在项目中使用还会用到一个分页类PageInfo,比如你在Service层中查询分页查询学生,在controller直接返回PageInfo就好,配合前端的数据表格插件会很舒服
//分页查询,显示第一页,每页五条,按id降序
PageHelper.startPage(1,5,"stu_id desc");
List lis4 = studentMapper.selectAll();
//使用的时候Pagehelper会自动填充PageInfo,你只需将查到的信息填充就好
return new PageInfo<>(lis4);
整个项目为了方便初学者学习只保留了主要的枝干,所以看起来非常简单,很精简,哈哈
END~~~