前言
众所周知,MyBatis
是对JDBC
进行封装而成的产品,所以,聊MyBatis源码之前我们得先了解JDBC
。
JDBC
JDBC案例:
public class JdbcDemo {
public static final String URL = "jdbc:mysql://localhost:3306/mblog";
public static final String USER = "root";
public static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
while(rs.next()){
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
}
}
}
说明
数据库驱动:
Class.forName("com.mysql.jdbc.Driver");
获取连接:
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
创建Statement
或者PreparedStatement
对象:
Statement stmt = conn.createStatement();
执行sql数据库查询:
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
解析结果集:
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
在使用的时候,业务处理完成后记得关闭相关资源
使用过JDCB的朋友都知道,JDBC如果用到我们项目中基本上都会存在以下几个问题:
传统JDBC的问题
-
创建数据库的连接存在大量的硬编码 -
执行statement时存在硬编码 -
频繁的开启和关闭数据库连接,会严重影响数据库的性能,浪费数据库的资源 -
存在大量的重复性编码
针对上面这些问题,于是一大堆持久化框架应运而生。
持久化框
做持久层的框架有很多,有orm
系和utils
系列。
-
orm
系列的代表有:hibernate
,eclipseLink
,topLink
; -
utils
系列的代表有:MyBatis
,dbUtils
,jdbcTemplate
等;
下面对于这些框架做个简单概述:
至于 jpa,它只是一个规范标准,并非具体框架,不等同于 spring-data-jpa;同时 spring-data-jpa 也不是 jpa 的具体实现,它只是 jpa 规范标准的进一步封装。hibernate 是 jpa 最为常见的实现框架,当然其他还有 eclipseLink,topLink。
MyBatis 的特点是在对 SQL 优化时,复杂 SQL 的优化可控性高,框架内部调用层次简单,除了部分可以自动生成代码,还会有很多 SQL 需要自行编码。 spring-data-jpa(hibernate) 的特点是在开发过程中,脱离 SQL 编码开发,当然也支持本地SQL来查询,框架内部调用层次复杂。 以上就可以根据实际的业务进度和业务支撑情况做出选择了。
其实可以在一个项目在同时支持 MyBatis 和 spring-data-jpa,复杂SQL走 mybatis,常用SQL走 spring-data-jpa。
鉴于前实际开发中使用数量,我们选择MyBatis
进行分析。
MyBatis
新加入开发的朋友,估计不知道MyBatis 的前身,在2010年之前,不叫MyBatis
,叫ibatis
。
MyBatis
是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis
可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs
(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录 。
特点
-
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。 -
灵活:MyBatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。 -
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。 -
提供映射标签,支持对象与数据库的orm字段关系映射 -
提供对象关系映射标签,支持对象关系组建维护 -
提供xml标签,支持编写动态sql。
案例
需要来源两个jar包:MyBatis
的jar包和MySQL
数据库连接jar包。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
创建一个表t_user(数据库也是肯定要自己创建的哈)
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
插入一条数据:
INSERT INTO `t_user` VALUES ('1', 'tian', '19', '1');
创建该数据库表的实体类:
public class User {
private Integer id;
private String name;
private Integer age;
//set get
}
创建mapper配置文件:UserMapper.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.tian.mapper.UserMapper">
<select id="selectUserById" resultType="com.tian.domain.User">
select * from t_user where id = #{id}
</select>
</mapper>
创建mapper接口:UserMapper.java
import com.tian.domain.User;
public interface UserMapper {
User selectUserById(Integer id);
}
MyBatis 整体配置文件:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mblog?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
上面这些就是我们使用MyBatis
基本开发代码。
下面我们来写一个测试类:
import com.tian.domain.User;
import com.tian.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
public class MybatisApplication {
public static void main(String[] args) {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
SqlSession sqlSession =null;
try {
//读取配置文件
inputStream = Resources.getResourceAsStream(resource);
//创建SqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sql操作会话
sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//获取数据并解析成User对象
User user = userMapper.selectUserById(1);
//输出
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭相关资源
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
sqlSession.close();
}
}
}
测试结果:
User{id=1, name='tian', age=19}
如上面的代码所示,SqlSession
是MyBatis中提供的与数据库交互的接口,SqlSession实例通过工厂模式创建。
为了创建SqlSession
对象,首先需要创建SqlSessionFactory
对象,而SqlSessionFactory
对象的创建依赖于SqlSessionFactoryBuilder
类,该类提供了一系列重载的build()方法,我们需要以主配置文件的输入流作为参数调用SqlSessionFactoryBuilder
对象的bulid()
方法,该方法返回一个SqlSessionFactory
对象。
有了SqlSessionFactory
对象之后,调用SqlSessionFactory
对象的openSession()
方法即可获取一个与数据库建立连接的SqlSession
实例。
前面我们定义了UserMapper
接口,这里需要调用SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用UserMapper
代理实例的方法即可完成与数据库的交互。
针对上面这个案例,我们来梳理一下MyBatis
的整体执行流程和核心组件。
MyBatis 核心组件
执行流程
Configuration
用于描述MyBatis
的主配置信息,其他组件需要获取配置信息时,直接通过Configuration
对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler
等注册到Configuration
组件中,其他组件需要这些信息时,也可以从Configuration
对象中获取。
MappedStatement
MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML
配置文件中<select|update|delete|insert>
等标签或者@Select/@Update
等注解配置信息的封装。
SqlSession
SqlSession
是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession
是Executor组件的外观,目的是对外提供易于理解和使用的数据库操作接口。
标签:总结,name,数据库,public,MyBatis,SqlSession,Mybatis,转载,id From: https://www.cnblogs.com/grassLittle/p/17326519.html