项目结构
base:基础结构
modules:测试代码
集成
1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>mapper</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mapper</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring-boot mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--Mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--添加tk-mapper依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. application.yml
server:
port: 9999
#数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: xxxxxx
username: admin
password: admin
mybatis:
mapper-locations: classpath*:mapper/*Mapper.xml
# 打印sql日志
logging:
level:
com.example.mapper.modules.dao : debug
3. base包下的*Mapper接口
BaseMapper.java
package com.example.mapper.base;
/**
* 基础通用mapper
*/
public interface BaseMapper<T> extends InsertMapper<T>,
DeleteMapper<T>,
UpdateMapper<T>,
SelectMapper<T> {
}
DeleteMapper.java
package com.example.mapper.base;
import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.base.delete.DeleteByPrimaryKeyMapper;
import tk.mybatis.mapper.common.condition.DeleteByConditionMapper;
import tk.mybatis.mapper.common.ids.DeleteByIdsMapper;
/**
* 基础删除功能mapper
*/
public interface DeleteMapper<T> extends Marker,
tk.mybatis.mapper.common.base.delete.DeleteMapper<T>,
DeleteByPrimaryKeyMapper<T>,
DeleteByConditionMapper<T>,
DeleteByIdsMapper<T> {
}
InsertMapper.java
package com.example.mapper.base;
import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.MySqlMapper;
import tk.mybatis.mapper.common.base.insert.InsertSelectiveMapper;
/**
* 基础新增功能mapper
*/
public interface InsertMapper<T> extends Marker,
tk.mybatis.mapper.common.base.BaseInsertMapper<T>,
InsertSelectiveMapper<T>,
MySqlMapper<T> {
}
SelectMapper.java
package com.example.mapper.base;
import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.base.select.*;
import tk.mybatis.mapper.common.condition.SelectByConditionMapper;
import tk.mybatis.mapper.common.condition.SelectCountByConditionMapper;
import tk.mybatis.mapper.common.example.SelectByExampleMapper;
import tk.mybatis.mapper.common.ids.SelectByIdsMapper;
/**
* 基础查询功能mapper
*/
public interface SelectMapper<T> extends Marker,
SelectOneMapper<T>,
tk.mybatis.mapper.common.base.select.SelectMapper<T>,
SelectAllMapper<T>,
SelectCountMapper<T>,
SelectByPrimaryKeyMapper<T>,
ExistsWithPrimaryKeyMapper<T>,
SelectByIdsMapper<T>,
SelectByConditionMapper<T>,
SelectCountByConditionMapper<T>,
SelectByExampleMapper<T> {
}
UpdateMapper.java
package com.example.mapper.base;
import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeyMapper;
import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeySelectiveMapper;
import tk.mybatis.mapper.common.condition.UpdateByConditionMapper;
import tk.mybatis.mapper.common.condition.UpdateByConditionSelectiveMapper;
import tk.mybatis.mapper.common.example.UpdateByExampleSelectiveMapper;
/**
* 基础修改功能mapper
*/
public interface UpdateMapper<T> extends Marker,
UpdateByPrimaryKeyMapper<T>,
UpdateByPrimaryKeySelectiveMapper<T>,
UpdateByConditionMapper<T>,
UpdateByConditionSelectiveMapper<T>,
UpdateByExampleSelectiveMapper<T> {
}
测试
实体类:Teacher.java
package com.example.mapper.modules.entity;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
/**
* @Description 实体类属性类型不能是基本类型,如int要换成Integer
*/
@Data
@Table(name = "teacher")
public class Teacher implements Serializable {
@Id
private Integer id;
private String name;
private Integer age;
}
控制层:TeacherController.java
package com.example.mapper.modules.controller;
import com.example.mapper.modules.entity.Teacher;
import com.example.mapper.modules.service.ITeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/mapper")
public class TeacherController {
@Autowired
private ITeacherService iTeacherService;
// 查询记录
// http://localhost:9999/mapper/selectTeacher
@GetMapping("/selectTeacher")
List<Teacher> selectTeacher() {
return iTeacherService.selectTeacher();
}
// 添加记录
// http://localhost:9999/mapper/insertTeacher
@GetMapping("/insertTeacher")
int insertTeacher() {
return iTeacherService.insertTeacher();
}
// 删除记录
// http://localhost:9999/mapper/deleteTeacher
@GetMapping("/deleteTeacher")
int deleteTeacher() {
return iTeacherService.deleteTeacher();
}
// 修改记录
// http://localhost:9999/mapper/updateTeacher
@GetMapping("/updateTeacher")
int updateTeacher() {
return iTeacherService.updateTeacher();
}
}
Service:ITeacherService.java
package com.example.mapper.modules.service;
import com.example.mapper.modules.entity.Teacher;
import java.util.List;
public interface ITeacherService {
List<Teacher> selectTeacher();
int insertTeacher();
int deleteTeacher();
int updateTeacher();
}
ServiceImpl:TeacherServiceImpl.java
测试了通用mapper的大部分使用方法,能满足一般需求
package com.example.mapper.modules.service;
import com.example.mapper.modules.dao.TeacherDao;
import com.example.mapper.modules.entity.Teacher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;
import java.util.ArrayList;
import java.util.List;
@Service
public class TeacherServiceImpl implements ITeacherService {
@Autowired
private TeacherDao teacherDao;
/**
* @Description 查询
*
*/
@Override
public List<Teacher> selectTeacher() {
Teacher t = new Teacher();
t.setId(1);
t.setName("gaobo");
/*select() 根据实体中的属性值进行查询*/
// ==> Preparing: SELECT id,name,age FROM teacher WHERE id = ? AND name = ?
// ==> Parameters: 1(Integer), gaobo(String)
List<Teacher> select = teacherDao.select(t);
/*selectByPrimaryKey() 按照带有@id注解的字段作为条件,根据主键字段进行查询*/
// ==> Preparing: SELECT id,name,age FROM teacher WHERE id = ?
// ==> Parameters: 1(Integer)
Teacher teacher = teacherDao.selectByPrimaryKey(1);
/*selectAll() 查询所有记录*/
// ==> Preparing: SELECT id,name,age FROM teacher
List<Teacher> selectAll = teacherDao.selectAll();
/*selectByExample() 根据Example条件进行查询*/
Example example = new Example(Teacher.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("name","xxx");
//==> Preparing: SELECT id,name,age FROM teacher WHERE ( name = ? )
//==> Parameters: xxx(String)
List<Teacher> selectByExample = teacherDao.selectByExample(example);
/*selectCount() 根据实体中的属性查询总数*/
// ==> Preparing: SELECT COUNT(id) FROM teacher WHERE id = ? AND name = ?
// ==> Parameters: 1(Integer), gaobo(String)
int selectCount = teacherDao.selectCount(t);
/*selectOne() 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常*/
// ==> Preparing: SELECT id,name,age FROM teacher WHERE id = ? AND name = ?
// ==> Parameters: 1(Integer), gaobo(String)
Teacher selectOne = teacherDao.selectOne(t);
/*根据主键字符串进行查询,类中只有存在一个带有@Id注解的字段*/
// ==> Preparing: SELECT id,name,age FROM teacher where id in (1,2)
List<Teacher> selectByIds = teacherDao.selectByIds("1,2");
/**
* Condition 和Example的使用方法一模一样,即和selectByExample方法一样的
* Condition 的出现是为了替代Example,因为Example有歧义
*/
Condition condition = new Condition(Teacher.class);
Condition.Criteria criteria2 = condition.createCriteria();
criteria2.andEqualTo("name","xxx");
List<Teacher> selectByCondition = teacherDao.selectByCondition(condition);
return selectAll;
}
/**
* @Description 添加
*
*/
@Override
public int insertTeacher() {
Teacher t = new Teacher();
t.setId(4);
t.setName("zhang");
Teacher t2 = new Teacher();
t2.setId(5);
t2.setName("wang");
/*
*
* 保存一个实体,null的属性也会保存,不会使用数据库默认值
* ==> Preparing: INSERT INTO teacher ( id,name,age ) VALUES( ?,?,? )
* ==> Parameters: 4(Integer), zhang(String), null
* */
int insert = teacherDao.insert(t);
List<Teacher> list = new ArrayList<>();
list.add(t);
list.add(t2);
/*
* 批量添加功能,实体必须包含`id`属性并且必须为自增列,id字段不需赋值
* 想要测试的话,可以先暂时把id改成自增
* 如果不是自增列不是id,见insertList源码,有解释
* ==> Preparing: INSERT INTO teacher ( name,age ) VALUES ( ?,? ) , ( ?,? )
* ==> Parameters: zhang(String), null, wang(String), null
* */
int insertList = teacherDao.insertList(list);
/*
* 保存一个实体,null的属性不会保存,会使用数据库默认值
* ==> Preparing: INSERT INTO teacher ( id,name ) VALUES( ?,? )
* ==> Parameters: 5(Integer), wang(String)
* */
int insertSelective = teacherDao.insertSelective(t2);
/*
* 限制为实体包含`id`属性并且必须为自增列,实体配置的主键策略无效
* ==> Preparing: INSERT INTO teacher ( name,age ) VALUES ( ?,? )
* ==> Parameters: wang(String), null
* */
int insertUseGeneratedKeys = teacherDao.insertUseGeneratedKeys(t2);
return 0;
}
@Override
public int deleteTeacher() {
Teacher t = new Teacher();
t.setId(1);
t.setName("zhang");
/**
* 根据实体属性作为条件进行删除
* ==> Preparing: DELETE FROM teacher WHERE id = ? AND name = ?
* ==> Parameters: 1(Integer), zhang(String)
*/
int delete = teacherDao.delete(t);
// 参考selectByIds ==> Preparing: DELETE FROM teacher where id in (1,2)
int deleteByIds = teacherDao.deleteByIds("1,2");
// 根据主键字段进行删除,即有@Id注解的字段 ==> Preparing: DELETE FROM teacher WHERE id = ?
int deleteByPrimaryKey = teacherDao.deleteByPrimaryKey(1);
// 按条件删除,参考selectByCondition()
// ==> Preparing: DELETE FROM teacher WHERE ( name = ? )
// ==> Parameters: xxx(String)
Condition condition = new Condition(Teacher.class);
Condition.Criteria criteria = condition.createCriteria();
criteria.andEqualTo("name","xxx");
int deleteByCondition = teacherDao.deleteByCondition(condition);
return 0;
}
@Override
public int updateTeacher() {
Teacher t = new Teacher();
t.setId(1);
//t.setName("zhang");
t.setAge(76);
/**
* 根据主键更新实体全部字段,null值会被更新
* ==> Preparing: UPDATE teacher SET id = id,name = ?,age = ? WHERE id = ?
* ==> Parameters: null, 76(Integer), 1(Integer)
*/
int updateByPrimaryKey = teacherDao.updateByPrimaryKey(t);
/**
* 根据主键更新属性不为null的值
* ==> Preparing: UPDATE teacher SET id = id,age = ? WHERE id = ?
* ==> Parameters: 76(Integer), 1(Integer)
*/
int updateByPrimaryKeySelective = teacherDao.updateByPrimaryKeySelective(t);
/**
* 根据Condition条件更新实体`record`包含的全部属性,null值会被更新
* ==> Preparing: UPDATE teacher SET id = id,name = ?,age = ? WHERE ( name = ? )
* ==> Parameters: null, 76(Integer), xxx(String)
*/
Condition condition = new Condition(Teacher.class);
Condition.Criteria criteria = condition.createCriteria();
criteria.andEqualTo("name","xxx");
teacherDao.updateByCondition(t,condition);
/**
* 根据Condition条件更新实体`record`包含的不是null的属性值
* ==> Preparing: UPDATE teacher SET id = id,age = ? WHERE ( name = ? )
* ==> Parameters: 76(Integer), xxx(String)
*/
teacherDao.updateByConditionSelective(t,condition);
return 0;
}
}
Dao:TeacherDao.java
package com.example.mapper.modules.dao;
import com.example.mapper.base.BaseMapper;
import com.example.mapper.modules.entity.Teacher;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @Description 正常的mybatis使用mapper.xml的方式编写sql语句
*
*/
@Mapper
@Repository
public interface TeacherDao extends BaseMapper<Teacher> {
}
sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`id` int(9) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(3) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, 'gb', 76);
SET FOREIGN_KEY_CHECKS = 1;
注意
Condition condition = new Condition(UserEntity.class); Condition.Criteria criteria = condition.createCriteria(); criteria.andEqualTo("key","123");
Condition相关的条件字段对应的是UserEntity实体类的属性,不是数据库中的字段名称,如:
key是UserEntity中的属性名,而数据库字段为KEY。