一:MyBatis简介
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old JavaObjects,普通的Java对象)映射成数据库中的记录.
二:为什么要使用MyBatis?
MyBatis是一个半自动化的持久化层框架。
JDBC:
– SQL夹在Java代码块里,耦合度高导致硬编码内伤
– 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA
– 长难复杂SQL,对于Hibernate而言处理也不容易
– 内部自动生产的SQL,不容易做特殊优化。
– 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
总结:
不管?jdbc或者JdbcTemplate,我们都花费了?量精?完成映射且是没有技术含量的体?活,企业实战中,我们都借助于框架来减少这种映射代码,提?开发效率,Java中?的?较多是Hibernate和Mybatis,在国内轻量级MyBatis??较多。
#mybatis-config.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> <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/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件中(mybatis-config.xml)中--> <mappers> <mapper resource="EmployeeMapper.xml"/> </mappers> </configuration>
#Employee.java package com.lzr.bean; /** * @author GGBond * @create 2021-05-22-18:17 */ public class Employee { private Integer id; private String lastName; private String email; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Employee{" + "id=" + id + ", lastName=‘" + lastName + ‘\‘‘ + ", email=‘" + email + ‘\‘‘ + ", gender=‘" + gender + ‘\‘‘ + ‘}‘; } }
#pom.xml
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.apache.logging.log4j</groupId>-->
<!--<artifactId>log4j-core</artifactId>-->
<!--<version>2.14.1</version>-->
<!--</dependency>-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
#EmployeeMapper.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.lzr.EmployeeMapper"> <!--namespace:名称空间 id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取出id值 --> <select id="selectEmp" resultType="com.lzr.bean.Employee"> select * from tbl_employee where id = #{id} </select> </mapper>
#MybatisTest.java package com.lzr.test; import com.lzr.bean.Employee; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * 1.根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象,有数据源一些运行环境信息
* 2.sql映射文件:配置了每一个sql,以及sql的封装规则
* 3.将sql映射文件注册在全局配置文件中
* 4.写代码
* 1):根据全局配置文件得到SqlSessionFactory,
* 2):使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
* 一个sqlSession就是代表和数据库的一次会话,用完关闭
* 3):使用sql的唯一标志来告诉Mybatis执行哪个sql,sql都是保存在sql映射文件中的; * @author GGBond * @create 2021-05-22-18:25 */ public class MyBatisTest { @Test public void test() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.获取sqlSession实例,能直接执行已经映射的sql语句 SqlSession openSession = sqlSessionFactory.openSession(); //第一个参数:SQL的唯一标识,第二个参数:执行SQL要用的参数 try { Employee employee = openSession.selectOne("com.lzr.EmployeeMapper.selectEmp", 1); System.out.println(employee); } finally { openSession.close(); } } }
接口式编程:
1.原生: Dao ===> DaoImpl
MyBatis;Mapper ===> xxMapper.xml
2.SqlSession代表和数据库的一次会话;用完必须关闭;
3.SqlSession和connection一样都是非线程安全的。每次使用都应该获取新的对象。
4.mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
(将接口和xml文件进行绑定)
EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
5.两个重要的配置文件:
mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息。。。系统运行环境信息;
sql映射文件:保存每一个SQL语句的映射信息,将sql抽取出来;
@Test
public void test01() throws IOException{ //1.获取sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); //2.获取sqlSession对象 SqlSession openSession = sqlSessionFactory.openSession(); try { //3.获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println(mapper.getClass()); System.out.println(employee); }finally { openSession.close(); } } private SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); }
#EmployeeMapper package com.lzr.dao; import com.lzr.bean.Employee; /** * @author GGBond * @create 2021-05-22-19:34 */ public interface EmployeeMapper { public Employee getEmpById(Integer id); }
#EmployeeMapper.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.lzr.dao.EmployeeMapper"> <!--namespace:名称空间;指定为接口的全类名 id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取出id值 --> <select id="getEmpById" resultType="com.lzr.bean.Employee"> select id,last_name lastname,email,gender from tbl_employee where id = #{id} </select> </mapper>
三:mybatis工作原理
1. 读取MyBatis的配置?件:mybatis-config.xml为MyBatis的全局配置?件,?于配置数据库连接信息。
2. 加载映射?件:映射?件即SQL映射?件,该?件中配置了操作数据库的SQL语句,需要在MyBatis配置?
件mybatis-config.xml中加载。mybatis-config.xml ?件可以加载多个映射?件,每个?件对应数据库
中的?张表。
3. 构造会话??:通过MyBatis的环境配置信息构建会话??SqlSessionFactory。
4. 创建会话对象:由会话??创建SqlSession对象,该对象中包含了执?SQL语句的所有?法。
5. Executor执?器:MyBatis底层定义了?个Executor接口来操作数据库,它将根据SqlSession传递的参数
动态地?成需要执?的SQL语句,同时负责查询缓存的维护。
6. MappedStatement对象:在Executor接口的执??法中有?个MappedStatement类型的参数,该参数
是对映射信息的封装,?于存储要映射的SQL语句的id、参数等信息。
7. 输?参数映射:输?参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输?参数
映射过程类似于JDBC对preparedStatement对象设置参数的过程。
8. 输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果
映射过程类似于JDBC对结果集的解析过程。
MyBatis的基本?作原理就是:先封装SQL,接着调?JDBC操作数据库,最后把数据库返回的表结果封装成Java
类。
启动?志验证:
?先添加?志依赖:
然后在resources?录下添加?件log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--?志级别以及优先级排序:OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL-->
<!--Configuration后?的status,这个?于设置log4j2??内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够?动检测修改配置?件和重新配置本?,设置间隔秒数-->
<configuration status="TRACE" monitorInterval="30">
<!--先定义所有的appender-->
<appenders>
<!--输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出?志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l- %m%n"/>
</console>
</appenders>
<!--然后定义logger,只有定义了logger并引?的appender,appender才会?效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUB信息-->
<logger name="org.springframework.transaction" level="DEBUG"/>
<logger name="org.mybatis" level="INFO"/>
<root level="all">
<!--输出到控制台-->
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
原文:https://www.cnblogs.com/NBYG/p/14799677.html