1.MyBatis框架学习笔记
1.MyBatis框架学习笔记
一. 环境搭建
-
1.导入myBatis官方jar包,若需要访问源码需导入相应的file路径;
-
2.xml配置文件的编写
(1).导入DTD编写规范文件:
window -->preferences -->xml–>xml cataog -->fileSystem–>本地文件 -->myBatis相关的DTD约束文件;(2).新建configuration标签,添加框架使用的数据库信息等
-
3.底层实现类(mapper)编写:
(1) 新建以mapper结尾的包名,存放底层实现(DAO)的xml配置文件
(名称为包名+Mapper);(2) 在该xml配置文件写以下内容:
-
4.测试类的编写:
若项目整合了SSM框架,则无需单独写以下测试类
1.注意selectList中的包名必须是完整的包名+类名
-
5.将SqlSessionFactory创建SqlSession的过程封装为单独的工具类
1.采用fliter管理SqlSession的创建,事务提交,事务回滚的全过程
2.由于同一次业务使用了同一个SqlSession对象,无需在执行每一次事务时重复进行创建SqlSession对象;
3.因此在工具类中采用了容器ThreadLocal来装入创建好的SqlSession对象,
用于保证同一次业务中,每一次事务执行时调用的SqlSession对象都是最先执行事务的所创建的SqlSession对象,原理:相同线程的对象才能调用ThreadLocal的get()方法后并成功获取其中存储的对象,由于同一次业务中的事务属于一个 线程,因此能够获得其中的内容
-
6.从工具类剖析myBatis运行原理
(1)先由Resource对象读取myBatis的配置文件xml,获取相关的连接数据库信息,实体类别名信息,映射类(mapper 类似jsp+servlet模式的dao层)信息,
(2)实例化SqlSessionFactoryBuilder构建器,并且XMLConfigBuilder解析配置文件的IO流,并将解析信息存储进入Configuration对象中,从而实例化SqlSessionFactory对象的实现类DefaultSqlSessionFactory,完成SqlSessionFactory对象的创建
(3)由创建完成的SqlSessionFactory对象创建SqlSession对象,并且需要由TransactionFactory创建Transaction对象(每次创建SqlSession对象所伴随创建),以及创建SqlSession所需要的执行器对象Excutor,最终实例化DefaultSqlSession实现类
(4)由生成的SqlSession对象调用内部接口的API,并传入事务相关内容(mapper命名空间+id[方法名])
二.相关方法
-
7.myBatis中调用Sql语句命令的执行方案
1.采用mapper包只用于存放相应的Mapper文件,并对其中sql语句进行调用:
(1).service类编写的代码:[命名空间+方法的id] session = myUtil02.getSession(); List<student> list =session.selectList("test1.dao.selAll"); (2).Mapper类中编写的代码: <mapper namespace="test1.dao">//命名空间可以不与这个Mapper路径一致 <!-- resultType:返回值的类型,可以加上相关的JavaBean文件的全路径以声明该类型 --> <select id="selAll" resultType="student"> select * from stus </select> </mapper> (3).配置文件.xml中编写的代码(注册Mapper类) <mappers> <mapper resource="com/testMybatis/Mapper/studentMapper.xml"/> </mappers>
2.采用接口映射,mapper包中存储Mapper文件以及其对应的Mapper接口(myBatis方案)
原理:采取动态代理模式,通过该接口调用在Mapper文件所对应的方法,代码如下: SqlSession session = myBatisUtil.getSession(); //对绑定接口进行声明 BalanceMapper bm = session.getMapper(BalanceMapper.class); Account accOutSel =bm.checkID(accOut); 注意处:(1).命名空间必须与接口路径一致,方法名id必须与接口方法名一致(类似于DAO) (2).在配置文件.xml中,mappers所填的标签为<package>
3.方法2的进一步简化版本,无需写Mapper文件,只需在接口方法上添加注解,适用于简单的CRUD:
实现查询 @Select("select * from teacher") List<Teacher> selAll(); 实现新增 @Insert("insert into teacher values(default,#{name})") int insTeacher(Teacher teacher); 实现修改 @Update("update teacher set name=#{name} where id=#{id}") int updTeacher(Teacher teacher); 实现删除 @Delete("delete from teacher where id=#{0}") int delById(int id); 注释:1.parameterType 控制参数类型: #{}获取参数内容 (1)使用索引,从 0 开始 #{0}表示第一个参数 (2)也可以使用#{param1}第一个参数 (3)如果只有一个参数(基本数据类型或 String),mybatis 对#{}里面内容没有要求只要写内容即可. 2.2.2.4 如果参数是对象#{属性名} (4)如果参数是 map 写成#{key} 2.#{} 和 ${} 的区别 #{} 获取参数的内容支持 索引获取,param1 获取指定位置参数, 并且 SQL 使用?占位符 ${} 字符串拼接不使用?,默认找${内容}内容的 get/set 方法,如 果写数字,就是一个数字
-
8.pojo实体类的设计
1.存放事务所产生的数据库查询结果(如学生信息表,单独的学生对象等等)
2.存储业务所产生的事务结果总和(例如pageInfo,表格,错误信息等等)
3.在注册文件xml中,可以对pojo类起别名,减少代码量,如:
<typeAliases> <typeAlias type="com.bjsxt.pojo.People" alias="peo"/> </typeAliases> //可以直接在returnType中写peo,代替包名+类名的写法
-
9.缓存:
-
缓存 1. 应用程序和数据库交互的过程是一个相对比较耗时的过程 2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率 3. MyBatis 中默认 SqlSession 缓存开启 3.1 同一个 SqlSession 对象调用同一个<select>时,只有第一次访问 数据库,第一次之后把查询结果缓存到 SqlSession 缓存区(内存)中 3.2 缓存的是 statement 对象.(简单记忆必须是用一个<select>) 3.2.1 在 myabtis 时一个<select>对应一个 statement 对象 3.3 有效范围必须是同一个 SqlSession 对象 4. 缓存流程 4.1 步骤一: 先去缓存区中找是否存在 statement 4.2 步骤二:返回结果 4.3 步骤三:如果没有缓存 statement 对象,去数据库获取数据 4.4 步骤四:数据库返回查询结果 4.5 步骤五:把查询结果放到对应的缓存区中 5. SqlSessionFactory 缓存 5.1 又叫:二级缓存 5.2 有效范围:同一个 factory 内哪个 SqlSession 都可以获取 5.3 什么时候使用二级缓存: 5.3.1 当数据频繁被使用,很少被修改 5.4 使用二级缓存步骤 5.4.1 在 mapper.xml 中添加 5.4.2 如果不写 readOnly=”true”需要把实体类序列化 <cache readOnly="true"></cache> 5.5 当 SqlSession 对象 close()时或 commit()时会把 SqlSession 缓存 的数据刷(flush)到 SqlSessionFactory 缓存区中
-
10 动态sql:参照复习笔记及源码