1. 持久化概念:
1.1. 持久化是程序数据在瞬时状态和持久状态间转换的过程
2. ORM概念
2.1. Object Relational Mapping 对象关系映射
2.2. 数据在程序中以对象的形式被操作,例如User user=new User(1,”jack”);
2.3. 数据在数据库以一行记录的形式被保存,例如
编号 | 姓名 |
1 | Jack |
2.4. 两种形式通过某种框架进行切换
3. Mybatis框架的特点
3.1. 基于SQL语法,能了解底层封装过程,程序员编码的自由度较高
3.2. SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
4. Mybatis框架的劣势
4.1. 针对不同数据库的兼容性不高,程序可移植的程度不够高
5. 搭建mybatis环境的步骤
5.1. 下载mybatis-3.2.2.jar包并导入工程
5.2. 编写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="jdbc.properties">
</properties>
<!-- 设置数据库运行环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- ${ } 从资源文件jdbc.properties中根据键获取对应的值 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${uname}" />
<property name="password" value="${upwd}" />
</dataSource>
</environment>
</environments>
<!-- 加载所有针对接口的映射文件 -->
<mappers>
<mapper resource="com/mapper/EmpMapper.xml" />
</mappers>
</configuration>
5.3. 创建实体类-POJO
5.4. DAO层接口
5.5. 针对DAO层接口的SQL映射文件(EmpMapper.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 当前映射文件所针对的接口全称 -->
<mapper namespace="com.dao.EmpDao">
<!-- insert节点:实现插入操作接口方法
id 接口方法名
parameterType 接口方法的参数类型
#{ } 以参数Emp对象的属性名获取属性值,给sql语句赋值
-->
<insert id="addEmp" parameterType="com.entity.Emp" >
insert into emp values
(seq_emp.nextval,#{ename},#{job},#{hiredate},#{sal},#{comm},#{deptid})
</insert>
</mapper>
5.6. 创建测试类
//加载mybatis配置文件
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactory对象:为了创建SqlSession
SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(is);
//根据SqlSessionFactory对象创建SQLSession对象:进行数据库操作
SqlSession session=sf.openSession();
//根据接口信息和对应的映射文件,动态生成接口实现类的对象
EmpDao ed= session.getMapper(EmpDao.class);
int i=ed.addEmp(new Emp("jerry","coder",new Date(),9999.9d,8888.8d,1));
//增删改操作需要手动提交
session.commit();
System.out.println(i);
6. Mybatis的核心对象
6.1. SqlSessionFactoryBuilder 数据库会话工厂创建者对象,创建会话工厂对象
6.2. SqlSessionFactory 数据库会话工厂对象,生成多个SqlSession对象
6.3. SqlSession 数据库操作对象
7. Mybatis-config.xml 配置项目的数据源,项目常规配置(给实体类或包命别名,设置自动映射行为...),加载所有接口映射文件XxxMapper.xml
8. XxxMapper.xml 通过配置方式实现接口方法
9. mybatis核心对象的生命周期
9.1. SqlSessionFactoryBuilder
9.1.1. 用过即丢,其生命周期只存在于方法体内
9.1.2. 可重用其来创建多个 SqlSessionFactory 实例
9.1.3. 负责构建SqlSessionFactory,并提供多个build方法的重载
9.2. SqlSessionFactory
9.2.1. 作用域:Application,生命周期与应用程序的生命周期相同
9.2.2. 单例:存在于整个应用运行时,并且同时只存在一个对象实例
9.3. SqlSession
9.3.1. 对应一次数据库会话,会话结束必须关闭
9.3.2. 线程级别,不能共享
10. Mybatis-config.xml常用配置
10.1. Properties
<properties resource="database.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>
resource属性值的优先级高于property子节点配置的值,加载资源文件的数据优先于之后通过property 节点赋值
10.2. autoMappingBehavior
10.2.1. NONE 关闭自动映射实体类的属性与列名的对应
10.2.2. PARTIAL 默认方式:根据实体类属性名与列名的一致关系,将数据自动赋值给对象属性,如果属性名与列名不一致,则该属性值为空
10.2.3. FULL 支持实体类拥有对象类型的属性,例如User类中包含Address属性,则可以将查询结果映射到子对象的属性中
10.3. typeAliases
<typeAliases>
<!-- 给实体类命别名,在XxxMapper.xml中涉及到实体类名称时,只需写别名 -->
<!-- <typeAlias type="com.entity.Emp" alias="Emp" /> -->
<!-- 给包名命别名 -->
<package name="com.entity"/>
</typeAliases>
10.4. Mappers
<!-- 加载所有针对接口的映射文件 -->
<mappers>
<mapper resource="com/mapper/EmpMapper.xml" />
</mappers>