Maison >Java >javaDidacticiel >Après avoir appris le code source de MyBatis en une semaine, j'ai obtenu un résumé de 10 000 mots
Comme nous le savons tous, MyBatis
MyBatis
是对JDBC
进行封装而成的产品,所以,聊MyBatis源码之前我们得先了解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
Oui
JDBC
🎜 est un produit encapsulé, donc avant de parler du code source de MyBatis, il faut d'abord le comprendre🎜JDBC
🎜. 🎜🎜Cas JDBC : 🎜
Statement stmt = conn.createStatement();
Description : 🎜
Pilote de base de données : 🎜
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
Obtenir le lien :🎜
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
CréerDéclaration
ou PreparedStatement
Objet : 🎜
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如果用到我们项目中基本上都会存在以下几个问题:
针对上面这些问题,于是一大堆持久化框架应运而生。
做持久层的框架有很多,有orm
系和utils
系列。
orm
系列的代表有: hibernation
,eclipseLink
,topLink
;orm
系列的代表有:hibernate
,eclipseLink
,topLink
;utils
系列的代表有:MyBatis
,dbUtils
,jdbcTemplate
utils
系列的代表有:,dbUtils
,jdbcTemplate
等;
下面对于这些框架做个简单概述:
至于 jpa,它只是一个规范标准,并非具体框架,不等同于spring-data-jpa现框架,当然其他还有eclipseLink,topLink。MyBatis 的特点Il s'agit d'une application SQL et d'une application SQL. Il s'agit d'une application SQL. spring-data-jpa(hibernate) pour les applications SQL, pour les applications SQL et pour les applications SQL复杂。 以上就可以根据实际的业务进度和业务支撑情况做出选择了。
MyBatis
其实可以在一个项目在Il s'agit de MyBatis et spring-data-jpa, et de SQL mybatis, ainsi que de Spring-data-jpa de SQL.
Les amis qui débutent dans le développement ne connaissent peut-être pas le prédécesseur de MyBatis. Avant 2010, ils ne soumettaient pas MyBatis
, appelé ibatis
. MyBatis
,叫ibatis
。
MyBatis
是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis
可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs
MyBatis
est un excellent persistant en couches A framework qui prend en charge le SQL personnalisé, les procédures stockées et le mappage avancé. MyBatis évite presque tout le code JDBC, le réglage manuel des paramètres et la récupération des jeux de résultats. MyBatis
peut utiliser du XML simple ou des annotations pour configurer et cartographiez les informations natives, combinez l'interface avec le POJOs (Plain Ordinary Java Object, objet Java ordinaire) est mappé dans un enregistrement de la base de données. 🎜<h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 18px;">
<span style="display: none;"></span>特点<span style="display: none;"></span>
</h4>
<ul class="list-paddingleft-2" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;">
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。</section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">灵活:MyBatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。</section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。</section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供映射标签,支持对象与数据库的orm字段关系映射</section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供对象关系映射标签,支持对象关系组建维护</section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供xml标签,支持编写动态sql。</section></li>
</ul>
<h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 18px;">
<span style="display: none;"></span>案例<span style="display: none;"></span>
</h4>
<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">需要来源两个jar包:<code style='font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>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
对象之后,调用openSession()
SqlSession
实例。SqlSessionFactory
对象之后,调用SqlSessionFactory
对象的openSession()
方法即可获取一个与数据库建立连接的SqlSession
实例。前面我们定义了UserMapper
接口,这里需要调用SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用UserMapper
代理实例的方法即可完成与数据库的交互。
针对上面这个案例,我们来梳理一下MyBatis
UserMapper
接口,这里需要调用SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用UserMapper
个案例,我们来梳理一下MyBatis
的整体执行流程 和 核心 组件 。 est utilisé pour décrire Les principales informations de configuration de MyBatis
. Lorsque d'autres composants ont besoin d'obtenir les informations de configuration, ils peuvent transmettre directement Configuration
acquisition d'objet. De plus, MyBatis utilisera les informations de configuration du Mapper, tapez alias, TypeHandler
et ainsi de suite sont enregistrés dans Configuration
, lorsque d'autres composants ont besoin de ces informations, ils peuvent également utiliser Objet Configuration
. MyBatis
的主配置信息,其他组件需要获取配置信息时,直接通过Configuration
对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler
等注册到Configuration
组件中,其他组件需要这些信息时,也可以从Configuration
对象中获取。
MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML
配置文件中b5d5a6a8d1a81baf21ea188537c0af35
等标签或者@Select/@Update
等注解配置信息的封装。
SqlSession
是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession
Mapper XML
Dans le fichier de configurationb5d5a6a8d1a81baf21ea188537c0af35
et autres balises ou @Select/@Update
et encapsulation d'autres informations de configuration d'annotation. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜SqlSession
est une API orientée utilisateur fournie par MyBatis, qui représente l'objet de session lors de l'interaction avec la base de données et est utilisée pour compléter les fonctions d'ajout, de suppression, de modification et de requête de la base de données. SqlSession
est l'apparence du composant Executor, le but est de fournir une interface d'exploitation de base de données facile à comprendre et à utiliser. 🎜Executor
C'est l'exécuteur SQL de MyBatis. Toutes les opérations d'ajout, de suppression, de modification et d'interrogation de la base de données dans MyBatis sont réalisées par le composant Executor. Executor
是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
StatementHandler
封装了对JDBC Statement
对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。
当MyBatis
框架使用的Statement类型为CallableStatement
和PreparedStatement
时,ParameterHandler
用于为Statement对象参数占位符设置值。
ResultSetHandler
StatementHandler
Encapsule la paireJDBC Statement
opérations sur les objets, comme définir les paramètres de l'objet Statement, appeler les méthodes fournies par l'interface Statement pour interagir avec la base de données, etc. 🎜🎜🎜🎜ParameterHandler🎜🎜🎜🎜QuandMyBatis code>Le type de déclaration utilisé par le framework est <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0,05) ; famille de polices : " operator mono consolas monaco menlo monospace saut de mot break-all couleur rgb>CallableStatement code> et<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05 ); famille de polices : " operator mono consolas monaco menlo monospace break-all rgb>PreparedStatement
, ParameterHandler
est utilisé pour définir les valeurs des espaces réservés pour les paramètres de l'objet Statement . 🎜🎜🎜🎜ResultSetHandler🎜🎜🎜🎜ResultSetHandler
Encapsule le fonctionnement des objets ResultSet dans JDBC Lors de l'exécution d'une instruction SELECT de type SQL, ResultSetHandler est utilisé pour convertir les résultats de la requête en objets Java. 🎜TypeHandler
Il s'agit d'un processeur de types dans MyBatis, utilisé pour gérer le mappage entre les types Java et les types JDBC. Sa fonction se reflète principalement dans la possibilité d'appeler PreparedStatement ou <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>CallableStatement
objet correspondant setXXX()
définit la valeur pour l'objet Statement. Et peut appeler le getXXX()
Récupérez les résultats de l'exécution SQL. TypeHandler
是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement
或CallableStatement
对象对应的setXXX()
方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()
获取SQL执行结果。
使用JDBC API
API JDBC
Développer des applications, One L'un des aspects les plus fastidieux consiste à gérer la conversion entre les types JDBC et les types Java. Les deux situations impliquant la conversion du type Java et du type JDBC sont les suivantes : 🎜PreparedStatement
l'objet est un espace réservé de paramètre Lors de la définition de la valeur du symbole, vous devez appeler PreparedStatement
interface Une série de setXXX() code> Méthode, convertissez les types Java en types JDBC correspondants et attribuez des valeurs aux espaces réservés des paramètres.
PreparedStatement
对象为参数占位符设置值时,需要调用PreparedStatement
接口中提供的一系列的setXXX()
方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。ResultSet
对象后,需要调用ResultSet对象的getXXX()
方法获取字段值,此时会将JDBC类型转换为Java类型。MyBatis
提供的TypeHandler
及与Java类型和JDBC类型之间的对应关系:
我们使用到了SqlSession
组件,它是用户层面的API。实际上SqlSession
是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式的典型应用。
真正执行SQL操作的是Executor组件,Executor可以理解为SQL执行器,它会使用StatementHandler
ResultSet
, vous devez appeler l'objet getXXX()
obtient la valeur du champ, et à ce moment le type JDBC sera converti en type Java. MyBatis
Fourni TypeHandler
et types Java et correspondance JDBC entre les types : 🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!