SpringBoot之整合Mybatis篇

开头语

啪嚓,醒木一拍(咳咳) ,上回书我们说到:SpringBoot的简单搭建,也就是SpringBoot的搭建流程,简单的将项目进行启动,本次,我们简单的把SpringBoot与持久层框架Mybatis进行整合,接下来,我们开始。

Mybatis名词解释

      万年不变的百度百科:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录 ;MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射。

      简单来说就是Mybtis是一个持久层框架,用来跟数据库交互,将JDBC的原生方法进行封装,使得开发人员更快的进行数据存储和数据查询,支持简单的复杂查询和增删改查操作,可以使用简单的XMl或者注解来将复杂的数据库关系和Java对象进行映射,支持一对一、一对多、多对多的映射关系,也支持将Java对象映射存库的功能,同样支持存储过程,侃侃而谈也就这样。

开始搭建

1.首先将pom文件进行加入mybatis依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- spingBoot整合Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<!-- 好用的分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>

2.此时将项目结构进行完善(如下图):

​ 1)com.yang.ben 用来存放Java中的实体类也就是POJO类

​ 2)com.yang.boot 用来存放SpringBoot的启动类

​ 3)com.yang.controller 用来存放项目对外暴露的控制器

​ 4)com.yang.dao 用来存放与数据库交互的mybatis的数据层的接口

​ 5)com.yang.service 用来存放业务处理的服务类的接口

​ 6)com.yang.service.impl 用来存放项目中的服务类的实现类

​ 7)com.yang.util 用来存放项目中的资助封装的工具类

​ 8)resource目录下创建mapper文件夹,为下面的Mybatis需要配置的xml文件创建目录

​ 9)完善项目的全局配置文件application.properties,SpringBoot工程的配置文件就在这里

3完善application.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#数据库连接池配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.platform=mysql
#配置数据源 用户名 密码 驱动
spring.datasource.url=jdbc:mysql://localhost:3306/yang
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#Mybatis配置
#扫描的实体的包
mybatis.typeAliasesPackage=com.yang.bean
#扫描的配置文件地址
mybatis.mapperLocations=classpath:mapper/*.xml
#mybatis全局配置文件的地址
mybatis.configLocation=classpath:mybatis-config.xml
#项目启动端口
server.port=8088

4.接下来在resource下面创建mybatis-config.xml,目的为配置分页插件PageHelper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 4.0.0以后版本可以不设置该参数 -->
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="true"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
<property name="pageSizeZero" value="true"/>
<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="false"/>
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
<!-- 不理解该含义的前提下,不要随便复制该配置 -->
<property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>
<!-- 支持通过Mapper接口参数来传递分页参数 -->
<property name="supportMethodsArguments" value="false"/>
<!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
</configuration>

5.接下来改造SpringBoot启动类,让启动类只负责启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.yang.boot;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication //SpringBoot启动类注解
@EnableAutoConfiguration //开启自动化配置
@ComponentScan("com.yang") //类似于Spring的基础类扫描包,用来扫描实体,接口和控制器
@MapperScan("com.yang.dao") //mybatis的接口扫描包
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}

6.此时在数据库中创建简单的表,并插入一条测试数据

1
2
3
4
5
6
7
8
9
-- 创建表
CREATE TABLE `t_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) DEFAULT NULL,
`pass_word` varchar(50) DEFAULT NULL,
PRIMARY KEY (`user_id`)
);
--插入测试数据
INSERT INTO `t_user` VALUES ('1', 'zhangsan', '00000');

7.此时在com.yang.bean下面创建表对应的实体类,并编写get,set方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.yang.bean;

/**
* 用户实体类
* @author Yang
*
*/
public class User {
/*用户名称*/
private int userId;
/*用户登录名称*/
private String userName;
/* 用户登录密码 */
private String password;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", password=" + password + "]";
}
}

8.继续创建dao层与数据库交互的接口,编写查询的抽象方法(mybatis支持面向接口开发)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.yang.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import com.yang.bean.User;

/**
* 用户登录数据层
* @author Yang
*
*/
@Mapper //标识为mybatis数据层接口
public interface UserDao {
/**
*模糊查询用户
* @param user
* @return
*/
List<User> getUser();
}

9.在resource目录下的mapper文件夹下创建与dao层接口名相同的Mapper文件,并编写select标签和查询sql,这个地方需要注意几个点

1)namespace必须是数据层接口的完整包名+接口名

2)select、insert、update、delete标签上的id,必须与接口中的抽象方法名保持一致

3)resultType为返回类型

1
2
3
4
5
6
7
8
<?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.yang.dao.UserDao">
<!-- 获得用户列表 -->
<select id="getUser" resultType="com.yang.bean.User">
select user_id userId,user_name userName,pass_word password from t_user
</select>
</mapper>

10.此时编写服务类接口和服务类的实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.yang.service;

import java.util.List;

import com.yang.bean.User;

/**
* 用户服务接口
* @author Yang
*
*/
public interface IUserService {
/**
*模糊查询所有用户
* @return
*/
List<User> getUser();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.yang.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.yang.bean.User;
import com.yang.dao.UserDao;
import com.yang.service.IUserService;

/**
* 服务实现
* @author Yang
*
*/
@Service //标识为服务类
public class UserServiceImpl implements IUserService {
//注入数据层接口
@Autowired
private UserDao userDao;

@Override
public List<User> getUser() {
return userDao.getUser();
}

}

11.编写统一的返回类型的实体类ResultObject,让项目所有接口返回按照规范返回,称为Result Model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.yang.bean;

public class ResultObject<T> {
private int code;
private String msg;
private T data;
private int count;

public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}

12.编写控制器,编写入口,让用户查询所有用户表的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.yang.controller;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.yang.bean.ResultObject;
import com.yang.bean.User;
import com.yang.service.IUserService;

/**
* @author Java小白
*
*/
@RestController //标识为返回类型为Json的控制器
public class UserController {
//自动注入服务类
@Autowired
private IUserService userService;
//标识请求地址
@RequestMapping("/helloworld")
public String helloWorld() {
return "helloworld";
}
//标识请求地址
@RequestMapping("/getuser")
public ResultObject<List<User>> getUsers() {
//查询用户列表
List<User> list= userService.getUser();
ResultObject<List<User>> rs=new ResultObject<List<User>>();
//状态码
rs.setCode(0);
//提示
rs.setMsg("查询成功");
//数据
rs.setData(list);
//条数
rs.setCount(list.size());
return rs;
}
}

13.此时来到我们的项目启动类,将项目启动,启动成功如下图

14.打开任意浏览器,地址栏输入localhost:8088/getuser,查看数据,成功获取

下载地址及声明

1.我们使用了mybatis的分页插件PageHelper,但是文中并未教大家如何使用,买个关子,下个帖子更新使用方法

2.项目下载地址:点击我下载,小心你的鼠标