说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。
前言
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
01—Mybatis的特点
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
02—Mybatis的优缺点
1.sql语句与代码分离,存放于xml配置文件中:
优点:便于维护管理,不用在java代码中找这些语句;
缺点:JDBC方式可以用用打断点的方式调试,但是Mybatis不能,需要通过log4j日志输出日志信息帮助调试,然后在配置文件中修改。
2.用逻辑标签控制动态SQL的拼接:
优点:用标签代替编写逻辑代码;
缺点:拼接复杂SQL语句时,没有代码灵活,拼写比较复杂。不要使用变通的手段来应对这种复杂的语句。
3.查询的结果集与java对象自动映射:
优点:保证名称相同,配置好映射关系即可自动映射或者,不配置映射关系,通过配置列名=字段名也可完成自动映射。
缺点:对开发人员所写的SQL依赖很强。
4.编写原声SQL:
优点:接近JDBC,比较灵活。
缺点:对SQL语句依赖程度很高;并且属于半自动,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。
接下来我们将使用springboot以xml配置的方式整合mybatis,并完成测试!!!小伙伴们准备好,又要发车咯!!
03—创建user表用于测试
user表结构如下:(因为是用于测试的表,我们尽量设计的简单一点,仅有两个字段,自增主键字段id,与name字段。)
04—依赖文件pom.xml
pom内容如下:(主要引入三个依赖,mysql的驱动依赖、mybatis的依赖、web项目依赖,具体可以参考以下代码)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>test-mybatis2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test-mybatis2</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
05—创建user表的实体类对象
User.java
package com.example.testmybatis2.entity;
/**
* <p>user表的实体类</p>
* @author Bosen 2021/6/6 12:59
*/
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
06—创建user表的映射定义接口
UserMapper.java
package com.example.testmybatis2.mapper;
import com.example.testmybatis2.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* <p>定义操作user表的接口</p>
* @author Bosen 2021/6/6 13:01
*/
@Repository
@Mapper
public interface UserMapper {
/*
* 查找user表的所有数据
*/
List<User> findAll();
/*
* 通过id删除
*/
int deleteById(int id);
/*
* 插入数据
*/
int insert(int id, String name);
/*
* 通过id修改name
*/
int updateNameById(int id, String name);
}
07—user表的映射配置文件
UserMapping.xml(注意:标签中的id值需要与UserMapper接口定义的方法名一致!!)
<?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.testmybatis2.mapper.UserMapper">
<select id="findAll" resultType="com.example.testmybatis2.entity.User">
select * from `user`;
</select>
<delete id="deleteById">
delete from `user` where id = #{id};
</delete>
<update id="updateNameById">
update `user` set `name` = #{name} where id = #{id};
</update>
<insert id="insert">
insert into `user`(id, `name`) values(#{id}, #{name});
</insert>
</mapper>
08—项目配置文件
application.yml
server:
port: 80
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
mybatis:
mapper-locations: classpath:/static/mapping/*Mapping.xml
09—项目结构图
测试
编写测试类TestMybatis2ApplicationTests.java
package com.example.testmybatis2;
import com.example.testmybatis2.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TestMybatis2ApplicationTests {
@Autowired
UserMapper userMapper;
/*
* 查找
*/
@Test
void selectTest() {
System.out.println(userMapper.findAll());
}
/*
* 插入
*/
@Test
void insetTest() {
System.out.println(userMapper.insert(1, "伊治"));
}
/*
* 修改
*/
@Test
void updateTest() {
System.out.println(userMapper.updateNameById(1, "尼治"));
}
/*
* 删除
*/
@Test
void deleteTest() {
System.out.println(userMapper.deleteById(1));
}
}
插入和查找数据测试:
因为此时我们还未对user表中插入数据,因此我们先执行insrertTest();方法,向表中插入数据,执行完毕后执行查找方法selectTest();
修改数据测试:
可以看到已经成功插入了一条id为1,name为伊治的数据,接下来我们对该条数据的name进行修改,执行方法updateTest();运行成功后执行查找方法得如下结果:
删除数据测试:
此时我们已成功将name字段从“伊治”改为了“尼治”,最后我们再来测试删除方法,执行deleteTest后执行查找方法查看结果,打印如下:
此时查找结果为一个空的list链表,证明我们已经成功删除了id为1的数据。
👇扫描二维码关注