目录
1.3.2 ORM(Object Relational Mapping)
2.3.1 SqlSessionFactoryBuilder
1. 初识MyBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
官方网站:http://mybatis.org
ORM框架:实体类和SQL语句之间建立映射关系
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目
1.1 优点和缺点
优点
- 简单的持久化框架,小巧并简单易学
- 灵活, 不会对应用程序或者数据库的现有设计强加任何影响
- SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
- 提供XML标签,支持编写动态SQL
- 提供映射标签,支持对象与数据库的ORM字段映射
- 提供对象关系映射标签,支持对象关系组建维护
缺点
- SQL语句编写工作量大,对开发人员有一定要求
- 数据库移植性差
1.2 MyBatis主要组成
- MyBatis的核心对象
- SqlSessionFactoryBuilder(构造器)
- SqlSessionFactory(工厂)
- SqlSession(类似于JDBC的Connection)
- SqlMapper(映射器)
- SqlSessionFactoryBuilder(构造器)
- 配置文件
1.3 持久化与ORM
1.3.1 持久化
1.3.2 ORM(Object Relational Mapping)
编写程序的时候,以面向对象的方式处理数据
保存数据的时候,却以关系型数据库的方式存储
ORM解决方案包含下面四个部分
- 在持久化对象上执行基本的增、删、改、查操作
- 对持久化对象提供一种查询语言或者API
- 对象关系映射工具
- 提供与事务对象交互、执行检查、延迟加载以及其他优化功能
2. 简单框架搭建
注:不是最优化方案,只是一个方便学习的实例。
- 下载mybatis-3.2.x.jar包并导入工程
- 编写MyBatis核心配置文件
- 创建实体类-POJO
- DAO层-SQL映射文件(XxxMapper.xml)
- 创建测试类
2.1 核心配置文件配置
核心文件
<?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元素的子元素进行配置(不常用) -->
<properties resource="datasource.properties"></properties>
<!-- 设置选项,用于设置和改变MyBatis 运行中的行为 -->
<settings>
<!-- 日志配置 -->
<setting name="logImpl" value="LOG4J" />
<!-- 设置查询数据库超时时间 (默认值:Not Set (null)) -->
<setting name="defaultStatementTimeout" value="25000" />
<!-- 指定 MyBatis 是否以及如何自动将列映 射到字段/属性。 PARTIAL(默认): 只是自动映射简单、非嵌套 的结果集。 FULL:
将会自动映射任何复杂的(嵌套 或非嵌套)的结果集 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 除了需求外,以下属性一般无需特意配置 -->
<!-- 全局性地启用或禁用所有在mapper配置文件中配置的缓存。(默认值:true) -->
<setting name="cacheEnabled" value="true" />
<!-- 全局性地启用或禁用延迟加载。当禁用时,所有关联的配置都会立即加载。(默认值:true) -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 允许或禁止从单一的语句返回多个结果集(默认值:true) -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 使用列的标签而不是列的名称(默认值:true) -->
<setting name="useColumnLabel" value="true" />
<!-- 允许JDBC自动生成主键(默认值:false) -->
<setting name="useGeneratedKeys" value="false" />
<!-- 是否启用字节码增强机制 -->
<setting name="enhancementEnabled" value="false" />
<!-- 配置默认的执行器(executor)。 SIMPLE(默认):简单的执行器。 REUSE :重用prepared statements的
执行器。 BATCH:重用 statements并且进行批量 更新的执行器。 -->
<setting name="defaultExecutorType" value="SIMPLE" />
</settings>
<!-- 实体类型别名配置,减少输入多余的完整类名 -->
<typeAliases>
<!-- <typeAlias alias="Student" type="cn.kgc.pojo.Student"/> 别名匹配,比较繁琐,不推荐使用 -->
<!-- 包名匹配 -->
<package name="cn.cs.pojo" />
</typeAliases>
<!-- 不常用配置,本实例没有配置 -->
<!--typeHandlers:重写类型处理器(type handlers)后,在此配置映射 -->
<!-- objectFactory:重写 ObjectFactory后,在此配置映射 -->
<!-- 插件配置:需要时配置 -->
<plugins>
<!-- 分页插件配置 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql" />
</plugin>
</plugins>
<!-- 运行环境配置。可以配置多个运行环境,但是每个SqlSessionFactory 实例只能选择一个运行环境。 -->
<environments default="development">
<environment id="development">
<!-- 事物管理器 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源 -->
<dataSource type="POOLED">
<!-- 简单数据源配置,详细配置请自行百度 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- SQL映射类配置,减少输入多余的完整类名 -->
<mappers>
<!-- <mapper resource="cn/kgc/dao/StudentMapper.xml"/> 全名称匹配,不推荐使用 -->
<!-- 包名匹配 -->
<package name="cn.cs.dao" />
</mappers>
</configuration>
database.properties数据库配置
driverClassName=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf-8
username=root
password=root
补充:
属性能够被可动态替换(即使用占位符)的属性值引用 如:${driver},引用properties配置文件键后的值
2.2 实体类和映射文件
sql映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.kgc.dao.StudentMapper">
<select id="getStudents" resultType="Student">
select * from student
</select>
<update id="updateStu" parameterType="Student">
update student set sName=#{sName} where id = #{id}
</update>
<delete id="addStu" parameterType="Student">
insert into student(sName,age,addres) values(#{sName},#{age},#{addres})
</delete>
<insert id="delstu">
delete from student where id = #{id}
</insert>
</mapper>
实体类
public class Student {
private int id;
private String sName;
private int age;
private String addres;
public Student() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddres() {
return addres;
}
public void setAddres(String addres) {
this.addres = addres;
}
@Override
public String toString() {
return "Strudent [id=" + id + ", sName=" + sName + ", age=" + age + ", addres=" + addres + "]";
}
}
- 实体类POJO,按照数据库中对应表的结构编写
- 映射文件按照给定模板编写
- 根元素mapper,指定namespace
- 当属性名与列名不一致时,定义resultMap进行映射
- 定义CRUD标签(select、insert、delete、update),编写SQL语句
- 每个标签指定id用于查找;parameterType属性指定参数类型;resultMap指定返回值类型
2.3. 核心对象的创建
2.3.1 SqlSessionFactoryBuilder
用过即丢,其生命周期只存在于方法体内
可重用其来创建多个 SqlSessionFactory 实例
负责构建SqlSessionFactory,并提供多个build方法的重载
2.3.2 SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
作用域:Application
生命周期与应用的生命周期相同
单例:存在于整个应用运行时,并且同时只存在一个对象实例
2.3.3 SqlSession
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享
MybatisUtils工具类
public class MybatisUtils {
private static SqlSessionFactory factory;
// 在static里,factory只会被建立一次
static {
try {
// 获取config.xml的输入流
InputStream is = Resources.getResourceAsStream("config.xml");
//工厂建造器build()方法创建sqlSession 工厂
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
// 建立sqlsession
public static SqlSession createSqlSession() {
return factory.openSession(true); // true: 自动提交事物
}
// 释放资源
public static void close(SqlSession sqlSession) {
if (null != sqlSession) {
sqlSession.close();
}
}
}
2.3.4 SqlSession的两种使用方式
StudentMapper接口
public interface StudentMapper {
//1.查询学生表的记录数
public int count();
}
通过SqlSession实例直接运行映射的SQL语句
@Test
public void test1() throws IOException {
SqlSession se=null;
se=MybatisUtils.createSqlSession();
//通过SqlSession实例直接运行映射的SQL语句
int count=se.selectOne("cn.kgc.dao.StudentMapper.count");
System.out.println(count);
MybatisUtils.close(se);
}
基于Mapper接口方式操作数据
@Test
public void test2() throws IOException {
SqlSession se=MybatisUtils.createSqlSession();
//基于Mapper接口方式操作数据
int count= se.getMapper(StudentMapper.class).count();
System.out.println(count);
MybatisUtils.close(se);
}
注意:方式2要求Mapper接口的名称必须和映射文件中mapper元素的namespace属性完全一致,方式1则无此要求;另外Mapper接口中的方法名需和映射文件中相应元素的id属性对应
3. 映射文件详解
3.1 select元素详解
3.2 Insert、 update、 delete 元素详解
3.3 Sql 元素
3.4 参数( Parameters )
3.5 resultMap 元素
3.5.1 高级结果映射
3.5.2 一对一
3.5.3 一对多
3.6 Cache 元素
3.7 cache-ref 元素
动态SQL