1.Mybatis
MyBatis是⼀款优秀的持久层框架,⽤于简化JDBC的开发。
MyBatis本是Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了google code,并 且改名为MyBatis。
在上⾯我们提到⼀个词:持久层,接下来来介绍一下持久层
持久层:指的就是持久化操作的层,通常指数据访问层(Dao),是⽤来操作数据库的。
简单来说,MyBatis是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具。
Mybatis操作数据库的步骤:
1. 准备⼯作(创建SpringBoot、数据库表准备、实体类)
2. 引⼊Mybatis的相关依赖,配置Mybatis(数据库连接信息)
3. 编写SQL语句(注解/XML)
4. 测试
2.Mybatis操作数据库
2.1配置Mybatis环境
配置Mybatis环境首先需要引入Mybaits的框架依赖还有MySQL数据库的驱动依赖:
第二步就是在项目创建好后配置数据库连接信息:
这里以application.yml为例
打开application.yml
配置以下内容:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
configuration: # 配置打印 MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
注意: 这一步非常重要,如果没有配置项目运行就会报错
2.2.创建数据库和表
这里以数据库mybatis_test和userinfo表为例
-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
创建userinfo表:
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`username` VARCHAR ( 127 ) NOT NULL,
`password` VARCHAR ( 127 ) NOT NULL,
`age` TINYINT ( 4 ) NOT NULL,
`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
`phone` VARCHAR ( 15 ) DEFAULT NULL,
`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
插入数据:
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )VALUES
( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone ) VALUES
( 'lzx', 'lzx', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone ) VALUES
( 'qzx', 'qzx', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )VALUES
( 'xmz', 'xmz', 18, 1, '18612340004' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )VALUES
( 'zml', 'zml', 18, 1, '18612340005' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )VALUES
( 'lwj', 'lwj', 18, 1, '18612340006' );
2.3创建实体类
我们需要创建一个实体类来对应数据库表中的内容,这样就可以在项目中使用这个类来接收我们查询返回的信息了,只要数据库中的字段名与实体类中的属性名一致,框架就会自动帮我们进行赋值。
接下来我们来创建UserInfo这个实体类:
package com.example.mybatisdemo.medel;
import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
}
2.4写持久层代码
在项目中,创建持久层接口UserInfoMapper:
3. 编写SQL代码(注解/XML)
Mybatis代码的写法主要有两种:注解和XML
3.1注解实现增删改查
3.1.1增
在我们刚刚创建好的UserInfoMapper接口中使用@Insert注解来编写代码实现增操作:
import com.example.mybatisdemo.medel.UserInfo;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserInfoMapper {
@Insert("insert into userinfo(id,username, password, age, gender, phone) values" +
"(11,'asd','asd',20,1,1111111)")
Integer insert();
}
注意: @Mapper是Mybatis中的注解
@Mapper注解:表⽰是MyBatis中的Mapper接⼝,程序运⾏时,框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理。
单元测试
这里介绍单元测试是为了后续测试我们编写的代码是否可以正确操作数据库。
单元测试(Unit Testing)是一种软件开发实践,它是软件工程中用于验证程序各个独立部分(单元)行为是否符合预期的设计和规格的一种测试方法。单元通常是最小的可测试组件,比如在面向对象编程中,它可以是一个类、一个方法或者一个函数。
使⽤IDEA⾃动⽣成测试类:
1.在需要测试的Mapper接⼝中,右键->Generate->Test
2.选择要测试的⽅法,点击OK
这样我们的测试代码就出现了:
切记:
测试代码中一定要加@SpringBootTest 注解
测试一下运行的结果:
使用传参的方式来实现 增操作
在上面的增操作中,我们已经插入了一条数据。接下来使用传递参数的方式来实现增操作:
在insert⽅法中添加⼀个参数(UserInfo userinfo),将⽅法中的参数,传给SQL语句使⽤#{ } 的⽅式获取⽅法中的参数。
代码实现:
实现测试类的时候先使用@Autowired从外部注入类
测试类:
测试结果:
3.2删
使用注解@Delete来实现
@Delete("delete from userinfo where id=#{id}")
Integer delete(Integer id);
测试类代码如下:
测试结果:
3.3改
使用@Update注解实现:
@Update("update userinfo set age=#{age} where id =#{id}")
Integer update(UserInfo userInfo);
测试类:
测试结果:
3.4查
使用@Select注解:
@Select("select * from userinfo")
List<UserInfo> selectAll();
当我们执行测试类的时候会发现:
从运行结果来看,我们SQL语句中,delete_flag,create_time,update_time,但是这⼏个属性却没有赋值。
这是因为当⾃动映射查询结果时,MyBatis会获取结果中返回的列名并在Java类中查找相同名字的属性(忽略⼤⼩写)。这意味着如果发现了ID列和id属性,MyBatis会将列ID的值赋给id属性。
这个时候我们需要配置一个东西:
mybatis:
configuration: # 配置打印 MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #配置驼峰⾃动转换
因为通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词),⽽Java属性⼀般遵循驼峰命名法约定。为了在这两种命名⽅式之间启⽤⾃动映射,需要将map-Underscore-ToCamel-Case 设置为true。
这时我们就能解决问题了。
3.2XML实现增删改查
上⾯学习了注解的⽅式,接下来讲解以下XML的⽅式。
MyBatis XML的⽅式需要以下两步:
1.配置数据库连接字符串和MyBatis
2.指明XML的路径
3.写XML的实现
3.2.1配置数据库连接字符串和MyBatis
此步骤需要进⾏两项设置,数据库连接字符串设置和MyBatis的XML⽂件配置。
如果是application.yml⽂件,配置内容如下:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
configuration: # 配置打印 MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #配置驼峰⾃动转换
# 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
mapper-locations: classpath:mapper/**Mapper.xml
再在rescurces底下创建一个目录与上面自己定义的相对应:
还要定义持久层接口UserInfoMapper,最后在自己定义的目录下创建XML文件。
3.2.2指明XML的路径
数据持久成的实现,MyBatis的固定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.mybatisdemo.mapper.UserInfoXMLMapper">
</mapper>
也就是说接口在哪个包哪个目录下都要写清楚。
3.2.3增
UserInfoMapper接口:
UserInfoXMLMapper.xml:
注意: 接口中的方法名要和XML文件中的id相对应。
测试类代码:
测试结果:
3.2.4删
UserInfoMapper接口:
UserInfoXMLMapper.xml:
测试类:
测试结果:
3.2.5改
UserInfoMapper接口:
UserInfoXMLMapper.xml:
测试类:
测试结果:
3.2.6查
UserInfoMapper接口:
UserInfoXMLMapper.xml:
测试类:
测试结果: