technology-note/springboot系列/数据库/springboot整合mybatis.md

387 lines
78 KiB
Markdown
Raw Normal View History

2018-07-31 00:53:37 +08:00
## 写在前面
刚毕业的第一份工作是java开发项目中需要用到mybatis特此记录学习过程这只是一个简单demomybatis用法很多不可能全部写出来有更复杂的需求建议查看mybatis的官方中文文档[点击跳转](http://www.mybatis.org/mybatis-3/zh/index.html)。下面时项目环境/版本。
- 开发工具IDEA
- jdk版本1.8
- springboot版本2.03
其他依赖版本见下面pom.xml:
```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>mybatis-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mybatis-test</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</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-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--alibaba连接池依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!--分页依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</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>
```
## 1.创建项目
使用idea中的spring initializr生成maven项目项目命令为mybatis-test选择webmysqlmybatis依赖即可成功。详细过程不赘述如有需要学习springboot创建过程可参考[这篇文章]()。
然后依照上面的pom文件补齐缺少的依赖。接着创建包entityservice和mybatis映射文件夹mapper创建。为了方便配置将application.properties改成application.yml。由于我们时REST接口故不需要static和templates目录。修改完毕后的项目结构如下
![pic][pic1]
修改启动类,增加`@MapperScan("com.example.mybatistest.dao") `,以自动扫描dao目录避免每个dao都手动加`@Mapper`注解。代码如下:
```java
@SpringBootApplication
@MapperScan("com.example.mybatistest.dao")
public class MybatisTestApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisTestApplication.class, args);
}
}
```
修改application.yml,配置项目,代码如下:
```yml
mybatis:
#对应实体类路径
type-aliases-package: com.example.mybatistest.entity
#对应mapper映射文件路径
mapper-locations: classpath:mapper/*.xml
#pagehelper物理分页配置
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: count=countSql
returnPageInfo: check
server:
port: 8081
spring:
datasource:
name: mysqlTest
type: com.alibaba.druid.pool.DruidDataSource
#druid连接池相关配置
druid:
#监控拦截统计的filters
filters: stat
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: 123456
#配置初始化大小,最小,最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 6000
#间隔多久检测一次需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中的最小生存时间
min-evictable-idle-time-millis: 300000
#打开PSCache并指定每个连接上PSCache的大小。oracle设置为truemysql设置为false。分库分表设置较多推荐设置
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
http:
encoding:
charset: utf-8
enabled: true
```
## 2.编写代码
首先创建数据表sql语句如下
```sql
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` tinyint(4) NOT NULL DEFAULT '0',
`password` varchar(255) NOT NULL DEFAULT '123456',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
```
然后在entity包中创建实体类User.java
```java
public class User {
private int id;
private String name;
private int age;
private String password;
public User(int id, String name, int age, String password) {
this.id = id;
this.name = name;
this.age = age;
this.password = password;
}
public User(){}
//getter setter自行添加
}
```
在dao包下创建UserDao.java
```java
public interface UserDao {
//插入用户
int insert(User user);
//根据id查询
User selectById(String id);
//查询所有
List<User> selectAll();
}
```
在mapper文件夹下创建UserMapper.xml,具体的xml编写方法查看文首的官方文档。
```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.example.mybatistest.dao.UserDao">
<sql id="BASE_TABLE">
user
</sql>
<sql id="BASE_COLUMN">
id,name,age,password
</sql>
<insert id="insert" parameterType="com.example.mybatistest.entity.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO <include refid="BASE_TABLE"/>
<trim prefix="(" suffix=")" suffixOverrides=",">
name,password,
<if test="age!=null">
age
</if>
</trim>
<trim prefix=" VALUE(" suffix=")" suffixOverrides=",">
#{name,jdbcType=VARCHAR},#{password},
<if test="age!=null">
#{age}
</if>
</trim>
</insert>
<select id="selectById" resultType="com.example.mybatistest.entity.User">
select
<include refid="BASE_COLUMN"/>
from
<include refid="BASE_TABLE"/>
where id=#{id}
</select>
<select id="selectAll" resultType="com.example.mybatistest.entity.User">
select
<include refid="BASE_COLUMN"/>
from
<include refid="BASE_TABLE"/>
</select>
</mapper>
```
至此使用mybatis的代码编写完了之后要用时调用dao接口中的方法即可。
## 3.测试
我们通过编写servicecontroller然后使用postman进行测试。
首先编写UserService.java,代码如下:
```java
@Component
public class UserService {
@Autowired
private UserDao userDao;
public User getByUserId(String id){
return userDao.selectById(id);
}
//获取全部用户
public List<User> getAll(){
return userDao.selectAll();
}
//测试分页
public PageInfo<User> getAll(int pageNum,int pageSize){
PageHelper.startPage(pageNum,pageSize);
List<User> users = userDao.selectAll();
System.out.println(users.size());
PageInfo<User> result = new PageInfo<>(users);
return result;
}
public int insert(User user){
return userDao.insert(user);
}
}
```
编写UserController.java
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/{userId}")
public User getUser(@PathVariable String userId){
return userService.getByUserId(userId);
}
@GetMapping("/user")
public List<User> getAll(){
return userService.getAll();
}
@GetMapping("/user/page/{pageNum}")
public Object getPage(@PathVariable int pageNum,
@RequestParam(name = "pageSize",required = false,defaultValue = "10") int pageSize){
return userService.getAll(pageNum,pageSize);
}
@PostMapping("/user")
public Object addOne(User user){
userService.insert(user);
return user;
}
}
```
启动项目通过postman进行请求测试测试结果如下
- 插入数据:
![插入][insert]
- 查询数据
![查询][select]
- 分页查询
![分页查询][selectPage]
## 4.注解编写sql
上面使用的是xml方式编写sql代码其实mybatis也支持在注解中编写sql这样可以避免编写复杂的xml查询文件但同时也将sql语句耦合到了代码中也不易实现复杂查询因此多用于简单sql语句的编写。
要使用注解首先将applicaton.yml配置文件中的`mapper-locations: classpath:mapper/*.xml`注释掉。然后在UserDao.java中加入sql注解代码如下
```java
public interface UserDao {
//插入用户
@Insert("insert into user(name,age,password) value(#{name},#{age},#{password})")
@Options(useGeneratedKeys=true,keyColumn="id",keyProperty="id")
int insert(User user);
//根据id查询
@Select("select * from user where id=#{id}")
User selectById(String id);
//查询所有
@Select("select * from user")
List<User> selectAll();
}
```
然后重新启动项目测试,测试结果跟上面完全一样。
```
如果对你有帮助记得点赞、收藏哦!
```
[pic1]:data:image/png;base64,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
[insert]:data:image/jpeg;base64,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
[select]:data:image/jpeg;base64,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
[selectPage]:data:image/jpeg;base64,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