打造一款适合自己的快速开发框架-集成mapper

958 阅读6分钟

前言

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条件删除数据

项目源码地址

  • 后端

gitee.com/mldong/mldo…

  • 前端

gitee.com/mldong/mldo…

相关文章

打造一款适合自己的快速开发框架-先导篇

打造一款适合自己的快速开发框架-后端脚手架搭建