本文已参与「新人创作礼」活动,一起开启掘金创作之路。 今天开始将使用Mybatis得记录做一个总结,本篇介绍的是入门得增删改查说明及代码。
什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
ORM(Object relational mapping)类型框架的数据库操作发展到如今,我觉得就是两种分支,一种是以Hibernate为首的动态生成sql语句,可以少写代码,可移植性高,一种就是以Mybatis为首的纯sql操作,方言支持性差导致移植性差,但是运行效率高,灵活性高。两种各有优势,今天来看下在SpringBoot中集成Mybatis框架。
创建好一个新项目后,按照以下流程添加代码:
一、pom依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xing</groupId>
<artifactId>springBootMybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springBootMybatis</name>
<description>Mybatis project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<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-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
以上依赖没啥说的,正确导入即可。
二、建立实体,对应表字段
package com.xing.entity;
...
/**
* 实体
*/
@Data
public class UserEntity {
private Integer id;
private String userName;
private String passWord;
private String realName;
get
set
toString
...
}
三、mapper接口
package com.xing.mapper;
import com.xing.entity.UserEntity;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 面向接口
*/
@Repository
public interface UserMapper {
UserEntity getOne(int id);
@Select("SELECT * FROM user")
List<UserEntity> getAll();
@Select("SELECT * FROM user WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "userName", column = "userName")
})
UserEntity getOneById(Integer id);
@Insert("INSERT INTO user(id, userName, passWord, realName) VALUES(#{id}, #{userName}, #{passWord}, #{realName})")
void insert(UserEntity user);
@Update("UPDATE user SET id=#{id},userName=#{userName},passWord=#{passWord},realName=#{realName} WHERE id =#{id}")
void update(UserEntity user);
@Delete("DELETE FROM user WHERE id =#{id}")
void delete(Integer id);
}
此处是新建了一个接口,我们可以使用注解来编写SQL语句,也可以使用xml来映射对应的接口方法,如果不使用注解,比如下面这个方法并没有注解SQL语句,我们把语句写到xml配置中。
UserEntity getOne(int id);
resources包下建UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xing.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.xing.entity.UserEntity">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="userName" jdbcType="VARCHAR" property="userName" />
<result column="passWord" jdbcType="VARCHAR" property="passWord" />
<result column="realName" jdbcType="VARCHAR" property="realName" />
</resultMap>
<select id="getOne" resultType="com.xing.entity.UserEntity">
select * from user where id = #{id}
</select>
</mapper>
可以看到id="getOne" 和getOne(int id) 是一样的,通过映射可以建立关联关系。其他的使用了注解的就不需要了。
四、配置文件也贴一下:
server:
port: 8080
spring:
datasource:
username: 用户名
password: 密码
url: jdbc:mysql://localhost:3306/xinghua?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml
type-aliases-package: com.xing.entity
#showSql
logging:
level:
com:
example:
mapper : debug
五、将mapper扫描成组件
package com.xing;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.xing.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这里@MapperScan("com.xing.mapper")注解可以把mapper包下所有的接口扫描到,当然也可以设置多个:
@MapperScan({"com.xing.mapper1","com.xing.mapper2"})
我们也可以直接在Mapper接口类上面添加注解@Mapper,这种方式要求每一个mapper接口类都需要添加此注解,所以还是配置扫描的方式最好。
六、写个controller测试下
也可以写单元测试,我还是习惯接口测试
package com.xing.controller;
import com.xing.entity.UserEntity;
import com.xing.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 控制类
*/
@RestController
@RequestMapping("/user")
public class UserController {
final UserMapper userMapper;
@Autowired
public UserController(UserMapper userMapper) {
this.userMapper = userMapper;
}
/**
* 根据id获取一个user
* @param id id
* @return user
*/
@RequestMapping("/getOneById/{id}")
public String getOneById(@PathVariable int id){
return userMapper.getOne(id).toString();
}
/**
* 获取全部
* @return user list
*/
@RequestMapping("/getAll")
public String getAll(){
return userMapper.getAll().toString();
}
/**
* 新增
* @param user user
* @return ok
*/
@PostMapping("/insert")
public String insert(@RequestBody UserEntity user){
userMapper.insert(user);
return "ok";
}
/**
* 更新
* @param user user
* @return ok
*/
@PostMapping("/update")
public String update(@RequestBody UserEntity user){
userMapper.update(user);
return "update ok";
}
/**
* 删除
* @param id id
* @return ok
*/
@RequestMapping("/delete/{id}")
public String delete(@PathVariable int id){
userMapper.delete(id);
return "ok";
}
}
总结:
SpringBoot中集成Mybatis并使用简单的增删改查。
源码: