java rowmapper 通用实现_通用Mapper使用

通用Mapper介绍

产生背景

使用Mybatis的开发者大多会因为繁多的XML映射配置而头痛不已😔,即使使用注解,大量的SQL语句也是不可避免的,当数据库表结构发生变动时,所有对应的sql和实体类都得修改,基于此,通用Mapper出现了😊

基本概念

通用Mapper是一款用于单表增删改查的Mybatis插件,开发人员可以省去编写sql语句和在DAO层编写任何方法,就能轻松实现单表的常用操作。

项目地址

环境导入

环境说明

平台:windows

jdk版本:1.8

IDE:IDEA

数据库:mysql(8)

项目创建

新建一个Springboot项目

新建项目就没啥好说了,使用IDEA自带的Spring Initializer,一直下一步就完事了,省心

添加通用mapper依赖

tk.mybatis

mapper-spring-boot-starter

2.1.5

SpringBoot配置文件

#JDBC配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

spring.datasource.username=root

spring.datasource.password=root

#mybatis配置

mybatis.configuration.map-underscore-to-camel-case=true

logging.level.root = debug

数据准备

建表语句

create table user(

id int(10) auto_increment primary key,

name varchar(20) null,

email varchar(50) null

);

实体类编写

package com.panda.domain;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

@Table(name = "user")

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Integer id;

@Column

private String name;

@Column

private String email;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

}

说明

表名默认使用类名,驼峰会转换为下划线,如UserInfo对应的表名为user_info.当不满足上述对应关系时,类名上使用@Table注解,使用name属性指定tableName;

类的属性名默认会采用驼峰法转换为表字段名,如userName转化为user_name;不满足上述对应关系时,字段名上使用@Column注解,使用name属性指定表字段名;

表字段没有的属性,可以使用@Transient注解。

至少有一个字段使用@Id标识主键,多个@Id注解生成联合主键。

@GeneratedValue指定主键生成策略。

Dao层

Dao层使用通用Mapper接口,只需要让我们的接口实现Mapper即可。

此处需注意导入的是tk.mybatis.mapper.common.Mapper而不是mybatis的Mapper

继承该Mapper后,会获取父接口的常用方法。

package com.panda.mapper;

import com.panda.domain.User;

import tk.mybatis.mapper.common.Mapper;

public interface UserDao extends Mapper {

}

业务层

业务层接口:

package com.panda.service;

import com.panda.domain.User;

import java.util.List;

public interface UserService {

User selectOne(String id);

int addOne(User user);

int deleteOne(int id);

int updateOne(User user);

List selectOneNameLike(String name);

List selectAll();

}

业务层实现:

import com.panda.domain.User;

import com.panda.mapper.UserDao;

import com.panda.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import tk.mybatis.mapper.entity.Example;

import java.util.List;

@Service

public class UserServiceImpl implements UserService {

@Autowired

UserDao userDao; //此处如果报错为误报,忽略即可

@Override

public User selectOne(String id) {

return userDao.selectByPrimaryKey(id);

}

@Override

public int addOne(User user) {

return userDao.insertSelective(user);

}

@Override

public int deleteOne(int id) {

return userDao.deleteByPrimaryKey(id);

}

@Override

public int updateOne(User user) {

return userDao.updateByPrimaryKeySelective(user);

}

@Override

public List selectOneNameLike(String name) {

Example example = new Example(User.class);

example.createCriteria().andLike("name","%"+name+"%");

return userDao.selectByExample(example);

}

@Override

public List selectAll() {

return userDao.selectAll();

}

}

通用Mapper的常见方法解析:

基本增删改查

查询

select(T t) :根据传入对象属性查询,返回实体类元素集合。

selectOne(T t)) :根据传入的对象属性查询,存在多个返回值时抛出异常。

selectAll() :返回实体类元素集合。

selectCount(T t)) :根据传入的对象属性查询,返回总记录数。

删除

delete(T t)) 根据传入对象属性,删除所有查找到的记录。

deleteByPrimaryKey(Object key) 根据传入的主键,删除对应记录。

更新

updateByPrimaryKey(Object o) 根据传入对象属性,更新所有字段 。

updateByPrimaryKeySelective(T t) 只更新对象属性非空字段 。

插入

insert(T t)) 根据传入对象属性,插入所有属性对应的字段。

insertSelective(T t)) 根据传入对象属性,只插入对象属性非空字段

复杂条件查询

通用Mapper复杂条件查询使用的是Example,示例语法如下:

Example example = new Example(User.class);

Criteria criteria = example.createCriteria()

criteria.andLike("name","%"+name+"%");

userDao.selectByExample(example);

其中,Criteria对象可使用的方法很多,基本可以满足常用的条件查询:

上面的方法基本从方法名就可以看出其作用,使用起来也比较方便。

显示层

controller实现:

package com.panda.controller;

import com.panda.domain.User;

import com.panda.mapper.UserDao;

import com.panda.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@Controller

public class UserController {

@Autowired

UserService userService;

//增加一个

@RequestMapping("/addOne")

@ResponseBody

public int addOne(){

User user = new User();

user.setName("uzi");

user.setEmail("uzi@rng.com");

return userService.addOne(user);

}

//删除一个

@RequestMapping("/deleteOne")

@ResponseBody

public int deleteOne(int id){

return userService.deleteOne(id);

}

//更新一个

@RequestMapping("/updateOne")

@ResponseBody

public int updateOne(@RequestBody User user){

return userService.updateOne(user);

}

//查询一个

@RequestMapping("/selectOne")

@ResponseBody

public User selectOne(String id){

return userService.selectOne(id);

}

//查询所有

@RequestMapping("/selectAll")

@ResponseBody

public List selectAll(){

return userService.selectAll();

}

//name模糊查询

@RequestMapping("/selectOneNameLike")

@ResponseBody

public List selectOneNameLike(String name){

return userService.selectOneNameLike(name);

}

}

测试

测试插入

浏览器输入:[http://localhost:8080/addOne],可以看到数据库成功插入一个,当然正常情况应该是前端请求的 时候传入一个json对象给我们来插入数据 库,这里偷懒使用了自己创建的User对象,不过无伤大雅。

测试更新

浏览器输入:[http://localhost:8080/updateOne],通用使用我们自己创建User对象来更新数据库记录。

通用Mapper的原理简介

通用Mapper通过让dao层接口继承Mapper 接口,在运行期通过反射获取实体类T的信息,并构造出对应的SQL,dao层接口只需要直接调用父接口提供的方法,便可完成对应SQL的调用和数据库查询。

更加详细执行过程在此🙅‍赘述,有感兴趣的朋友可以访问:

最后

感谢您阅读本文,源码已上传github,欢迎访问:github

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值