文章目录
一、Mybatis简介
1.1 MyBatis历史
- MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x 正式更名为MyBatis ,代码于2013年11月迁移到Github
- iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
1.2 MyBatis简介
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
- Mybatis 是一个 半自动的ORM(Object Relation Mapping)框架
1.3 下载网址
[https://github.com/mybatis/mybatis-3/](https://github.com/mybatis/mybatis-3/)
1.4 为什么要使用MyBatis – 现有持久化技术的对比
-
JDBC
① SQL夹在Java代码块里,耦合度高导致硬编码内伤
② 维护不易且实际开发需求中sql有变化,频繁修改的情况多见
-
Hibernate和JPA
① 长难复杂SQL,对于Hibernate而言处理也不容易
② 内部自动生产的SQL,不容易做特殊优化
③ 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降
-
MyBatis
① 对开发人员而言,核心sql还是需要自己优化
② sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据
二、Mybatis HelloWorld
2.1 开发环境的准备
-
导入MyBatis框架的jar包、Mysql驱动包、log4j的jar包
myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar -
导入log4j 的配置文件,内容如下(一般不进行修改):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
2.2 创建测试表
-
使用的是mysql 8.0 版本,
CREATE DATABASE mybatis; USE mybatis; DROP TABLE IF EXISTS tbl_employee; CREATE TABLE tbl_employee( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(50), `gender` CHAR(1), `email` VARCHAR(100) );
2.3 创建javaBean
-
Employee.java(具体方法略)
public class Employee { private Integer id; private String name; private String gender; private String email; }
2.4 创建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> <!-- 引入外部配置文件 --> <properties resource="mysql_jdbc.properties"></properties> <!-- 配置全局环境,default:当前使用的环境 --> <environments default="development"> <!-- 配置单个环境,id是唯一表示 --> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${mysql.driver}" /> <property name="url" value="${mysql.url}" /> <property name="username" value="${mysql.username}" /> <property name="password" value="${mysql.password}" /> </dataSource> </environment> </environments> <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <mappers> <!-- 注册mapper.xml文件 --> <!-- <mapper resource="com/lipu/mybatis01/mapper/EmployeeMapper.xml" /> --> <!-- 注册接口,接口中可以使用@Select等标识 --> <!-- <mapper class="com.lipu.mybatis01.mapper.EmployeeMapper"/> --> <!-- 常用:基于包的批量注册,mapper.java接口和mapper.xml需要在同一个包内 --> <package name="com.lipu.mybatis01.mapper"/> </mappers> </configuration>
-
mysql_jdbc.properties
mysql.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false mysql.driver=com.mysql.cj.jdbc.Driver mysql.username=root mysql.password=root
2.5 创建Employee的映射接口
-
EmployeeMapper.java:
public interface EmployeeMapper { public abstract Employee getEmpById(Integer id); }
2.6 创建Employee的sql映射文件
-
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.lipu.mybatis01.mapper.EmployeeMapper"> <!-- public abstract Employee getEmpById(Integer id); --> <select id="getEmpById" resultType="com.lipu.mybatis01.bean.Employee"> select * from tbl_employee where id = #{id} </select> </mapper>
2.7 测试类
-
MybatisTest .java:
public class MybatisTest { @Test public void test1() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 获取SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 获取sqlSession实例,能直接执行已经映射的sql语句 SqlSession sqlSession = sqlSessionFactory.openSession(); try { Employee employee = sqlSession.selectOne("com.lipu.mybatis01.mapper.EmployeeMapper.selectOne", 1); System.out.println(employee); } finally { sqlSession.close(); } } @Test public void test02() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 1. 获取SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 2. 获取sqlSession实例,能直接执行已经映射的sql语句 SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 3. 获取接口的实现类对象,会自动为接口创建一个代理对象,代理对象去实现增删改查方法 EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println(mapper.getClass()); System.out.println(employee); } finally { sqlSession.close(); } } }
2.8 最终项目框架图:
三、 MyBatis全局配置文件
3.1 MyBatis全局配置文件简介
-
The MyBatis configuration contains settings and properties that have a dramatic effect on how MyBatis behaves.
-
文件结构如下
configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSource 数据源 databaseIdProvider 数据库厂商标识 mappers 映射器
3.2 properties属性
-
可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来配置(可外部配置和引用外部资源文件)
-
外部配置:
<properties> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="root" /> </properties>
-
引用资源文件:
<!-- properties: 引入外部的属性文件 resource: 从类路径下引入属性文件 url: 引入网络路径或者是磁盘路径下的属性文件 --> <properties resource="jdbc.properties" ></properties>
jdbc.properties:
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.username=root jdbc.password=root
-
在environment元素的dataSource元素中为其动态设置
<environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
3.3 settings设置
-
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
-
包含如下的setting设置:
<settings> <setting name="cacheEnabled" value="true"/>//是否使用二级缓存 <setting name="lazyLoadingEnabled" value="true"/>//是否启用懒加载,需配合aggressiveLazyLoading一起使用 <setting name="aggressiveLazyLoading" value="false"/>//是否关闭主动加载,配合lazyLoadingEnabled <setting name="multipleResultSetsEnabled" value="true"/>//是否允许从一条语句返回多个结果集(需要兼容驱动程序: allowMultiQueries=true) <setting name="useColumnLabel" value="true"/>//是否使用列标签而不是列名 <setting name="useGeneratedKeys" value="false"/>//允许JDBC支持生成的键(需要驱动的兼容性支持) <setting name="autoMappingBehavior" value="PARTIAL"/>//指定MyBatis是否以及如何自动将列映射到字段/属性。NODE: 禁止自动映射; PARTIAL:自动映射结果集,不映射嵌套结果;FULL:自动映射包含嵌套在内的各种复杂的结果集 <setting name="autoMappingUnknownColumnBehavior" value="NONE"/>//指定检测到自动映射目标的未知列(或未知属性类型)时的行为。NONE: 不处理; WARNING: 在日志中输出警告信息(依赖于日志); FAILING: 映射失败,抛出异常; <setting name="defaultExecutorType" value="SIMPLE"/>//配置默认执行器,SIMPLE: 不做特殊处理; REUSE: 再次使用已编译语句; BATCH:批处理 ; <setting name="defaultStatementTimeout" value="null"/>//设置驱动程序等待数据库响应的秒数。 <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/>//是否将下划线设置为驼峰命名法 <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>// 指定哪个对象的方法触发延迟加载 </settings>
3.4 typeAliases 别名处理
-
类型别名是为 Java 类型设置一个短的名字,可以方便我们引用某个类。(别名不区分大小写)
<typeAliases> <typeAlias type="com.atguigu.mybatis.beans.Employee" alias="emp"/> </typeAliases>
-
类很多的情况下,可以批量设置别名这个包下的每一个类创建一个默认的别名,就是简单类名小写
<typeAliases> <package name="com.atguigu.mybatis.beans"/> </typeAliases>
-
MyBatis已经取好的别名
3.5 typeHandlers 类型处理器
-
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型
-
MyBatis中提供的类型处理器:
-
日期和时间