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>
-