SpringBoot整合mybatis通⽤Mapper+⾃定义通⽤Mapper⽅法解析⽬录
⾸先引⼊pom
通⽤Mapper是tk.mybais中的
也可以⽤代码进⾏配置
数据库创建⼀张表member以及相关字段
新建⼀个通⽤Mapper继承Mapper、MySqlMapper
⽐较详细的⼀个⼊门⽰例
举例我要写⼀个通⽤的单表分页
在⾃⼰的BaseMapper写⼀个⽅法
新建的BaseMapperProvider
对上诉实现代码的描述
返回后通⽤Mapper是怎么处理的
最近公司在⽤的通⽤mapper,⾃⼰感兴趣,然后就来搭建了⼀个springboot项⽬试验通⽤mapper
这个项⽬是国内的⼤神写的⼀个mybatis插件,⾥⾯有很多的增删改查⽅法
官⽅解释的是通⽤mapper⽀持3.2.4以及以上的版本
⾸先引⼊pom
<!--Mybatis -->
<dependency>
<groupId&batis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId&ator</groupId>
<artifactId>mybatis-generator</artifactId>
<version>1.3.5</version>
<type>pom</type>
</dependency>
<!--分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.1</version>
</dependency>
<!--tkmybatis -->
<dependency>
<groupId&batis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.4</version>
</dependency>
通⽤Mapper是tk.mybais中的
配置⽂件l:
server:
port: 8081
# 下⾯是配置undertow作为服务器的参数
undertow:
# 设置IO线程数, 它主要执⾏⾮阻塞的任务,它们会负责多个连接, 默认设置每个CPU核⼼⼀个线程
io-threads: 4
# 阻塞任务线程池, 当执⾏类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
worker-threads: 20
# 以下的配置会影响buffer,这些buffer会⽤于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间⼤⼩,越⼩的空间被利⽤越充分
buffer-size: 1024
# 是否分配的直接内存
direct-buffers: true
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: sql.jdbc.Driver
driver-class-name: sql.jdbc.Driver
platform: mysql
url: jdbc:mysql://x:5306/miniprogram?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
username: xxxxx
password: xxxxx
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT1FROMDUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall
logSlowSql: true
redis:
database: 1
host: xxxxx
port: xxxx
password: xxxx
timeout: 10000
activemq:
queueName: mvp.queue
topicName: pic
#账号密码
user: user
password: user
#URL of the ActiveMQ broker.
broker-url: tcp://localhost:61616
in-memory: false
#必须使⽤连接池
pool:
#启⽤连接池
enabled: true
#连接池最⼤连接数
max-connections: 5
#空闲的连接过期时间,默认为30秒
idle-timeout: 30s
#    jedis:    有默认值,源码:RedisProperties
#      pool:
#        max-active:
#        max-idle:
#        max-wait:
#        min-idle:
mybatis:
typeAliasesPackage: com.ity
mapper-locations: classpath:mapper/**/*l
mapper:
mappers: com.sql.mappers.BaseMapper
identity: mysql
#fig:
#  classpath: test/l
xxxx请配置⾃⼰的数据库相关信息
activemq默认账号密码mapper:
mappers: com.sql.mappers.BaseMapper
identity: mysql
ctrl+⿏标点击com.sql.mappers.BaseMapper 进⼊源码可以看到 MapperProperties类
是⼀个集合,意思这⾥可以mappers配置多个通⽤Mapper,可以是直接继承它已有的通⽤Mapper,也可以是定义⾃⼰需要的通⽤Mapper,⾃定义通⽤Mapper(代替它的Mapper)继承实现的⽅式不⼀样,下⾯会讲到
也可以⽤代码进⾏配置
/**
* 通⽤mapper与分页插件的⼀些配置
*/
@Configuration
public class MyBatisMapperScannerConfig {
/**
* 使⽤通⽤Mapper之前需要初始化的⼀些信息
* 使⽤通⽤Mapper插件时请勿使⽤热加载,否则报错,插件作者后续应该会修复
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage("mapper");//普通mapper的位置
Properties properties = new Properties();
properties.setProperty("mappers", Name());//通⽤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;
}
}
mappers对应的通⽤mapper类,不要和⾃⼰其他业务的mapper放在⼀起,不要被@MapperScan扫描到,不然会报错,因为继承了通⽤mapper,会有很多相应的⽅法,被扫描到以后,mybatis发现没有⼀个xml配置⽂件或者相应⽅法没有进⾏实现,这时候就会报错。但是继承⾃⼰的BaseMapper相关mapper肯定是要被扫描到的
数据库创建⼀张表member以及相关字段
/*
Navicat MySQL Data Transfer
Source Server        : 120.79.81.103-5306-master
Source Server Version : 50719
Source Host          : 120.79.81.103:5306
Source Database      : miniprogram
Target Server Type    : MYSQL
Target Server Version : 50719
File Encoding        : 65001
Date: 2019-04-03 23:09:51
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for member
-- ----------------------------
DROP TABLE IF EXISTS `member`;
CREATE TABLE `member` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`member_name` varchar(255) NOT NULL COMMENT '会员⽤户名',
`tel` varchar(255) DEFAULT NULL COMMENT '电话',
`nick_name` varchar(255) NOT NULL COMMENT '昵称',
`head_img` varchar(255) DEFAULT NULL COMMENT '头像地址',
`status` int(1) NOT NULL COMMENT '状态 1启⽤ 2禁⽤',
`create_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`pwd` varchar(255) NOT NULL COMMENT '密码',
`signature` varchar(255) DEFAULT NULL COMMENT '个性签名',
`creat_id` bigint(20) DEFAULT NULL,
`delete_state` int(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of member
-- ----------------------------
INSERT INTO `member` VALUES ('1', 'dsada', '159********', 'dasdas', null, '1', '2019-03-11 18:47:53', '2019-03-11 18:47:53', '123456', null, null, '1');
INSERT INTO `member` VALUES ('2', 'ypp', '159********', '6666', null, '1', '2019-03-11 19:35:39', null, 'EDGM@MAMABDACFDLLG', null, null, '1');
创建实体MemberEntity,⼀般创建实体我都会抽⼀些相同的字段出来
MemberEntity:
package com.ber;
import javax.persistence.Table;
import com.ity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
perimental.Accessors;
@Data // getter、setter
@AllArgsConstructor // 全参构造⽅法
@NoArgsConstructor // ⽆参构造⽅法
@Accessors(chain = true) // 链式编程写法
@Table(name="member")
public class MemberEntity extends BaseEntity {
/**
*
*/
private static final long serialVersionUID = -2601234073734313278L;
private String memberName;// 会员登录⽤户名
private String nickName;// 昵称
private String tel;// 电话
private String pwd;// 密码
private String headImg;// 头像图⽚
private String signature;// 个性签名
private Integer status;//状态 1禁⽤ 2启⽤
}
BaseEntity:
package com.ity;
import java.util.Date;
import javax.persistence.Column;
import com.ber.MemberEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
perimental.Accessors;
/**
* @author ypp
* @Description: TODO(⽤⼀句话描述该⽂件做什么)
*/
@Data // getter、setter
@AllArgsConstructor // 全参构造⽅法
@NoArgsConstructor // ⽆参构造⽅法
@Accessors(chain = true) // 链式编程写法
public class BaseEntity extends IdEntity {
/**
*
*/
private static final long serialVersionUID = 8575696766261326260L;
@Column(name="creat_id")
private Integer creatId;
@Column(name="create_date")
private Date createDate;
@Column(name="delete_state")
private Integer deleteState;// 删除状态 1正常 2已删除
}
IdEntity:
package com.ity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import com.ber.MemberEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
perimental.Accessors;
/
**
* @author ypp
* @Description: TODO(⽤⼀句话描述该⽂件做什么)
*/
@Data // getter、setter
@AllArgsConstructor // 全参构造⽅法
@NoArgsConstructor // ⽆参构造⽅法
@Accessors(chain = true) // 链式编程写法
public class IdEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = -9089706482760436909L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Table:对应数据库的表,如果不写默认是类名⾸字母⼩写作为表名,⽐Member,不写数据库表默认指向member
@Column:的属性name对应数据库表的字段,如果不写默认是驼峰下划线匹配,⽐如private Long myId,如果不写得话,就是对应数据库表字段my_id
@Id:把当前字段作为数据库主键使⽤,匹配数据库主键。如果不贴此注解,在某些查询语句的时候会
把表字段⼀起作为联合主键查询@GeneratedValue:让通⽤mapper在执⾏insert操作之后将⾃动⽣成的主键值回写到当前实体对象对应的属性当中
新建⼀个通⽤Mapper继承Mapper、MySqlMapper
点击进去看
package com.sql.mappers;
import com.ity.BaseEntity;
batis.mappermon.Mapper;
batis.mappermon.MySqlMapper;
/**
* @author ypp
* 创建时间:2018年12⽉27⽇下午1:29:03
* @Description: TODO(⽤⼀句话描述该⽂件做什么)
*/
public interface BaseMapper<T extends BaseEntity> extends Mapper<T>,MySqlMapper<T>{
}
BaseMapper是我⾃⼰定义的通⽤Mapper,注意在被继承Mapper上⾯也有BaseMapper,注意区分,我这⾥名字取⼀样了⽽已。被Mapper继承的BaseMapper⾥⾯有还有很多增删改查的⽅法
这是源码
看了下,⾥⾯有⼤概20个左右⽅法,都是⽐较基础的增删改查
测试:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。