우리 모두 알고 있듯이 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
예
JDBC
🎜는 캡슐화된 제품이므로 MyBatis 소스 코드에 대해 이야기하기 전에 먼저 이해해야 합니다🎜JDBC
🎜. 🎜🎜JDBC 케이스: 🎜
Statement stmt = conn.createStatement();
설명: 🎜
데이터베이스 드라이버: 🎜
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
링크 가져오기:🎜
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
만들기문
또는 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如果用到我们项目中基本上都会存在以下几个问题:
针对上面这些问题,于是一大堆持久化框架应运而生。
做持久层的框架有很多,有orm
系和utils
系列。
orm
系列的代表유: 최대 절전 모드
,eclipseLink
,topLink
;orm
系列的代表有:hibernate
,eclipseLink
,topLink
;utils
系列的代表有:MyBatis
,dbUtils
,jdbcTemplate
utils
系列的代表有:,dbUtils
,jdbcTemplate
等;
하면对于这些框架做个简单概述:
至于 jpa ,它只是一规范标准,并不具体框架,不等同于spring-data-jpa;동일한 spring-data-jpa 也不是 jpa 的具体实现,它只是 jpa 规范标准的进一步封装。其他还有 eclipseLink,topLink。MyBatis 的特点是에서 SQL을 优化时,复杂 SQL의 优化可控性高,框架内part调用层次简单,除了part分可以自动生成代码,还会有很多 SQL需要自行编码. spring-data-jpa(hibernate)는 SQL 编码开发, 当然也支持本地SQL来查询, 框架内询, 框架内部调用层次复杂 에서 특별하게 사용됩니다. 以上就可以根据实际的业务进titude and 业务支撑情况做出选择了。
MyBatis
其实可以에서 동일한 时支持 MyBatis 와 jpa, 复杂SQL走 mybatis, 常用SQL走 spring-data-jpa.
처음 개발을 시작하는 친구들은 MyBatis의 전신을 모를 수도 있습니다. 2010년 이전에는 MyBatis
, 이바티스
. MyBatis
,叫ibatis
。
MyBatis
是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis
可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs
MyBatis
는 간단한 XML 또는 주석을 사용하여 구성할 수 있습니다. 기본 정보를 매핑하고 인터페이스를 Java의 POJO(Plain Ordinary Java Object, 일반 Java 객체)는 데이터베이스의 레코드에 매핑됩니다. 🎜<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
对象。
있음 );font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">SqlSessionFactory
对象之后,调用SqlSessionFactory对象的openSession()
방법법即可获取一个与数据库建立连接的SqlSession实例。SqlSessionFactory
对象之后,调用SqlSessionFactory
对象的openSession()
方法即可获取一个与数据库建立连接的SqlSession
实例。前面我们定义了UserMapper
接口,这里需要调用SqlSession
的getMapper()
方法创建一个动态代理对象,然后调用UserMapper
代理实例的方法即可完成与数据库的交互。
针对上面这个案例,我们来梳理一下MyBatis
SqlSession
의getMapper()
방법법创建一个动态代理对象,然后调用UserMapper
대리적 방법법即可完成与数据库的交互。은 MyBatis의 주요 구성 정보
. 다른 구성 요소가 구성 정보를 가져와야 하는 경우 구성
개체 획득. 또한 MyBatis는 애플리케이션이 시작될 때 Mapper 구성 정보, 유형 별칭, TypeHandler
등은 구성
구성요소, 다른 구성요소에 이 정보가 필요한 경우 구성
개체. MyBatis
的主配置信息,其他组件需要获取配置信息时,直接通过Configuration
对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler
等注册到Configuration
组件中,其他组件需要这些信息时,也可以从Configuration
对象中获取。
MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML
配置文件中b5d5a6a8d1a81baf21ea188537c0af35
等标签或者@Select/@Update
等注解配置信息的封装。
SqlSession
是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession
Mapper XML
구성 파일에서b5d5a6a8d1a81baf21ea188537c0af35
및 기타 태그 또는 @Select/@Update
및 기타 주석 구성 정보 캡슐화. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜SqlSession
는 MyBatis에서 제공하는 사용자 지향 API로 데이터베이스와 상호작용할 때 세션 객체를 나타내며, 데이터베이스의 추가, 삭제, 수정, 쿼리 기능을 완성하는데 사용된다. SqlSession
은 Executor 구성 요소의 모양입니다. 목적은 이해하기 쉽고 사용하기 쉬운 데이터베이스 운영 인터페이스를 제공하는 것입니다. 🎜Executor
MyBatis의 SQL 실행자입니다. MyBatis에서 데이터베이스의 모든 추가, 삭제, 수정 및 쿼리 작업은 Executor 구성 요소에 의해 완료됩니다. Executor
是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
StatementHandler
封装了对JDBC Statement
对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。
当MyBatis
框架使用的Statement类型为CallableStatement
和PreparedStatement
时,ParameterHandler
用于为Statement对象参数占位符设置值。
ResultSetHandler
StatementHandler
JDBC 문
객체 작업 , 예를 들어Statement 개체에 대한 매개 변수 설정, 데이터베이스와 상호 작용하기 위해 Database 인터페이스에서 제공하는 메서드 호출 등이 있습니다. 🎜🎜🎜🎜ParameterHandler🎜🎜🎜🎜WhenMyBatis code>프레임워크에서 사용하는 명령문 유형은 <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);글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>CallableStatement 코드> 및<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 ); 글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>PreparedStatement
, ParameterHandler
는 명령문 개체 매개변수 자리 표시자의 값을 설정하는 데 사용됩니다. . 🎜🎜🎜🎜ResultSetHandler🎜🎜🎜🎜ResultSetHandler
JDBC에서 ResultSet 개체의 작업을 캡슐화합니다. SQL 유형 SELECT 문을 실행할 때 ResultSetHandler는 쿼리 결과를 Java 개체로 변환하는 데 사용됩니다. 🎜TypeHandler
이는 Java 유형과 JDBC 유형 간의 매핑을 처리하는 데 사용되는 MyBatis의 유형 프로세서입니다. 해당 기능은 주로 PreparedStatement
또는 CallableStatement
해당 객체 setXXX()
getXXX()
SQL 실행 결과를 가져옵니다. TypeHandler
是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement
或CallableStatement
对象对应的setXXX()
方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()
获取SQL执行结果。使用JDBC API
JDBC API
애플리케이션 개발, One 더 성가신 측면 중 하나는 JDBC 유형과 Java 유형 간의 변환을 처리하는 것입니다. Java 유형 및 JDBC 유형 변환과 관련된 두 가지 상황은 다음과 같습니다. 🎜PreparedStatement
인터페이스 일련의 setXXX() code> 메서드를 사용하여 Java 유형을 해당 JDBC 유형으로 변환하고 매개변수 자리 표시자에 값을 할당합니다.
PreparedStatement
对象为参数占位符设置值时,需要调用PreparedStatement
接口中提供的一系列的setXXX()
方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。ResultSet
对象后,需要调用ResultSet对象的getXXX()
方法获取字段值,此时会将JDBC类型转换为Java类型。MyBatis
提供的TypeHandler
及与Java类型和JDBC类型之间的对应关系:
我们使用到了SqlSession
组件,它是用户层面的API。实际上SqlSession
是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式的典型应用。
真正执行SQL操作的是Executor组件,Executor可以理解为SQL执行器,它会使用StatementHandler
ResultSet
객체의 경우 getXXX()
메소드는 필드값을 얻어오는데, 이때 JDBC 유형이 Java 유형으로 변환됩니다. MyBatis 제공 TypeHandler
및 Java 유형과 JDBC 유형 간 대응 : 🎜
在MyBatis源码中有个SqlSource对象会作为MappedStatement对象的属性保存在MappedStatement对象中。执行Mapper时,会根据传入的参数信息调用SqlSource对象的getBoundSql()方法获取BoundSql对象,这个过程就完成了将SqlNode对象转换为SQL语句的过程。
比如:,#{}
위 내용은 일주일만에 마이바티스 소스코드를 학습한 후 10,000 단어 요약본을 받았습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!