Spring Boot 集成MyBatis通用Mapper、分页
2017-09-12 本文已影响841人
Bobby0322
TKmybatis提供一种通用mapper,它不需要针对每个mapper写sql语句,只需继承通用mapper调用相应的接口来完成单表的增删改查。
集成通用 MAPPER、分页插件
不客气的说,使用这个通用Mapper甚至能改变你对Mybatis单表基础操作不方便的想法,使用它你能简单的使用单表的增删改查,包含动态的增删改查.
程序使用拦截器实现具体的执行Sql,完全使用原生的Mybatis进行操作.
添加 Maven 依赖或引入 Jar 包
如果你使用 Maven,只需要添加如下依赖:
<!--3.引入tk.mybatis 依赖,实现对实体类的增删改查的代码 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.3</version>
</dependency>
<!--4.引入pagerhelper 依赖,实现分页功能 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
SQL 数据准备
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`user_name` varchar(32) DEFAULT NULL COMMENT '用户名',
`user_pwd` varchar(32) DEFAULT NULL COMMENT '密码',
`user_sex` varchar(32) DEFAULT NULL,
`nick_name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
entity
package com.pingkeke.springBoot.entity;
import com.pingkeke.springBoot.enums.UserSexEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.persistence.*;
/**
* User.
* @Data
@ToString、 @EqualsAndHashCode、 @Getter、 @Setter 和 @RequiredArgsConstructor 注解的集合。
@NoArgsConstructor
作用于类,@NoArgsConstructor 自动生成不带参数的构造方法;
@AllArgsConstructor
@AllArgsConstructor 自动生成包含所有属性的构造方法。
@Accessors有三个参数可以使用
chain 链式的形式
fluent 流式的形式
prefix 生成指定前缀的属性的getter与setter方法,并且生成的getter与setter方法时会去除前缀
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 使用主键自增
@Column(name = "id")
private Integer id;
private String userName;
private String userPwd;
private UserSexEnum userSex;
private String nickName;
}
UserMapper
package com.pingkeke.springBoot.util;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* MyMapper.
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
package com.pingkeke.springBoot.mapper;
import com.pingkeke.springBoot.entity.User;
import com.pingkeke.springBoot.util.MyMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/**
* 继承通用的Mapper<T>,必须指定泛型<T>
* 一旦继承了Mapper<T>,继承的Mapper就拥有了以下通用的方法:
*/
@Mapper
public interface UserMapper extends MyMapper<User> {
@Select("select * from user where user_name=#{username}")
User selectByName(String username);
}
application.properies
spring.datasource.url=jdbc:mysql://localhost:3306/tdf_db?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#实体类扫描包
mybatis.type-aliases-package=com.pingkeke.springBoot.entity
#Mapper.xml文件扫描目录
mybatis.mapper-locations=classpath:mapper/*.xml
#驼峰命名
mybatis.configuration.mapUnderscoreToCamelCase=true
#Mapper.xml文件扫描目录
#mybatis.config-locations=classpath:mybatis/mybatis-config.xml
#mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
#tkmapper 工具类
mapper.mappers=com.pingkeke.springBoot.util.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
测试
package com.pingkeke.springBoot.mapper;
import com.github.pagehelper.PageHelper;
import com.pingkeke.springBoot.entity.User;
import com.pingkeke.springBoot.enums.UserSexEnum;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* UserMapperTest.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@MapperScan("com.pingkeke.springBoot.mapper")
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
/**
* 新增一条数据 insert
* 插入一条数据
* 支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
* 优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
*/
@Test
public void testInsert() throws Exception {
User user = new User(null,"bobby1","123",UserSexEnum.MAN,"Bobby1");
userMapper.insert(user);
Assert.assertEquals(6, userMapper.selectAll().size());
}
/**
* 自定义selectByName情况
*/
@Test
public void testSelectByName(){
User user = userMapper.selectByName("Bobby");
System.out.println(user.getUserName());
System.out.println(user.getUserPwd());
Assert.assertNotEquals(null,user);
}
/**
* selectAll
* @throws Exception
*/
@Test
public void testQuery() throws Exception {
/**
* Mapper接口方式的调用,推荐这种使用方式。
*/
PageHelper.startPage(1, 2);
List<User> users = userMapper.selectAll();
System.out.println(users.size());
if(users==null || users.size()==0) {
System.out.println("is null");
} else {
System.out.println(users.toString());
}
}
/**
* selectByPrimaryKey 根据主键进行查询
* 根据主键进行查询,必须保证结果唯一
* 单个字段做主键时,可以直接写主键的值
* 联合主键时,key可以是实体类,也可以是Map
*/
@Test
public void testSelectByPrimaryKey() {
User user = userMapper.selectByPrimaryKey(1);
System.out.println(user.getUserName());
System.out.println(user.getUserPwd());
Assert.assertNotEquals(null,user);
}
/**
* 查询总数 selectCount
* 根据实体类不为null的字段查询总数,条件全部使用=号and条件
*/
@Test
public void testSelectCount() {
int cnt = userMapper.selectCount(new User());
System.out.println(cnt);
}
/**
* updateByPrimaryKey
* 根据主键进行更新,这里最多只会更新一条数据;
* 参数为实体类
* @throws Exception
*/
@Test
public void testUpdate() throws Exception {
User user = userMapper.selectByPrimaryKey(1);
System.out.println(user.toString());
user.setNickName("Bobby");
userMapper.updateByPrimaryKey(user);
Assert.assertTrue(("Bobby".equals(userMapper.selectByPrimaryKey(1).getNickName())));
}
/**
* 根据主键删除 deleteByPrimaryKey
*/
@Test
public void testDeleteByPrimaryKey() {
int cnt = userMapper.deleteByPrimaryKey(28);
System.out.println(cnt);
}
}