整合MyBatis操作数据库
- 官方GitHub地址:https://github.com/mybatis
starter场景启动器有两种
SpringBoot官方的Starter:spring-boot-starter-*
第三方的: *-spring-boot-starter
- 默认是使用spring的JdbcTemplate来操控数据库
- 如果自己引入了其他的来操作数据库,就会使用自己配置的来操作数据库
3.1 、第一步 引入MyBatis的starter 和MySql的依赖
- 当引入场景启动器的时候,就帮我们配置好了很多的组件放到了容器中
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
- starter帮我们自动注入了哪些组件???
- SqlSessionFactory: 自动配置好了
- SqlSession:自动配置了SqlSessionTemplate 组合了SqlSession
- Mapper:只要我们写的操作MyBatis的接口标准了 添加@Mapper 就会被自动扫描进容器
- 代理生成的bean扫描到容器(或者使用@MapperScan指定接口位置包)
3.2 、编写配置文件
1、xml文件方式整合MyBatis
- 指定好
MyBatis 的 主配置文件
- 和
接口的 映射配置文件
- 的位置
对于Mybatis配置的修改:
方法一: 直接在Mybatis的主配置文件上修改
方法二: 在SpringBoot的application配置
对 Dao接口 添加 @Mapper注解
- ,告诉Mybatis这里是一个Mapper接口,并且
代理后的对象扫描进容器
- 其他的正常使用Mybatis就可以
spring.datasource.url=jdbc:mysql://localhost:3306/zhangyang?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=015718
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#MyBatis 的配置
#主配置文件位置
mybatis.config-location=classpath:MyBatis/mybatis_config.xml
#映射配置文件位置(通过这个找到映射配置文件 通过注解找到接口 -->名字相同,对应起来 )
mybatis.mapper-locations=classpath:MyBatis/mapper/*.xml
# mybatis.configuration. 开头的制定全局的配置项 (具体有什么配置,看MyBatis官网)
#可以不写全局;配置文件,所有全局配置文件的配置都放在configuration配置项中即可
xml方式整合Mybatis步骤总结:
- 1、导入mybatis官方starter 和 MySQL驱动
2、编写主配置文件(可以不写,直接在application配置文件设置属性)
- 、创建好MyBatis的相关目录
- 3、在
application.yaml中指定Mapper配置文件(可以不指定)、Mybatis主配置文件的位置
- ,以及指定全局配置文件的信息 (建议;配置在mybatis.configuration)
- 4、编写mapper接口。标准@Mapper注解
(代理生成的对象扫描进容器)
- 5、编写sql映射文件并绑定mapper接口
2、纯注解的方式整合MyBatis
- 适用于简单的查询,不使用于复杂的多表查询
纯注解方式整合Mybatis步骤总结:
- 导入mybatis官方starter 和 MySQL驱动 (可以使用创建SpringBoot的时候,选MyBatis)
- 写好 Mapper接口,在接口方法上方标注注解查询
- 在接口标注 @Mapper注解
public interface CityMapper {
("select * from city where id=#{id}")
public City getById(Long id);
public void insert(City city);
}
3、混合方式整合MyBatis
混合方式整合Mybatis步骤总结:
- 引入mybatis-starter场景启动器 和 MySQL驱动
- 配置application.yaml中,指定主配置文件位置、Mapper映射文件位置即可
- 编写Mapper接口并标注@Mapper注解
- 简单方法直接注解方式
- 复杂方法编写mapper.xml进行绑定映射
@MapperScan
("com.zy.boot.mapper") 简化,Mapper接口就可以不用标注@Mapper注解
- @MapperScan 扫描Mapper接口包 放到入口程序类上
4、整合 MyBatis-Plus 完成CRUD
1、什么是MyBatis-Plus
简介
- MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
- mybatis plus 官网参考学习MyBatis-plus
- 建议安装 MybatisX 插件
Mybatis-Puls的优点:
- 只需要我们的Mapper继承BaseMapper 就可以拥有crud能力,对于简单的crud可以不用再写
2、整合MyBatis-Plus
- 第一步:引入场景启动器即可和MySql驱动(springboot帮我们做好自动配置)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
第二步:配置好数据源
spring.datasource.url=jdbc:mysql://localhost:3306/zhangyang?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=015718
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
自动配置分析
- MybatisPlusAutoConfiguration 配置类,MybatisPlusProperties 配置项绑定。mybatis-plus:xxx 就是对mybatis-plus的定制
- SqlSessionFactory 自动配置好。底层是容器中默认的数据源
- mapperLocations 自动配置好的。有默认值。classpath*:/mapper/**/*.xml;任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。 建议以后sql映射文件,放在 mapper下
- 容器中也自动配置好了 SqlSessionTemplate
- @Mapper 标注的接口也会被自动扫描;建议直接 @MapperScan("com.atguigu.admin.mapper") 批量扫描就行
3、简单的CRUD功能
- MyBatis-Plus的基本使用
- 在映射接口上,标注@Mapper,对于简单的CRUD可以不用写映射,mapper接口直接继承基类BaseMapper
- BaseMapper基类:
- 帮我们写好了很多的CRUD方法
- 在基类以泛型的形式传入要操作的Bean(通过该数据类型找对应的数据库表)
- 默认通过对应的Bean找数据库相应的表
- @TableName在bean上指定映射的数据库表名(可以通过其指定)
- bean对象的所有属性都应该在数据库中有,且和mybatis一样一一对应
- @TableField 字段注解(非主键) 里面可以指定该bean类中的属性是否为表中的字段
- @TableId 主键注解(可不标注)
- MyBatis-Plus 可以简化service层的实现类的编写
- 实现顶级IService接口 或者 继承顶级接口的实现类ServiceImpl
- ServiceImpl<对应的Mapper,返回的数据类型> 基本什么第不用写,这个类中定义好了很多的方法,可以直接使用
- MyBatis-Plus分页功能
- 配置分页拦截器: PaginationInnerInterceptor 把分页拦截器 把分页拦器添加到mybatis-plus的拦截器中
- 设置分页对象 及其属性:Page<User> userPage = new Page<>(pn,2);
- 使用Mybatis-Plus的分页查询功能
- 使用 userServiceImpl 调用page 方法
- (传入 分页对象 和 查询条件 ) 得到分页查询结果
- Page<User> page = userServiceImpl.page(userPage, null); 该对象中有总页码,每页显示条数,当前页码,查询的所有记录等等信息
- 把 page传到 html中使用
- 结合 thymeleaf 中的方法 ,实现分页功能
//bean层
("user1")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
-----------------------------------------------------------------------------------------
//Mapper层
public interface UserMapper extends BaseMapper<User> {
}
------------------------------------------------------------------------------------------
//service层
public interface UserService {
}
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
//虽然我们的UserService没有规定什么方法,但是ServiceImpl已经写好了很多的方法
}
------------------------------------------------------------------------------------------
//controller层
public class UserSqlController {
UserMapper userMapper;
UserServiceImpl userServiceImpl;
("/text1")
public String text1(HttpServletRequest request){
User user = userMapper.selectById(1);
request.setAttribute("userString",user.toString());
return "success";
}
//分页功能+查询所有
("/text2")
public String text2( (value = "pn",defaultValue ="1")Integer pn,
Model model){
List<User> list = userServiceImpl.list();
// model.addAttribute("userAll",list);
//设置分页对象 每页的大小和当前页
Page<User> userPage = new Page<>(pn,2);
//使用Mybatis-Plus的分页查询功能(传入 分页对象 和 查询条件)的到分页查询结果
//该对象中有总页码,每页显示条数,当前页码,查询的所有记录等等信息
Page<User> page = userServiceImpl.page(userPage, null);
model.addAttribute("page",page);
// return "success"; //在过一遍text1方法,把上面方法传到页面的内容要带上
return "forward:/text1";
}
-----------------------------------------------------------------------------------------
//config包(配置分页拦截器)
public class MyBatisPlusConfig {
//配置分页拦截器
public MybatisPlusInterceptor paginationInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//设置分页拦截器,及其相关过的属性
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setOverflow(true); //最大单页设置
paginationInnerInterceptor.setMaxLimit(500L);//每页最大数
//把分页拦截器配置到Mybatis-plus的拦截器中
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
}
-----------------------------------------------------------------------------------------
//html视图
<h1>恭喜你,访问成功</h1>
<p th:text="${userString}"></p>
<p th:text="${userAll}"></p>
<table>
<tr>
<th>id</th>
<th>name</th>
<th>age</th>
<th>email</th>
</tr>
<tr th:each="user,stat:${page.records}">
<th th:text="${stat.count}">1</th>
<th th:text="${user.name}">2</th>
<th th:text="${user.age}">3</th>
<th th:text="${user.email}">4</th>
</tr>
</table>
<div>
<div class="a" > 当前是第[[${page.current}]]页,总计[[${page.pages}]]页,共有 [[${page.total}]]条记录</div>
<button th:each="num:${#numbers.sequence(1,page.pages)}" />[[${num}]]
<ul>
<li>上一页</li>
<!--一共几页写几页,并且当前页的块有颜色变化-->
<li th:each="num:${#numbers.sequence(1,page.pages)}" th:class="${num == page.current?'b':''}">
<!-- 使用了thymeleaf的动态传入参数:后面跟上小括号,里面是参数的值 -->
<a th:href="@{/text2(pn=${num})}">[[${num}]]</a>
</li>
<li>下一页</li>
</ul>
</div>