整合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
#映射配置文件位置(通过这个找到映射配置文件 通过@Mapper注解找到接口 -->名字相同,对应起来
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注解


@Mapper
public interface CityMapper {

@Select("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注解





4、整合 MyBatis-Plus 完成CRUD

1、什么是MyBatis-Plus

简介


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层
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user1")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
-----------------------------------------------------------------------------------------
//Mapper层
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
------------------------------------------------------------------------------------------
//service层
public interface UserService {
}

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
//虽然我们的UserService没有规定什么方法,但是ServiceImpl已经写好了很多的方法
}
------------------------------------------------------------------------------------------
//controller层
@Controller
public class UserSqlController {
@Autowired
UserMapper userMapper;
@Autowired
UserServiceImpl userServiceImpl;

@GetMapping("/text1")
public String text1(HttpServletRequest request){
User user = userMapper.selectById(1);
request.setAttribute("userString",user.toString());
return "success";
}

//分页功能+查询所有
@GetMapping("/text2")
public String text2(@RequestParam(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包(配置分页拦截器)
@Configuration
public class MyBatisPlusConfig {

//配置分页拦截器
@Bean
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>