目录
1.JDBC操作示例回顾
2.什么是MyBatis
3.MyBatis入门
3.1准备工作
3.2配置数据库连接字符串
3.3写持久层代码
3.4单元测试
4.MyBatis的基本操作
4.1打印日志
4.2参数传递
1.JDBC操作示例回顾
我们学习MySQL数据库时 ,已经学习了JDBC来操作数据库, 但是JDBC操作太复杂了.
回顾一下JDBC的操作流程:
1. 创建数据库连接池 DataSource
2. 通过 DataSource 获取数据库连接 Connection
3. 编写要执⾏带? 占位符的 SQL 语句
4. 通过 Connection 及 SQL 创建操作命令对象 Statement
5. 替换占位符:指定要替换的数据库字段类型 , 占位符索引及要替换的值
6. 使⽤ Statement 执⾏ SQL 语句
7. 查询操作:返回结果集 ResultSet ,更新操作:返回更新的数量
8. 处理结果集
9. 释放资源
public class JDBCDemo1 {
public static void main(String[] args) throws SQLException {
// 假定数据库中有一个 student 表 (id, name), 往里面插入一个数据.
// 让用户通过控制台来输入学号和姓名.
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号: ");
int id = scanner.nextInt();
System.out.println("请输入姓名: ");
String name = scanner.next();
// 1. 创建 "数据源"
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
// 2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
// 3. 构造 SQL 语句
String sql = "insert into jdbctest values(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
// 4. 执行 SQL 语句. 返回值就是 "这次操作影响到几行"
int n = statement.executeUpdate();
System.out.println("n = " + n);
// 5. 释放必要的资源. 关闭连接.
statement.close();
connection.close();
}
}
查询语句:
// 查询
public class JDBCDemo3 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查询的学号: ");
int studentId = scanner.nextInt();
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
Connection connection = dataSource.getConnection();
// 这里同样可以包含一些占位符.
String sql = "select * from jdbctest where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, studentId);
// 执行查询操作, 要使用 executeQuery. 返回值是一个 ResultSet 类型的对象. 表示了一个 "表格"
ResultSet resultSet = statement.executeQuery();
// 遍历结果集合
while (resultSet.next()) {
// 获取到这一行的 学号 列
int id = resultSet.getInt("id");
// 获取到这一行的 姓名 列
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
// 释放资源.
resultSet.close();
statement.close();
connection.close();
}
}
从上述代码和操作流程可以看出 ,对于 JDBC 来说 ,整个操作非常的繁琐 ,我们不但要拼接每⼀个参数 ,⽽且还要按照模板代码的⽅式 ,⼀步步的操作数据库 ,并且在每次操作完 ,还要⼿动关闭连接等 ,而所有的这些操作步骤都需要在每个⽅法中重复书写. 那有没有⼀种方法 ,可以更简单、更方便的 操作数据库呢?
答案是肯定的 ,这是我们要学习 MyBatis 的真正原因 ,它可以帮助我们更方便快速的操作数据库
2.什么是MyBatis
MyBatis 是一个优秀的基于 Java 的持久层框架。 它主要用于将数据库操作与业务逻辑进行解耦,通过将 SQL 语句配置在 XML 文件或注解中,实现对数据库的灵活访问。MyBatis 提供了方便的映射机制,使得开发者可以方便地将数据库中的表与 Java 对象进行关联和操作。它具有简单易用、灵活可配置、性能较高等特点,在 Java 企业级应用开发中被广泛使用。
持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是用来操作数据库的.
3.MyBatis入门
Mybatis操作数据库的步骤:
1. 准备⼯作(创建springboot⼯程、数据库表准备、实体类)
2. 引⼊Mybatis的相关依赖 ,配置Mybatis(数据库连接信息)
3. 编写SQL语句(注解/XML)
4. 测试
3.1准备工作
创建springboot工程 ,并导⼊ mybatis的起步依赖、 mysql的驱动包
Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加 MySQL驱动
项⽬工程创建完成后 , ⾃动在pom.xml⽂件中 ,导⼊Mybatis依赖和MySQL驱动依赖
版本会随着SpringBoot 版本发⽣变化, 无需关注
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
数据库表准备:
-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
-- 创建表[用户表]
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 ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
创建对应的实体类UserInfo
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 delete_flag;
private Date create_time;
private Date update_time;
}
3.2配置数据库连接字符串
Mybatis中连接数据库,需要数据库参数配置:MySQL驱动类、登录名、密码、数据库连接字符串
如果是application.yml文件, 配置内容如下:
# 数据库连接配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
注意事项:
如果使用 MySQL 是 5.x 之前的使⽤的是"com.mysql.jdbc.Driver" ,如果是大于 5.x使用的是“ com.mysql.cj.jdbc.Driver”.
如果是application.properties文件, 配置内容如下:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
#连接数据库的⽤户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456
3.3写持久层代码
在项目中, 创建持久层接口UserInfoMapper
Mapper代码:
@Mapper
public interface UserInfoMapper {
//查询所有用户
@Select("select username,'password',age,gender,phone from userinfo")
public List<UserInfo> queryUser();
}
Mybatis的持久层接⼝规范⼀般都叫XxxMapper
@Mapper注解:表⽰是MyBatis中的Mapper接口,当在接口上添加@Mapper注解后,MyBatis 会自动为该接口创建一个动态代理实现类,交给Spring的IOC容器管理,将接口中的方法与相应的 SQL 操作进行关联,从而实现数据库访问操作。它主要用于标识这是一个与数据库操作相关的映射接口,简化了 MyBatis 配置文件的编写,使代码结构更加清晰简洁。
@Select注解:代表的就是select查询 ,也就是注解对应⽅法的具体实现内容.
3.4单元测试
使用Idea 自动生成测试类
在需要测试的Mapper接口中, 右键 -> Generate -> Test
选择要测试的方法,点击OK
在src下的test目录下,已经⾃动帮我们创建好了测试类,我们可以直接使⽤这个测试类来进⾏测试
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void queryUser() {
List<UserInfo> list = userInfoMapper.queryUser();
System.out.println(list);
}
}
一定要加上@SpringBootTest 注解,加载Spring运行环境
运行结果:
4.MyBatis的基本操作
4.1打印日志
在Mybatis当中我们可以借助日志, 查看到sql语句的执行、执行传递的参数以及执行结果
在application.yml中配置内容如下:
mybatis:
configuration: # 配置打印 MyBatis⽇志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在application.properties中配置内容如下:
#指定mybatis输出⽇志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
重新运行程序, 可以看到SQL执行内容, 以及传递参数和执行结果:
4.2参数传递
需求:根据id查找用户,对应的SQL就是:select * from userinfo where id =
但是SQL语句中的id值不能写成固定数值 ,需要变为动态的数值
解决方案:在queryById方法中添加一个参数(id),将方法中的参数传给SQL语句
使用#{}的方式获取方法中的参数
@Select("select * from userinfo where id=#{id}")
List<UserInfo> queryById(Integer id);
如果mapper接口方法形参只有⼀个普通类型的参数 ,#{…} 里面的属性名可以随便写 ,如 :#{id}、# {value}。建议和参数名保持⼀致
添加测试用例
@Test
void queryById() {
List<UserInfo> list2=userInfoMapper.queryById(4);
System.out.println(list2);
}
运行结果:
也可以通过@Param设置参数的别名,但是#{...}里面的属性名必须和@Param设置的一样
@Select("select username, `password`, age, gender, phone from userinfo where id=#{userid}")
UserInfo queryById(@Param("userid") Integer id);