Mybatis 知识总结(一)
3.1 Mybatis 介绍
什么是 Mybatis ?
- MyBatis 是一款优秀的持久层框架,用户简化 JDBC 的开发。
- MyBatis 是 Apache 的一个开源项目 iBaits,2010年这个项目由 apache 迁移到了 google code,并且改名为 MyBatis。2013年11月迁移到 Github。
- 官网:https://mybatis.org/mybatis-3/zh/index.html
3.2 MyBatis 入门
快速入门
- 需求说明
使用 MyBatis 查询所有的用户数据。
要查询所有的用户数据,可以在图形化界面工具中写 select * form user;
查询 sql 语句,然后把这条语句发送给数据库服务器执行,数据库然后将查询的结果返回给图形化界面工具展示。而 MyBatis 操作数据库其实就是在 java 程序中编写 sql 语句发送给数据库执行,然后数据库将查询结果返回给 java 程序。
创建 springboot 工程:File >> new >> module… 进入到新建模块弹窗,选择 Spring Initializr 及模块的 JDK 版本和模块的相关基本信息,在选择依赖时需要添加 SQL 中的 MyBatis Framework 和 MySQL Driver(JDBC 的实现类) 依赖。
创建数据库表 user:
-- 建表语句
CREATE TABLE user(
id int PRIMARY KEY auto_increment COMMENT 'ID,唯一标识',
name VARCHAR(20) not null unique COMMENT '用户名',
age INT COMMENT '年龄',
gender TINYINT DEFAULT '1' COMMENT '性别',
phone char(11) COMMENT '手机号'
)COMMENT '用户表';
-- 插入数据
INSERT INTO `user` (id,name,age,gender,phone)VALUES (1,'张三',17,1,'11199990000');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (2,'李四',34,1,'22299998888');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (3,'王五',34,1,'33399993333');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (4,'麻子',24,1,'44499994444');
INSERT INTO `user` (id,name,age,gender,phone)VALUES (5,'小如',20,2,'55599995555');
创建实体类User:src/main/java/com/ganming/pojo/User.java
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
// 自动生成 Getter and Setter、Constructor、toString方法
}
- 2、引入 MyBatis 的相关依赖,配置 MyBatis (数据库连接信息)
在创建 springboot 项目时已经引入了 MyBatis 的相关依赖,相关依赖如下:pom.xml
...
<dependencies>
<!--MyBatis 的起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!--Mysql 驱动包,刚刚发布的最新版的驱动包-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--Mysql 驱动包,上一个版本的驱动包-->
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-jave</artifactId>
<scope>runtime</scope>
</dependency>-->
<!--springboot 单元测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
...
在 src/main/resources/application.properties
配置文件(创建 springboot 工程时自带该文件)中配置连接数据库的四要素:
- 3、编写 SQL 语句(注解/XML)
需要定义 UserMapper 持久层的接口:src/main/java/com/ganming/mapper/UserMapper.java
package com.ganming.mapper;
import com.ganming.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper // 在运行时,框架会自动的生成该接口的实现类对象(代理对象),并且将该对象交给 IOC 容器管理
public interface UserMapper {
// 查询全部用户信息
@Select("select * from user")
public List<User> list();
}
@Mapper 注解:在运行时,框架会自动的生成该接口的实现类对象(代理对象),并且将该对象交给 IOC 容器管理。
@Select 注解:表示下面的方法要执行一个查询语句。里面的值就是要执行的 sql 语句。
配置 SQL 提示:12行中的 select * from user
在程序中只是一个字符串,没有输入提示,写错了 idea 也不会有报错提示。可通过下面图中设置来配置 SQL 提示。
选中 sql 语句 >> Show Context Actions >> Inject language or reference >> MySQL(SQL)。
配置数据库表的提示:在上述 sql 语句中指定表名 user 时没有提示,是因为 Idea 和数据库之间米有建立连接,不识别表信息;可在 Idea 中配置 MySQL 数据库连接。
- 4、编写单元测试
在 src/test/java/com/ganming/MybatisApplicationTests.java
单元测试文件中编写测试查询全部用户信息的方法 testListUser() 代码。
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
@SpringBootTest // springboot 整合单元测试的注解
class MybatisApplicationTests {
@Resource // 完成依赖注入
private UserMapper userMapper;
@Test
public void testListUser(){
List<User> userList = userMapper.list();
userList.stream().forEach(user -> {
System.out.println(user);
});
}
}
运行测试方法,检验输出:
JDBC 介绍
前面介绍 MyBatis 简化 JDBC 的开发,接下来介绍下 JDBC。
- 1、JDBC(Java DataBase Connectivity):就是使用 java 语言操作关系型数据库的一套 API。
JDBC本质:
sun 公司官方定义的一套操作所有关系型数据库的规范,即接口。
各个数据库厂商去实现这套接口,即数据库驱动 jar 包。
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。
在 src/test/java/com/ganming/MybatisApplicationTests.java
单元测试文件中编写测试 JDBC 的方法:
@Test
public void testJDBC() throws Exception{
// 1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接对象
String url = "jdbc:mysql://localhost:3306/mybatis";
String username = "root";
String password = "xxxx";
Connection connection = DriverManager.getConnection(url,username,password);
// 3. 获取执行 SQL 的对象 Statement,执行 SQL,返回结果
String sql = "select * from user";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
// 4. 封装结果数据
List<User> userList = new ArrayList<>();
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
short age = resultSet.getShort("age");
short gender = resultSet.getShort("gender");
String phone = resultSet.getString("phone");
User user = new User(id,name,age,gender,phone);
userList.add(user);
}
// 5. 释放资源
statement.close();
connection.close();
// 6. 结果展示
userList.stream().forEach(user -> {
System.out.println(user);
});
}
上面的测试方法同样输出预期信息。
直接使用 JDBC 驱动编程会有如下问题:
使用 SpringBoot + MyBatis 可以解决上述问题,MyBatis 将数据库的连接信息写在配置文件 application.properties 中,修改不用改 java 代码。MyBatis 用一个 mapper 接口类实现自动的数据封装工作。其次 MyBatis 使用数据库连接池技术解决了频繁创建和释放资源的问题,当要执行 sql 语句时,从数据库连接池中获取一个连接资源,执行完后自动归返资源实现资源的复用。
数据库连接池
- 1、什么是数据库连接池
数据库连接池是个容器,负责分配、管理数据库连接(Connection);
数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏;
数据库连接池与 JDBC 创建连接对比:
- 2、优势:
①资源重用;②提升系统响应速度;③避免数据库连接遗漏;
- 3、标准接口:DataSource
官方(sun公司)提供的数据库连接池接口,由第三方组织实现接口。
功能:要实现获取连接的接口:Connection getConnection() throws SQLException;
实现了数据库连接池接口的产品:C3P0、DBCP、Druid、HiKari(springboot 默认)
执行前面编写的 testListUser() 测试方法,观察控制台输出的信息 springboot 默认的连接池实现类为 HikarDataSource,查看 HikariDataSource 实现类。
Druid(德鲁伊):Druid 连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是 java 语言最好的数据库连接池之一。
- 4、切换 Druid 数据库连接池
引入 Druid 数据库连接池的依赖,坐标通过官方地址查询: https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter。
在 pom.xml 引入 Druid 的依赖,然后运行前面编写的 testListUser() 测试方法,观察控制台输出的数据池实现类的改变。
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter Druid 连接池依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
JDBC 配置:保持原先的配置或者如下
spring.datasource.druid.url= # 或spring.datasource.url=
spring.datasource.druid.username= # 或spring.datasource.username=
spring.datasource.druid.password= # 或spring.datasource.password=
spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=
lombok
- 问题分析:定义 User 实体类时,需要给属性添加 getter、setter、equals、hashCode、toString 及构造器方法,代码比较臃肿。
- lombok 介绍:lombok 是一个使用的 Java 类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashCode、toString等方法,并可以自动化生成日志变量,简化 Java 开发、提高效率。
- 使用 lombok:
在 pom.xml 中引入 lombok 的依赖
<!-- lombok 依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
给实体类 src/main/java/com/ganming/pojo/User.java
添加注解
package com.ganming.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
注意事项:lombok 会在编译时,自动生成对应的 java 代码。我们使用 lombok 时,还需要安装一个 lombok 的插件(idea有自带)。
settings…>>Plugins>>Marketplace