Spring Boot开发之Mybatis
一、Mybatis
1、基本信息
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
2、背景介绍
1.MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
2.每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
3.用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
3、特点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的ORM字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
4、功能架构
我们把Mybatis的功能架构分为三层:
1.API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2.数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3.基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
二、入门案例–增删改查
1、打开之前的学习中已经创建过的数据库,打开上次的项目
2、在pom.xml中导入依赖包
<!-- 引入mybatis包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 引入mysql包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
3、在resources文件夹下新建mappers文件夹
4、在application.properties中配置连接,数据库端口、名称、用户名、密码和包名改成自己的,否则连接不到数据库
#配置连接
#数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接地址
spring.datasource.url=jdbc:mysql://localhost:3307/springboot?characterEncoding=utf8&serverTimezone=UTC
# 用户名和密码
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.name=defaultDataSource
#mybatis配置 sql写到配置文件
#实体类包
mybatis.type-aliases-package=com.example.springbooot.pojo
# sql配置文件xml路径
mybatis.mapper-locations=classpath:mappers/*.xml
#日志输出路径
logging.level.com.example.springbooot=debug
5、查询数据库
(1)dao层新建PersonMapper接口
package com.example.springbooot.dao;
import com.example.springbooot.pojo.Person;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
//mybatis dao层实现类写到配置文件中
@Mapper
public interface PersonMapper {
public List<Person> findAllPerson();
}
(2)在mappers文件夹下新建PersonMapper.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.springbooot.dao.PersonMapper">
<!-- id 接口中方法的名字 resultType返回值的类型 集合对象 可以省略集合-->
<select id="findAllPerson" resultType="com.example.springbooot.pojo.Person">
select * from class
</select>
</mapper>
(3)service层新建PersonService接口,新建impl文件夹,并在impl文件夹下新建PersonServiceImpl实现类
package com.example.springbooot.service;
import com.example.springbooot.pojo.Person;
import java.util.List;
public interface PersonService {
public List<Person> findAllPerson();
}
package com.example.springbooot.service.impl;
import com.example.springbooot.dao.PersonMapper;
import com.example.springbooot.pojo.Person;
import com.example.springbooot.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
PersonMapper personMapper;
@Override
public List<Person> findAllPerson(){
return personMapper.findAllPerson();
}
}
(4)controller层新建PersonController类
package com.example.springbooot.controller;
import com.example.springbooot.pojo.Person;
import com.example.springbooot.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PersonController {
@Autowired
PersonService personService;
@RequestMapping("personlist")
public String personlist(Model model){
model.addAttribute("personlist",personService.findAllPerson());
return "personlist.html";
}
}
(5)在templates文件夹下新建personlist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table border="1">
<tr>
<td>用户id</td>
<td>用户年龄</td>
<td>用户姓名</td>
</tr>
<tr th:each="person:${personlist}">
<td th:text="${person.id}">用户id</td>
<td th:text="${person.age}">用户年龄</td>
<td th:text="${person.name}">用户姓名</td>
</tr>
</table>
</body>
</html>
(6)点击运行,数据库数据访问成功
6、删除用户
(1)修改dao层PersonMappe接口类
public int deletePersonById(Integer id);
(2)修改PersonMapper.xml
<delete id="deletePersonById" parameterType="Integer">
delete from class where id=#{id}
</delete>
(3)修改PersonService接口类
public int deletePersonById(Integer id);
(4)修改PersonServiceImpl实现类
@Override
public int deletePersonById(Integer id) {
return personMapper.deletePersonById(id);
}
(5)修改perosnlist.xml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table border="1">
<tr>
<td>用户id</td>
<td>用户年龄</td>
<td>用户姓名</td>
<td>删除</td>
</tr>
<tr th:each="person:${personlist}">
<td th:text="${person.id}">用户id</td>
<td th:text="${person.age}">用户年龄</td>
<td th:text="${person.name}">用户姓名</td>
<th>
<a th:href="@{'/deletepersonbyid?id='+${person.id}}">删除用户</a>
</th>
</tr>
</table>
</body>
</html>
(6)修改PersonController类
@RequestMapping("deletepersonbyid")
public String deletePersonbyid(int id){
personService.deletePersonById(id);
return "redirect:/personlist";
}
(7)点击运行,可以进行删除操作啦,数据库会同步更新数据
7、增加用户
(1)修改dao层PersonMapper接口类
public int addPerson(Person person);
(2)修改PersonMapper.xml
<!--<!–如果参数是对象类型 对象类型可以省略–>-->
<insert id="addPerson" parameterType="com.example.springbooot.pojo.Person">
insert into class(name,age) values (#{name},#{age})
</insert>
(3)修改PersonService接口类
public int addPerson(Person person);
(4)修改PersonServiceImpl实现类
@Override
public int addPerson(Person person) {
return personMapper.addPerson(person);
}
(5)在templates文件夹下新建addPerson.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>增加用户</h1>
<form th:action="@{/addpersoncommit}" method="post">
<div>用户名:<input name="name"></div>
<div>年龄:<input name="age"></div>
<div><input type="submit" value="提交"></div>
</form>
</body>
</html>
(6)修改PersonController类
@RequestMapping("addperson")
public String addperson(){
return "addPerson.html";
}
@RequestMapping("addpersoncommit")
public String addpersoncommit(Person person){
personService.addPerson(person);
return "redirect:/personlist";
}
(7)点击运行,访问addperson路径,输入用户名和密码增加用户到perosnlist页面
8、更新用户
(1)修改dao层PersonMapper接口类
public int updatePerson(Person person);
(2)修改PersonMapper.xml
<update id="updatePerson" parameterType="com.example.springboot2.pojo.Person">
update class
set name=#{name},age=#{age}
where id=#{id}
</update>
(3)修改PersonService接口类
public int updatePerson(Person person);
(4)修改PersonServiceImpl实现类
@Override
public int updatePerson(Person person) {
return personMapper.updatePerson(person);
}
(5)修改personlist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<a th:href="@{/addperson}">增加页面</a>
<table border="1">
<tr>
<td>用户id</td>
<td>用户年龄</td>
<td>用户姓名</td>
<td>删除</td>
<td>更新</td>
</tr>
<tr th:each="person:${personlist}">
<td th:text="${person.id}">用户id</td>
<td th:text="${person.age}">用户年龄</td>
<td th:text="${person.name}">用户姓名</td>
<th>
<a th:href="@{'/deletepersonbyid?id='+${person.id}}">删除用户</a>
</th>
<th>
<a th:href="@{/updateperson(id=${person.id},age=${person.age},name=${person.name})}">更新用户</a>
</th>
</tr>
</table>
</body>
</html>
(6)在tmplates文件夹下新建updateperson.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>
更新页面
</h1>
<form th:action="@{/updatepersoncommit}" method="post">
<div>id:<input name="id" th:value="${id}"></div>
<div>用户名:<input name="name" th:value="${name}"></div>
<div>年龄:<input name="age" th:value="${age}"></div>
<div><input type="submit" value="提交"></div>
</form>
</body>
</html>
(7)修改PersonController类
@RequestMapping("updateperson")
public String updateperson(Model model,Person person){
model.addAttribute("id",person.getId());
model.addAttribute("age",person.getAge());
model.addAttribute("name",person.getName());
return "updateperson.html";
}
@RequestMapping("updatepersoncommit")
public String updatepersoncommit(Person person){
personService.updatePerson(person);
return "redirect:/personlist";
}
(8)点击运行,可以进行更新用户操作啦
利用Mybatis连接数据库进行增删改查就基本实现啦
9、resultmap属性:数据库字段和实体类字段不一致,进行手工配置
(1)修改PersonMapper.xml
<!--多表 resultMap 数据库字段和实体类字段不一致 手工配置-->
<select id="findAllPerson" resultMap="person">
select * from class
</select>
<resultMap id="person" type="com.example.springboot2.pojo.Person">
<!-- id 配置组件 column 数据库中列名字 property 实体类字段名-->
<id column="id" property="id"></id>
<result column="age" property="age"></result>
<result column="name" property="name"></result>
</resultMap>
(2)点击运行,同样可以增删改查
三、资源下载
下载地址:Spring Boot开发之Mybatis
向优秀的人优秀的行为学习!!!