开发者学堂课程【SpringBoot 实战教程: SpringBoot 整合 Mybatis(xml 方式)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10799
SpringBoot 整合 Mybatis(xml 方式)
1、使用 xml 文件方式整合 mybatis,需要做相关 jar 包的依赖,首先创建一个工程,整合web,这是和 mybatis 相关依赖,用的数据库是 mysql,所以要把 mysql 的jar包也进行依赖,使用阿里的 druid 连接池,在案例中写一个分页的功能,再用一个 mybatis 的分页插件,pagehelper 对应的依赖,
<!--springboot 整合 mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--alibaba 的 druid 数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
这就是用到的相关的依赖。
2、既然整合 mybatis,必然要操作数据库,首先确定要操作的数据库,还是db1,操作用户表,有 id,name,password,email,birthday 五个字段,首先做准备工作,因为整合 mybatis,先用xml配置文件的方式,所以先创建 mybatis 的配置文件。配置文件放在 resources,创建一个文件夹,命名为 mybatis。
3、把 mybatis 配置文件放在 mybatis 文件夹下,命名为 mybatis-config.xml。
4、把以下代码拷贝到 mybatis-config.xm 配置文件中,
Mybatis 配置文件:
<?Xml
version="1.0"encoding="UTF-8"?>
<!DOCTYPE
configuration
PUBLIC"-//mybatis.org//DTD
Config3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
5、配置数据源,配置连接池,配置 Mybatis 以及配置分页插件。这些都在全局配置文件中配置,创建全局配置文件,命名为 application.yml。使用 yml 格式。
6、配置 druid 连接池,以下是它的写法,下面都是为了提升连接池性能相关的属性,上面是驱动,用户名,密码,url,db1数据库,指明 alibaba 的 druid 连接池对应的数据源的 class。这是关于数据源属性的配置:
spring:
datasource:
name:test
url:jdbc:mysql://127.0.0.1:3306/db1
username:root
password:root
type:com.alibaba.druid.pool.DruidDataSource
driver-class-name:com.mysql.jdbc.Driver
filters:stat
maxActive:20
initialSize:1
maxWait:60000
minIdle:1
timeBetweenEvictionRunsMillis:60000
minEvictableIdleTimeMillis:300000
validationQuery:select'x'
testWhileIdle:true
testOnBorrow:false
testOnReturn:false
poolPreparedStatements:true
maxOpenPreparedStatements:20
7、要操作 db1数据库中 users 表,通常需要使用逆向工程生成对应的pojo以及 mapper,已经创建好对应用户表的 pojo 以及对应它的 mapper,直接用即可。创建包命名为 com.db1.pojo。它是逆向工程生成的,所以有对应的 example。mapper 的包名叫 com.db1.mapper。
8、逆向生成有一个 mapper 的接口,还有一个 mapper 对应的映射文件,就是 xml 配置文件,在 springboot 里面整合mybatis,需要把 usersmapper.xml 配置文件放在 resources 下,创建一个文件夹方便区分,命名为 mapping。只需要留接口即可,把之前的配置文件删除。
9、已经准备好 pojo,mapper 接口以及 mapper 映射文件和 mybatis 配置文件。和 mybatis 相关的配置,比如让 springboot 知道 mapper.xml 在这里,mybatis 配置文件在这里。这些需要在全局配置文件中进行配置。
10、把以下代码拷贝到 application 中,告诉 springboot Mybatis 配置文件在哪,放在 resources 下 mybatis 下的 mybatis-config.xml。把 mapping 映射文件放在 mybatis 下。
配置文件
Mybatis 的配置:
mybatis:
mapper-locations:classpath:mapping/UsersMapper.xml
#type-aliases-package:com.db1.pojo
如果用别名就用这个属性,如果不使用别名可以删除
config-location:classpath:mybatis/mybatis-config.xml
11、分页插件也进行配置,使用的是 PageHelper,这是对应 Helper 的属性配置,这里面指明了方言,对应的是 mysql 数据库,报错是因为有空格,删除即可。此时准备工作就已经完成。
PageHelper 分页插件:
pagehelper:
helperDialect:mysql
reasonable:true
supportMethodsArguments:true
params:count=countSql
12、具体的功能,mapper 用的是逆向工程生成的,相当于第o层,已经生成了一部分基本的增删改查功能。下面从 service 开始写,首先创建一个包,命名为 com.qianteng.service。
13、再创建一个接口,命名为 UsersService。
14、写两个功能,第一个功能是添加用户,第二个功能是分页查找用户,分页查找因为已经配置了 pagehelper,所以可以借助 pagehelper 实现用户的分页查找,要知道当前是第几页,以及每一页显示多少条记录,所以两个参数分别是 page 和 rows。
package
com. qianfeng. service;
import java.util .List;
import com.db1 .pojo.Users;
public interface UsersService
{
/ /添加用户
void addUser (Users user) ;
//
分页查找用户
List<Users> findUsers (int page, int
rows) ;
}
15、写 service 实现类,命名为 UsersServicelmpl.java 添加接口 usersservice。
16、首先加入 service 注解。实现两个功能,service 实现用户的添加以及用户的查找,必然要调用 mapper,因为要操作的是一张表,在逆向生成的 mapper 中这些功能都是存在的。首先注入 usersmapper,实现用户添加,直接用逆向工程中生成的 insert 功能即可。
@Autowired
private UsersMapper usersMapper ;
@Override
public void addUser (Users user)
{
usersMapper. insert (user) ;
}
@Override
public List<Users> findUsers (int page, int
rows)
{
/ / TODO Auto-generated method stub
return nul
l
;
}
17、分页查找,查找当前页上需要展示的用户,借助于 pagehelper,pagehelper 的原理是只需要做查询所有,pagehelper 相当于一个拦截器,把当前页 rows 告诉它,查出来的就是当前页了。借助逆向工程里 selectByExample,这时相当于无条件查询,需要构造 User sExample,这也是逆向生成的,只要 Example 不给它配置条件,就相当于是查询所有,返回的是 users 集合,在查询所有之前使用 pagehelper.startPage,这时查询的就是当前页上的记录,最后返回集合。
private UsersMapper usersMapper;
@Override
public void addUser (Users user)
{
usersMapper. insert (user) ;
}
@Override
public List<Users> findUsers (int page,int rows)
{
UsersExample example = new
Users Example () ;
PageHelper. startPage (page ,
rows )
List<Users> users = user sMapper . selectByExample (example) ;
return
users
;
}
这就是这两个功能的实现。
18、创建,命名为 UsersController。加入注解,因为有两个功能,所以写两个方法,第一个是用户添加,进行 service 注入。Saveusers 可以接收页面上要添加的用户信息,构建 users 对象,返回一个字符串,返回 success。
package com. qianfeng . controller;
import org . springframework. stereotype . Controller;
import com. qianfeng. service.UsersService;
@Controller
public class
u
sersController
{
@Autowired
private UsersService usersService ;
@RequestMapping("/ saveUser")
@ResponseBody
public String saveUsers ()
{
Users
user = new
Users () ;
user . setName ("
小红
") ;
user . setPassword("7777") ;
user . setEmail ("xiaohong@163. com") ;
user . setBirthday (new Date() ) ;
usersService . addUser (user) ;
Return
"success" ;
}
19、分页需要接收 page 和 rows,接收到的两个值都要赋给相应的 page 和 rows,需要使用注解 PathVariable,最后返回的是查询页的用户,让它以阶层格式返回,加上 ResponseBody,调用 usersService . findUsers。
@RequestMapping("/ findUsers/ (page)/
(
rows)")
@ResponseBody
public List<Users> findUsers (@PathVariable int page, @PathVariable
int
rows
)
{
return usersService. findUsers (page, rows) ;
}
20、启动类涉及到 service,涉及到 controller,还涉及到 mapper,最好要考虑mapper 对象的创建,controller 对象的创建,service 对象的创建,进行扫描,service 和 controller 共同的包是 com.qianfeng,它就会扫描到 service 和 controller,因为它会扫描下面的子包,mapper 需要单独扫描,需要使用注解 mapperscan,指明 mapper 所在的包 com. db1. mapper。
21、启动,添加了一个小红,访问路径是 saveuser,返回的是 success 字符串,说明添加成功。
22、在表里面可以看到小红7777。
23、分页功能的路径是 findusers,需要 page 和 rows,输入 localhost:8080/findUsers/1/3
,可以看到返回了三个用户,第一个是 zhangsan,第二个是 lisi,第三个是 wangwu,在表格中看前三个也是 zhangsan、lisi、wangwu。