前言
java的持久化框架很多,如Hibernate、Mybatis、Spring data jpa等,而现在主流的玩法都是ssm,也就是spring+springmvc+mybatis。本快速开发框架选用的持久化框架为Mybatis,而使用Mapper的目的是其将Mybatis的通用方法都实现了,可以少生成一大推xml文件。当然,类似于Mapper的框架也还有一个,比如Mybatis plus,感兴趣的同学可以了解一下。
开始动手
建表
CREATE TABLE `sys_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(32) NOT NULL COMMENT '用户名',
`real_name` varchar(32) DEFAULT NULL COMMENT '姓名',
`avatar` varchar(200) DEFAULT NULL COMMENT '头像',
`email` varchar(64) DEFAULT NULL COMMENT '邮箱',
`mobile_phone` varchar(11) DEFAULT NULL COMMENT '手机号',
`telephone` varchar(20) DEFAULT NULL COMMENT '电话',
`password` varchar(40) DEFAULT NULL COMMENT '密码',
`salt` varchar(10) DEFAULT NULL COMMENT '加盐',
`sex` int(6) unsigned DEFAULT '0' COMMENT '性别(0->未知|UNKNOWN,1->男|MALE,2->女|FEMALE)',
`is_locked` tinyint(1) unsigned DEFAULT '0' COMMENT '是否锁定(1->是|YES,0->否|NO)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`is_deleted` tinyint(1) unsigned DEFAULT '0' COMMENT '是否删除(1->删除|YES,0->未删除|NO)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='用户';
目录结构
只罗列需要新增或修改的文件
├── mldong-admin 管理端接口
├── src/main/java
└──com.mldong.modules.sys
└── controller 控制层
└── SysUserController.java
└── service 服务层
├── impl
└── SysUserServiceImpl
└── SysUserService.java
└── src/main/resources
├── application-dev.yml
└── application.yml
├── mldong-common 工具类及通用代码
├── mldong-generator 代码生成器
└── mldong-mapper 持久层
└── com.mldong.modules
└──sys
├── entity 实体类
└── SysUser.java 用户表实体类
└── mapper 持久层
└── SysUserMapper.java 用户表Mapper
└── pom.xml
文件说明
- mldong-mapper/pom.xml 新增依赖
<!-- tk.mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.starter.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>${tk.mybatis.version}</version>
</dependency>
<!--mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.spring.boot.starter.version}</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.spring.boot.starter.version}</version>
</dependency>
<!-- tk.mybatis -->
父工程已经配置有版本号了,但了为了方便复制,这里也暂留一份
<properties>
<tk.mybatis.version>4.1.5</tk.mybatis.version>
<mybatis.spring.boot.starter.version>2.1.0</mybatis.spring.boot.starter.version>
<mapper.spring.boot.starter.version>2.1.0</mapper.spring.boot.starter.version>
<pagehelper.spring.boot.starter.version>1.2.12</pagehelper.spring.boot.starter.version>
</properties>
- mldong-admin/src/main/resources/application.yml新增mybatis、mapper、pagehelper配置
server:
port: 18080
spring:
application:
name: mldong-admin
profiles:
active: dev
jackson:
default-property-inclusion: non_null
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: ${jdbc.driver-class-name}
url: ${jdbc.url}
username: ${jdbc.username}
password: ${jdbc.password}
max-idle: ${jdbc.max-idle}
max-wait: ${jdbc.max-wait}
min-idle: ${jdbc.min-idle}
aop:
proxy-target-class: true
auto: true
# mybatis配置
mybatis:
type-aliases-package: com.mldong.modules.*.mapper.*,com.mldong.modules.*.dao.*,com.mldong.modules.*.repo.*
mapper-locations: classpath*:mapper/*/*.xml,classpath*:dao/*/*.xml,classpath*:repo/*/*.xml
configuration:
map-underscore-to-camel-case: true
# mapper配置
mapper:
mappers:
- tk.mybatis.mapper.common.BaseMapper
not-empty: false
identity: MYSQL
use-simple-type: true
enum-as-simple-type: true
# 分页插件配置
pagehelper:
helperDialect: mysql
reasonable: false
supportMethodsArguments: true
params: count=countSql
- 为了日志输入sql语句mldong-admin/src/main/resources/application-dev.yml修改如下
# 日志配置
logging:
level:
com.mldong: DEBUG
org.springframework: DEBUG
tk.mybatis: DEBUG
tk.ibatis: DEBUG
tk.ibatis.common.jdbc.SimpleDataSource: DEBUG
tk.ibatis.common.jdbc.ScriptRunner: DEBUG
tk.ibatis.sqlmap.engine.impl.SqlMapClientDelegate: DEBUG
java.sql.Connection: DEBUG
java.sql.Statement: DEBUG
java.sql.PreparedStatement: DEBUG
org.springframework.scheduling: INFO
# jdbc 配置
jdbc.driver-class-name: com.mysql.cj.jdbc.Driver
jdbc.url: jdbc:mysql://localhost:3306/mldong?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username: root
jdbc.password:
jdbc.max-idle: 10
jdbc.max-wait: 10000
jdbc.min-idle: 5
- mldong-admin/src/main/java/com/mldong/MldongAdminApplication.java 新增mapper注解扫描
package com.mldong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan(basePackages = {"com.mldong.modules.*.mapper","com.mldong.modules.*.dao","com.mldong.modules.*.repo"})
@EnableTransactionManagement
public class MldongAdminApplication {
public static void main(String[] args) {
SpringApplication.run(MldongAdminApplication.class, args);
}
}
- 新增文件mldong-mapper/src/main/java/com/mldong/modules/sys/entity/SysUser.java
package com.mldong.modules.sys.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Table;
/**
* 用户表
* @author MLD
*
*/
@Table(name="sys_user")
public class SysUser implements Serializable{
/**
*
*/
private static final long serialVersionUID = -2687095050668229447L;
private Long id;
private String userName;
private String realName;
private String avatar;
private String email;
private String mobilePhone;
private String telephone;
private String password;
private String salt;
private Integer sex;
private Boolean isLocked;
private Date createTime;
private Date updateTime;
private Boolean isDeleted;
// get set 略
}
- 新增文件mldong-mapper/src/main/java/com/mldong/modules/sys/mapper/SysUserMapper.java
package com.mldong.modules.sys.mapper;
import com.mldong.modules.sys.entity.SysUser;
import tk.mybatis.mapper.common.BaseMapper;
/**
* sys_user 持久层
* @author MLD
*
*/
public interface SysUserMapper extends BaseMapper<SysUser>{
}
- 新增文件mldong-admin/src/main/java/com/mldong/modules/sys/service/SysUserService.java
package com.mldong.modules.sys.service;
import com.github.pagehelper.Page;
import com.mldong.modules.sys.entity.SysUser;
public interface SysUserService {
/**
* 添加用户
* @param param
* @return
*/
public int save(SysUser param);
/**
* 更新用户
* @param param
* @return
*/
public int update(SysUser param);
/**
* 删除用户
* @param id
* @return
*/
public int delete(Long id);
/**
* 查询用户
* @param id
* @return
*/
public SysUser get(Long id);
/**
* 分页查询用户列表
* @param t
* @param pageNum
* @param pageSize
* @return
*/
public Page<SysUser> list(SysUser t, int pageNum, int pageSize);
}
- 新增文件mldong-admin/src/main/java/com/mldong/modules/sys/service/impl/SysUserServiceImpl.java
package com.mldong.modules.sys.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.mldong.modules.sys.entity.SysUser;
import com.mldong.modules.sys.mapper.SysUserMapper;
import com.mldong.modules.sys.service.SysUserService;
@Service
public class SysUserServiceImpl implements SysUserService{
@Autowired
private SysUserMapper sysUserMapper;
@Override
public int save(SysUser param) {
return sysUserMapper.insertSelective(param);
}
@Override
public int update(SysUser param) {
return sysUserMapper.updateByPrimaryKeySelective(param);
}
@Override
public int delete(Long id) {
return sysUserMapper.deleteByPrimaryKey(id);
}
@Override
public SysUser get(Long id) {
return sysUserMapper.selectByPrimaryKey(id);
}
@Override
public Page<SysUser> list(SysUser t, int pageNum, int pageSize) {
Page<SysUser> page = PageHelper.startPage(pageNum, pageSize,true);
sysUserMapper.select(t);
return page;
}
}
- 新增文件mldong-admin/src/main/java/com/mldong/modules/sys/controller/SysUserController.java
package com.mldong.modules.sys.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.github.pagehelper.Page;
import com.mldong.modules.sys.entity.SysUser;
import com.mldong.modules.sys.service.SysUserService;
@RestController
@RequestMapping("/sys/user")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
/**
* 添加用户
* @param param
* @return
*/
@PostMapping("save")
public int save(@RequestBody SysUser param) {
return sysUserService.save(param);
}
/**
* 更新用户
* @param param
* @return
*/
@PostMapping("update")
public int update(@RequestBody SysUser param) {
return sysUserService.update(param);
}
/**
* 删除用户
* @param param
* @return
*/
@PostMapping("delete")
public int delete(Long id) {
return sysUserService.delete(id);
}
/**
* 通过id获取用户
* @param param
* @return
*/
@GetMapping("get")
public SysUser get(Long id) {
return sysUserService.get(id);
}
/**
* 分页查询用户列表
* @param param
* @return
*/
@GetMapping("list")
public Page<SysUser> list(SysUser param, @RequestParam(defaultValue="1")Integer pageNum, @RequestParam(defaultValue="10")int pageSize) {
return sysUserService.list(param, pageNum, pageSize);
}
}
启动运行项目
MldongAdminApplication.java
右键->Run As -> Java Application
访问页面
http://localhost:18080/sys/user/list
如项目启动正常,访问页面会有用户列表数据,可使用postman测试其他接口。到此,mapper集成完成,下一篇会集成swaggerui和knife4j。
mapper常用方法说明
方法 | 说明 |
---|---|
List select(T record); | 根据实体中的属性值进行查询,查询条件使用等号 |
T selectByPrimaryKey(Object key); | 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号 |
List selectAll(); | 查询全部结果,select(null)方法能达到同样的效果 |
T selectOne(T record); | 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号 |
int selectCount(T record); | 根据实体中的属性查询总数,查询条件使用等号 |
int insert(T record); | 保存一个实体,null的属性也会保存,不会使用数据库默认值 |
int insertSelective(T record); | 保存一个实体,null的属性不会保存,会使用数据库默认值 |
int updateByPrimaryKey(T record); | 根据主键更新实体全部字段,null值会被更新 |
int updateByPrimaryKeySelective(T record); | 根据主键更新属性不为null的值 |
int delete(T record); | 根据实体属性作为条件进行删除,查询条件使用等号 |
int deleteByPrimaryKey(Object key); | 根据主键字段进行删除,方法参数必须包含完整的主键属性 |
List selectByExample(Object example); | 根据Example条件进行查询,这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列 |
int selectCountByExample(Object example); | 根据Example条件进行查询总数 |
int updateByExample(@Param("record") T record, @Param("example") Object example); | 根据Example条件更新实体record包含的全部属性,null值会被更新 |
int updateByExampleSelective(@Param("record") T record, @Param("example") Object example); | 根据Example条件更新实体record包含的不是null的属性值 |
int deleteByExample(Object example); | 根据Example条件删除数据 |
项目源码地址
- 后端
- 前端