一,Mybatis
简介
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。 Mybatis的最大特点:轻量级。相对于Hibernate省略了大量不常用的功能,整体轻巧又高效。
特性
- MyBatis支持定制化SQL、存储过程以及高级映射
- MyBatis避免了几乎所有的JDBC代码和手动设置参数以及结果集解析操作
- MyBatis可以使用简单的XML或注解实现配置和原始映射;将接口和Java的POJO(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录
- Mybatis是一个半自动的ORM(Object Relation Mapping)框架
这些特性看完本文之后你就会有更深的理解。
二,mybatis基本操作和核心配置文件
2.1物理建模
1.表
DROP TABLE IF EXISTS `emp3`;
CREATE TABLE `emp3` (
`emp_id` int(0) NOT NULL AUTO_INCREMENT,
`wkname` varchar(10) CHARACTER SET utf32 COLLATE utf32_general_ci NULL DEFAULT NULL,
`address` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT 'Unknown',
`job_id` int(0) NULL DEFAULT 0,
PRIMARY KEY (`emp_id`) USING BTREE,
INDEX `emp_name_index`(`wkname`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of emp3
-- ----------------------------
INSERT INTO `emp3` VALUES (1, '张三', '衡阳', 12);
INSERT INTO `emp3` VALUES (2, '李四', '郴州', 13);
INSERT INTO `emp3` VALUES (3, '王五', '岳阳', 14);
SET FOREIGN_KEY_CHECKS = 1;
我提前讲一下,这里的sql数据大家最好不要用,可能会报错哈!自己随便挑一个自己之前创建过的表就行!
比如说我是像这样的一张表
2.2逻辑建模
1.引入依赖
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
这里值得注意一下的是,如果你的mysql版本是8的话,那么你所导入的驱动可以和我的一样,但是要是低一点的版本就导入下面的mysql驱动。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
2.实体类
@Data
@NoArgsConstructor
@AllArgsConstructor为实体类加上这三个注解,我们就不用再不用再手动添加setter,getter和构造方法了,但是首先我们需要引入lombok依赖,才可以使用。
2、注解功能
|注解|作用|
|@Data|生成getXxx()方法、setXxx()方法、toString()、equals()、canEqual()、hashCode()方法|
|@AllArgsConstructor|生成全参构造器|
|@NoArgsConstructor|生成无参构造器|
|@Slf4j|生成日志对象|
|@Getter|生成getXxx()方法|
|@Setter|生成setXxx()方法|
|@ToString|生成toString()方法|
package com.zhuzhu;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Empolyee {
private Integer empId;
private String wkname;
private String address;
private Integer jobId;
}
3.Employeemapper
package com.zhuzhu.Dao;
import com.zhuzhu.Empolyee;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmpolyeeMapper {
Empolyee selectEmpolyee(Integer empId);
}
2.3准备配置文件
1.全局配置文件
习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
//引入的外部配置文件
<properties resource="jdbc.properties"/>
<!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
<environments default="development">
<!-- environment表示配置Mybatis的一个具体的环境 -->
<environment id="development">
<!-- Mybatis的内置的事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<!-- 建立数据库连接的具体信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
<!-- mapper标签:配置一个具体的Mapper映射文件 -->
<!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
<!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
<mapper resource="mappers/EmpolyeeMapper.xml"/>
</mappers>
</configuration>
这是上面resource属性引入的外部配置文件
user=root
password=123456
//serverTimezone=UTC 修改时区
//rewriteBatchedStatements=true 添加批量操作的功能
//useSSL=false 是说是否使用SSL连接,我们这里选false
url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC&useSSL=false&rewriteBatchedStatements=true
//mysql8版本的driver不一样,低版本sql驱动的是com.mysql.jdbc.Driver
//你要是不确定你的版本,可以两种都试一下
driver=com.mysql.cj.jdbc.Driver
注意一下这一句话,mysql8版本的driver不一样,低版本的是com.mysql.jdbc.Driver
你要是不确定你的版本,可以两种都试一下
2.局部配置文件
有多少个mapper就有多少局部配置文件!可以看到我们在局部配置文件中定义Employeemapper接口中selectEmpolyee方法所要执行的sql语句,传入的参数类型和返回的参数类型。
<?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属性:在Mybatis全局范围内找到一个具体的Mapper配置 -->
<!-- 引入接口后,为了方便通过接口全类名来找到Mapper配置文件,所以通常将namespace属性设置为接口全类名 -->
<mapper namespace="com.zhuzhu.Dao.EmpolyeeMapper">
<!-- 编写具体的SQL语句,使用id属性唯一的标记一条SQL语句 -->
<!-- resultType属性:指定封装查询结果的Java实体类的全类名 -->
<select id="selectEmpolyee" resultType="com.zhuzhu.Empolyee">
<!-- Mybatis负责把SQL语句中的#{}部分替换成“?”占位符,在#{}内部还是要声明一个见名知意的名称 -->
select emp_id empId,wkname name,address address,job_id jobId from emp3 where emp_id=#{empId}
</select>
</mapper>
2.4测试类
package com.zhuzhu;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
@Slf4j
public class testsql {
@Test
public void testSelectEmployee() throws IOException {
// 1.创建SqlSessionFactory对象
// ①声明Mybatis全局配置文件的路径
String mybatisConfigFilePath = "mybatis-config.xml";
// ②以输入流的形式加载Mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream(mybatisConfigFilePath);
// ③基于读取Mybatis配置文件的输入流创建SqlSessionFactory对象
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.使用SqlSessionFactory对象开启一个会话
SqlSession session = sessionFactory.openSession();
// 3.根据Mapper配置文件的名称空间+SQL语句的id找到具体的SQL语句
// 格式是:名称空间.SQL语句的id
String statement = "com.zhuzhu.Dao.EmpolyeeMapper.selectEmpolyee";
// 要传入SQL语句的参数
Integer empId = 1;
// 执行SQL语句
Object result = session.selectOne(statement, empId);
System.out.println("o = " + result);
if (result != null) {
log.info(result.toString());
}
// 4.关闭SqlSession
session.close();
}
}
说明:
- SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
- SqlSessionFactory:是“生产”SqlSession的“工厂”。
- 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。
运行之后
三,总结
从上面的操作,可以给我们的直观感受就是:
1.使用mybatis之后,sql语句和java程序之间的耦合是很小的,不像我们之前直接的调用JDBC那样还要在Java程序中编写sql语句。
2.MyBatis避免了几乎所有的JDBC代码和手动设置参数以及结果集解析操作
public static void close(ResultSet set, Statement statement, Connection connection){
try{
if(set != null){
set.close();
}
if(statement !=null){
statement.close();
}
if(connection !=null){
connection.close();
}
}catch (SQLException e){
throw new RuntimeException(e);
}
}
3.MyBatis可以使用简单的XML或注解实现配置和原始映射
比如说上,上面的@Mapper设置mapper接口
这就是mybatis的基础使用和核心配置文件的讲解,创作不易还请点一个小赞支持一下,我们下篇博客再见!