轻量级框架
EJB(Enterprise JavaBean)
- EJB容器为EJB组件提供一个运行环境,并对组件提供分布式处理、事务处理与服务支持
EJB的缺陷
- 编辑、编译、调试周期长
- 编码冗长、繁琐
- 必须编写数据传输对象(DTO)
Mybatis
对jdbc的封装:1.连接封装 2.SQL语句的封装(Mybatis没有封装) mybiatis为半自动化,需要自已写SQL语句,需要自己定义映射。增加了程序员的一些操作,但带来了设计上的灵活,并且也支持hibernate的一些特性,如延迟加载,缓存,映射等
Mybatis组成
- 核心对象:SqlSessionFactory SqlSession
- 配置文件:mybatis.cfg.xml 相当于hibernate的hibernate.cfg.xml
- 多个类配置文件:user.xml相当于hibernate的映射类文件 支持注解配置
ORM(Object Relationship Database Mapper)对象关系型数据库映射
- 类 对应 表
- 属性 对应 列
- 对象 对应 数据行
满足三项则为ORM映射型框架
Mybatis中当Map作为参数传值时,不能和其他类型参数一起
类与类的关系
- 继承
- 实现
- 关联:拥有与被拥有
- 聚合:部分可以脱离整体而单独存在
- 组合:部分不可以单独存在
- 依赖:使用与被使用
返回类型resultMap
在一对一关系中,返回类型resultMap中,需要使用association,值得注意的是在映射关系时,要对应查询数据库结果的列
在一对多关系中,返回类型resultMap中,需要使用collection,如果接口中并未指定参数别名,那么默认就是list
多对多关系 —— 在一对多、一对一关系中可能有变化的表都可以建立中间表
继承关系中,返回类型resultMap中,需要使用discrimination描述型自断
当查询条件需要动态生成时,需要使用动态SQL
<select id="dynaFindUser" resultMap="user">
select * from t_user where 1=1
<if test="id != 0">
and u_id > #{id}
</if>
<if test="userName != null and userName != ''">
and u_userName like '%${userName}%'
</if>
</select>
几种常用的动态SQL语句
- where
- if
- sql
- set if
- trim if
- choose when:等同于java中的Switch
- foreach
- include 与sql一起使用
Mybatis缓存
- 缓存对象
- 缓存SQL查询语句与对象集合的Map键值对
缓存级别
- 一级缓存(事务级缓存、session缓存) 由session提供 跟随session的生命周期,在同一个事务级缓存中,每个持久化类对象都是唯一的
- 二级缓存(应用级缓存)由session工厂提供 应用程序开启,工厂就开启,生命周期跟随工厂,也就是应用的生命周期,同一个工厂创建的缓存,所有创建的session共享这个缓存
- 分布式(集群)缓存 分布式环境下,缓存被同一个或多个机器上的多个进程共享,缓存中的数据复制到集群环境中每个进程节点。
在配置文件Mybatis.cfg.xml中通过settings开启缓存机制
session如果不关闭,那么一级缓存就不会关闭,如果关闭了,数据就会推送到session工厂里。一级缓存关闭后,二级缓存才会生效
持久层框架查找顺序
- session
- session工厂
- 数据库
但是一般是使用第三方缓存,Spring+EHCache
缓存里可以存放的数据
- 数据量较小
- 数据变化较少
- 数据的并发访问较少
缓存中一般存放的是对象
注解
使用mybatis注解开发,可以省去类配置文件,简洁方便。但是比较复杂的SQL和动态SQL还是建议书写类配置文件。
<!-- 定义接口,在接口方法中直接书写SQL --> public interface IUserDao { @Insert("insert into t_user(userName,classId)values(#{userName},#{classId})") public void add(UserBean bean) throws Exception; @Delete("delete from t_user where id=#{id}") public void del(int id) throws Exception;