MyBatis官方定义是这样描述的,MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML或注解来配置和映射原始类型、接口和 Java POJO。
上面文字描述太官方了,整体读下来可能仅仅了解到MyBatis是用于解决持久层方案的一款持久层框架,那么,在我们没有使用过MyBatis之前,我们使用各种各样的持久层技术来与数据库交互,这些技术和MyBatis有什么不同呢?
JDBC技术
SpringJdbcTemplate
Spring中对jdbc进行简单的封装。
它和Spring的JdbcTemplate很像,也是对jdbc进行简单的封装
上面列举的都不是框架,JDBC是一种规范,而JdbcTemplate和Dbutils都只是工具类。
既然有那么多技术用于持久层,那么我们为什么还要学MyBatis呢,我们先使用JDBC技术实现对一个数据库表的操作,看看有什么特点
JDBC编码技术
执行流程
- 加载数据库驱动
- 获取数据库连接
- 定义sql语句
- 预处理
- 遍历查询结果集
- 关闭连接
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try { //加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root", "root");
//定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
//获取预处理 statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的 参数值
preparedStatement.setString(1, "Simon");
//向数据库发出 sql 执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+"
"+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
大家应该很熟悉这段代码吧,使用原生的JDBC会出现什么样的问题呢
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能。
- Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
- 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能 多也可能少,修改 sql 还要修改代码,系统不易维护
- 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护。
查询一条语句那么繁琐,我们当然希望可以将我们的主要精力放在sql上,那么MyBatis是否有能力帮我们解决呢?它的执行有什么特点呢?
事实上,MyBatis封装了jdbc操作的很多细节,它可以使开发者更多的关注sql语句本身,而无需关注注册驱动、创建链接等繁琐的过程,它使用ORM的思想实现对结果集的封装。
ORM全称是Object Relational Mapping,即对象关系映射,即把数据库表和实体类即实体类的属性对应起来,使得我们可以操作实体类就可以实现操作数据库表。
MyBatis的全局配置文件,配置了MyBatis的运行环境等信息。
mapper.xml文件,即sql映射文件,文件中配置了操作数据库的sql语句,需要在SqlMapperConfig.xml文件中加载
通过MyBatis环境等配置信息构造SqlSessionFactory会话工厂
由会话工厂创建sqlSession,操作数据库需要通过sqlSession进行
MyBatis底层自定义了Executor执行器接口操作的数据库,Executor接口有两个实现,一个是基本执行器,一个缓存执行器。
是一个底层封装对象,包装了MyBatis配置信息及sql映射信息等。
- 读取配置文件
- 创建SqlSessionFactory工厂
- 创建SqlSession
- 创建Dao接口的代理对象
- 执行dao中的方法
- 释放资源
基于xml配置
<?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>
<!--配置mybatis的环境-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!--告知mybatis的映射配置位置-->
<mappers>
<mapper resource="com/simon/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
<?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.simon.dao.IUserDao">
<select id="findAll" resultType="com.simon.domain.User" >
select * from user
</select>
</mapper>
package com.simon.domain;
import java.util.Date;
/**
* @Author: Simon Lang
* @Date: 2020/2/26 12:09
* @Version 1.0
*/
public class User {
private Integer id;
private String username;
private Date birthday;
private char sex;
private String address;
public interface IUserDao {
public List<User> findAll();
}
//导入配置文件
InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
//创建sqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//使用构建者创建工厂对象sqlSessionFactory
SqlSessionFactory factory=builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//6.使用代理对象执行查询所有方法
List<User> users=userDao.findAll();
for (User user:users){
System.out.println(user);
}
session.close();
in.close();
基于注解
<mappers>
<mapper class="com.simon.dao.IUserDao.xml">mapper>
mappers>
参考:
https://mybatis.org/mybatis-3/zh/getting-started.html
https://www.cnblogs.com/benjieqiang/p/11183580.html
关注公众号:10分钟编程,让我们每天博学一点点
公众号回复success,领取独家整理的学习资源,JAVA、大数据全套视频资料