MyBatis简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
-
MyBatis前身是iBatis,本是Apache的一个开源的项目
-
官方网站 mybatis
-
mybaits是什么
-
ORM框架(O:对象,R:关系,M:映射) ,同类产品Hibernate
-
ORM框架建立java语言中O(对象)与数据库中的R(数据表)之间的M(对应的关系),可以编程方式去操作数据库
-
-
实体类和SQL语句之间建立映射关系
-
-
特点
-
基于SQL语法,简单易学
-
能了解底层封装过程
-
SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
-
方便程序代码调试
-
项目演示
演示超市订单系统
Hello MyBatis
添加mybatis支持
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zking.mybatis</groupId>
<artifactId>mybatis01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.29</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<encoding>utf-8</encoding>
<source>1.8</source>
<compilerVersion>1.8</compilerVersion>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
resources:默认情况下,不会编译src文件夹中的配置文件
核心配置文件
核心配置文件的名称可以任意,这里取名为mybatis-config.xml,可以从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>
<!--resource="database.properties" 加载类路径中的database.properties文件 -->
<properties resource="database.properties"/>
<settings>
<setting name="logImpl" value="SLF4J"/>
</settings>
<typeAliases>
<!-- <typeAlias type="User" alias="user"/> -->
<!--package会使用 Bean 的首字母小写的非限定类名来作为它的别名 -->
<package name="com.zking.ssm.pojo"/>
</typeAliases>
<!-- 环境配置 -->
<environments default="development">
<environment id="development">
<!--事务管理,有JDBC:由mybatis自身管理事务;MANAGED:由容器管理 -->
<transactionManager type="JDBC"/>
<!-- 数据源,有UNPOOLED非连接池,POOLED连接池,JNDI数据源 -->
<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>
<mappers>
<!-- <mapper resource="com/zking/ssm/dao/UserMapper.xml"/> -->
<!--
package name的方式要求
1)接口与映射文件在一个包下
2)接口与映射文件相同
-->
<package name="com.zking.ssm.dao"/>
</mappers>
</configuration>
创建实体类-POJO
public class User {
private Integer id; // id
private String userCode; // 用户编码
private String userName; // 用户名称
private String userPassword; // 用户密码
private Integer gender; // 性别
private Date birthday; // 出生日期
private String phone; // 电话
private String address; // 地址
private Integer userRole; // 用户角色
private Integer createdBy; // 创建者
private Date creationDate; // 创建时间
private Integer modifyBy; // 更新者
private Date modifyDate; // 更新时间
...
Mapper接口
public interface UserMapper {
/**
* 方法名要与Mapper.xml文件中的id相同
* 返回类型与resultXXX类型相匹配
*
* 查询用户表记录数
*/
public int count();
/**
* 查询用户列表
*/
public List<User> getUserList();
}
不是必须,但一般采用Mapper接口发送SQL
SQL映射文件(mapper.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">
<!-- 映射文件 -->
<!--namespace命名空间 的功能
1)保证SQL标识唯一
2)与接口路径相同-->
<mapper namespace="com.zking.ssm.dao.UserMapper">
<select id="count" resultType="int">
select count(1) from smbms_user
</select>
<!--
resultType:类型为集合中的对象类型
-->
<select id="getUserList" resultType="User">
select * from smbms_user
</select>
</mapper>
创建测试类
public class FirstTest {
@Test
public void testCount() throws Exception{
// FirstTest.class.getResourceAsStream("资源文件路径");
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//SqlSession的两种使用方式之一:通过SqlSession实例直接运行映射的SQL语句
int count = sqlSession.selectOne("com.zking.ssm.dao.UserMapper.count");
sqlSession.close();
System.out.println(count);
}
}
读取核心配置文件mybatis-config.xml
创建SqlSessionFactory对象,读取配置文件
创建SqlSession对象
调用mapper文件进行数据操作
MyBatis框架优缺点
-
优点
-
与JDBC相比,减少了50%以上的代码量
-
最简单的持久化框架,小巧并简单易学
-
SQL代码从程序代码中彻底分离,可重用
-
提供XML标签,支持编写动态SQL
-
提供映射标签,支持对象与数据库的ORM字段映射
-
-
缺点
-
SQL语句编写工作量大,对开发人员有一定要求
-
数据库移植性差
-
MyBatis基本要素
MyBatis的核心对象
-
SqlSessionFactoryBuilder
-
SqlSessionFactory
-
SqlSession
核心配置文件
mybatis-config.xml,名称可以任意
映射文件
XXXMapper.xml
SqlSessionFactoryBuilder----build()--->2.SqlSessionFactory---openSession()--->3.SqlSession
SqlSessionFactoryBuilder
用过即丢,其生命周期只存在于方法体内
可重用其来创建多个 SqlSessionFactory 实例
负责构建SqlSessionFactory,并提供多个build方法的重载
SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心。作用:创建SqlSession实例
作用域:Application,生命周期与应用的生命周期相同
单例:存在于整个应用运行时,并且同时只存在一个对象实例
SqlSession
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享
SqlSession的两种使用方式
通过SqlSession实例直接运行映射的SQL语句
基于Mapper接口方式操作数据
SqlSession的两种使用方式
SqlSession发送Sql;
主要就是“配置文件(xml)+映射文件(mapper)+实体类(pojo)+测试类(test)”
Mapper 接口发送 SQL;
主要就是“配置文件(xml)+映射文件(mapper)+实体类(pojo) + Dao(接口)+测试类(test)”
DAO中的接口
public interface UserMapper {
/**
* 方法名要与Mapper.xml文件中的id相同
* 返回类型与resultXXX类型相匹配
*
* 查询用户表记录数
*/
public int count();
/**
* 查询用户列表
*/
public List<User> getUserList();
}
DAO中的mapper.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">
<!-- 映射文件 -->
<!--namespace命名空间 的功能
1)保证SQL标识唯一
2)与接口路径相同-->
<mapper namespace="com.zking.ssm.dao.UserMapper">
<select id="count" resultType="int">
select count(1) from smbms_user
</select>
<!--
resultType:类型为集合中的对象类型
-->
<select id="getUserList" resultType="User">
select * from smbms_user
</select>
</mapper>
测试类
public class SecondTest {
@Test
public void testCount() throws Exception{
// FirstTest.class.getResourceAsStream("资源文件路径");
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//SqlSessionFactoryBuilder用来创建多个SqlSessionFactory;生命周期,即用即丢
//SqlSessionFactory用来创建SqlSession实例;单例,生命周期,整个应用
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
//SqlSession包含了执行SQL所需的所有方法,对应一次数据库会话,会话结束必须关闭,线程级别,不能共享;
SqlSession sqlSession = sqlSessionFactory.openSession();
//SqlSession的两种使用方式之二:基于Mapper接口方式操作数据
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int count = userMapper.count();
sqlSession.close();
System.out.println(count);
}
}
mybatis-config.xml 系统核心配置文件
-
configuration 配置
-
properties 可以配置在Java 属性配置文件中
-
settings 修改 MyBatis 在运行时的行为方式
-
typeAliases 为 Java 类型命名一个别名(简称)
-
typeHandlers 类型处理器
-
objectFactory 对象工厂
-
plugins 插件
-
environments 环境
-
environment 环境变量
-
transactionManager 事务管理器
-
dataSource 数据源
-
mappers 映射器
-
properties
-
配置properties元素的两种方式
-
通过外部指定的方式(database.properties),实现动态配置
-
直接配置为xml,实现动态配置
-
-
通过外部指定的方式(database.properties),实现动态配置
-
配置properties的resource属性
-
<properties resource="database.properties"/>
......
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
-
直接配置为xml,实现动态配置
-
配置property的name和value
-
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</properties>
......
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
resource属性值的优先级高于property子节点配置的值
settings元素
-
用来修改MyBatis运行时的行为方式
-
主要是MyBatis的一些全局配置属性的设置
设置项 | 描述 | 允许值 | 默认值 |
---|---|---|---|
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置 | true | false | true |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 | true | false | true |
autoMappingBehavior | MyBatis对于resultMap自动映射匹配级别 | NONE | PARTIAL | FULL | PARTIAL |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | 未设置 |
typeAliases
-
类型别名
-
仅仅只关联XML配置,简写冗长的Java类名
<typeAliases>
<typeAlias alias="User" type="cn.smbms.pojo.User"/>
</typeAliases>
单独为每个类指定别名
<typeAliases>
<package name ="cn.smbms.pojo" />
</typeAliases>
自动给指定包下的类取别名,别名首字母小写
environments
-
表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上
-
子元素节点:environment,但是必须指定其中一个为默认运行环境(通过default指定)
-
每个SqlSessionFactory实例只能选择一个运行环境
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
……
</environment>
</environments>
transactionManager-事务管理器
<transactionManager type="[ JDBC | MANAGED ]" />
使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等
使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理
dataSource
dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
有三种内建的数据源类型<dataSource type=" [UNPOOLED | POOLED | JNDI]" />
UNPOOLED,MyBatis 会为每一个数据库操作创建一个新的连接,并关闭它。该方式适用于只有小规模数量并发用户的简单应用程序上
POOLED,MyBatis 会创建一个数据库连接池,连接池中的一个连接将会被用作数据库操作。一旦数据库操作完成,MyBatis 会将此连接返回给连接池。在开发或测试环境中,经常使用此种方式。
JNDI,MyBatis 从在应用服务器向配置好的 JNDI 数据源 dataSource 获取数据库连接。在生产环境中,优先考虑这种方式。
mappers
-
映射器,定义SQL映射语句
-
须在配置中引用mapper映射文件
-
方式一:使用类资源路径获取资源
<!-- 将mapper映射文件加入到系统核心配置文件中 --> <mappers> <mapper resource="cn/smbms/dao/user/UserMapper.xml"/> </mappers>
-
方式二:使用URL获取资源
<mappers> <mapper url="file://E:/sqlmappers/UserMapper.xml"/> <mapper url="file://E:/sqlmappers/ProviderMapper.xml"/> </mappers>
-