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);
    }

}

参考资料

上一篇下一篇

猜你喜欢

热点阅读