Mybatis笔记
一. 引言 现有jdbc代码实现的dao不足:代码冗余,只有sql命令不一样.sql命令硬编码程序中部利于升级维护.建立数据库连接需要手动建立, 效率差 ( 没有应用”连接池”技术)
Mybatis框架 Mybatis是个做数据持久化的框架,对jdbc代码的合理封装,主要完成数据库的访问操作( 增删改查 )Mybatis提供了一种新的实现方式替换jdbc实现的dao 搭建环境 导入相关jar包 必须: mybatis-3.2.2.jar ojdbc5.jar 日志: log4j.jar引入配置文件 Mybatis-config.xml → src下 log4.properties → src初始化配置 ( 为mybatis-config.xml设置内容 ) 二. 第一个Mybatis程序 准备程序 建表 2) 实体 3) 定义dao接口 使用mybatis实现dao接口里的定义 — mapper文件 注册映射文件 — 在mybatis-config.xml里注册 测试代码 核心类 测试代码 三. Dao里的其他常规方法 查所有 删除操作 注意: mybatis做增删改功能时,都必须手动控制事务(手动提交) 更新操作 — update 添加 === insert 四. MybatisUtil工具类的封装Mybatis里的SqlSession封装了Connection对象SqlSessionFactory对象是配置文件在内存中的表现 , 是读取配置文件后封装的对象 , 这个对象只需要构建一次即可( 配置文件只需要读取一次) SqlSessionFactory对象是重量级组件, 框架在设计这个对象时已经考虑了线程安全问题, 所以只会创建一个这样的对象Mybatis笔记 第二天
一. 复习
作用 : 是对jdbc代码的封装 , 取代jdbc完成对db的访问操作搭建环境 : 1) 引入jar包 2) 引入配置文件—src 3)初始化配置开发 -1) 建表 -2) 实体 -3) dao接口( 5个 ) -4) 映射文件 — 给出接口的实现 -5) 注册映射文件 — mybatis-config.xml |-- <mapper resource=”mapper文件路径 — 从src下,不能以’/’ 开头 ”/>-6) 测试代码 ---- service层代码 A. mybatis启动代码 ---- SqlSession SqlSessoinFactoryBuilder builder = new SqlSessionFactoryBuilder(); Reader reader = Resources.getResourceAsReader(“mybatis-config…”); SqlSessionFactory factory = builder.build(reader); SqlSession session = factory.openSession(); B. 获取dao的对象 XXXDao dao = session.getMapper( XXXDao.class ); C. 调用dao的方法 D. 增删改 — session.commit() E. 释放资源 — session.close();
二. 映射文件补充
关于insert方法的实现 注意 : 果对象的某些属性在插入时有null,则需要为这个属性指定jdbcType 常用的jdbcType : DATE VARCHAR NUMERIC TIMESTAMP2. 关于查询的一些特例
模糊查询 在sql命令里拼接字符串: 在java程序里拼接 多参查询 强调: 方法的形参名在编译过程中被丢弃( 不会出现在字节码文件中 , 函数调用过程中形参名不起任何作用) A. 使用参数列表里参数的下标来指定参数 B. 使用”注解”技术为形参定义可以长久(至少能出现在字节码文件中)保留的名字 含有特殊符号的查询 ( > < >= <= ) a. 使用文字的方式来代替特殊符号解决问题 大于等于 >= ≥ 小于等于 ≤ b. 脚本文件中 对于特殊符号的通用解决方案 字段名和属性名不对应 a. Mybatis在处理结果集封装实体对象时, 会根据 “结果里的字段名” 查找实体对象的 “同名属性” , 进行赋值 ; 没有同名属性, 则赋值失败 b. 如果表里的字段名和实体类的属性名不一致 , 解决方案: 在定义select语句时 , 为查询结果里的字段定义别名 , 别名与实体类的属性名一致 三. 配置文件的补充关于别名的问题 Mybatis允许在配置文件中为实体类定义别名( 只适用于实体类,不包括接口)
关于引入外部的小配置文件 四. 关联数据的处理
关联关系
一对一关系 : student 和 computer一对多关系 : student 和 team [重点]多对多关系 : student 和 course 一对多关系 ( 多对一 ) ---- student和team Student ( id name age ) Team( id name count ) 在数据库里通过表的形式来描述关系 在java里建立实体类对应数据库表 定义dao接口 — 两个dao StudentDao{ 5个方法 } TeamDao{ 5个 }提供实现的mapper文件 a. 对于没有关系属性的dao , 按照单表操作完成(与原来一样) b. 有关系属性的dao , 对于里面的增删改操作与单表基本一致 c. 有关系属性的dao的查询方法特殊处理Mybatis笔记 第三天
一. 复习
对映射文件补充 插入功能 [重点] <insert id=”” parameterType=””> <selectKey resultType=”int” keyProperty=”属性名id” order=”BEFORE”> Select xxx_seq.nextval from dual </selectKey> Insert into xxx values( 所有数据全部来自于参数对象 #{属性名,jdbcType=…..}) </insert> 查询功能 a. 多参查询 — @Param(value=””) b. 特殊符号的处理 — <![CDATA[ ……. ]]> c. 字段名和属性名不一致 — 处理 在查询过程中为字段定义别名( 别名与实体类的属性名一致) 对配置文件补充 定义别名 — 将所有与数据库连接的数据定义在小配置文件里, 在mybatis的配置文件中通过引入 获取小配置文件里定义的数据 — ${名字} 关联关系数据的处理 — 多对一 [重点] 在db里体现 ( 通过添加外键的形式体现关系 ) 在多的一方添加外键在java的实体类之间体现关系 ( 通过设置对方的引用来体现关系 ) 多对一 : 多的一方保留”关系属性” (一个引用) **** 一对多 : 一的一方保留”关系属性” (一个集合引用)定义dao的接口 ---- 两个接口定义映射文件 a. 对于没有关系属性的dao , 与单表操作一致 b. 有关系属性的dao , 里面增删改没有变化 c. 有关系属性的dao的查询方法改变 使用左外连接查询 , 需要为查询结果封装resultMap |— |— |— 二. 一对多 ( Student — Team ) 在db里描述 ---- 没区别 在java的实体类间描述关系 定义dao接口 ---- 两个dao( 每个dao里5方法 )为dao接口提供映射文件 没有关系属性的dao与单表操作一样 ---- StudentDaoImpl.xml有关系属性的dao增删改与单表一致 ---- TeamDaoImpl.xmlTeamDaoImpl.xml的查询功能特殊处理 三. 一对一关系 ( Student — Computer ) 在数据库里描述一对一关系 第二种方式: 在java里通过实体类来体现关系 定义dao接口( 两个dao )为dao接口提供映射文件 没有关系属性dao对应的映射文件按”单表操作”处理 — Computer有关系属性的dao 对应的映射文件增删改原样处理查询需要特殊处理 四. 多对多 ----- student~course 在db里描述多对多 在java实体类间描述多对多 定义dao接口 ? 如果多对多只涉及查询功能 , 可以继续完成代码, 定义两个dao如果多对多涉及到增删改功能 , 则在业务分析阶段就应该将多对多拆分成两个一对多,按照一对多方式处理 假设现在只需要查询功能 需要为两个dao接口提供映射文件有关系属性的查询需要特殊处理(StudentDao的查询方法需要特殊处理) 涉及增删改的处理 人为添加一组业务数据( 对应的实体) 来将一个多对多拆分成两个一对多 五. 关系数据处理总结 Db : 统一方式添加外键 ( 还需要其他技术辅助 )Java : 添加关系属性( 保存对方的引用) , 一个引用 或者 集合引用Dao对应的映射文件 查询时使用”左外连接”封装resultMap处理查询结果 ( ) 六. 动态sql条件判断
: 代替where命令 , 可以去掉条件前面多余的and 或者 or
: 代替set命令, 去掉sql命令中后面多余的 "," ----update操作
: 循环 七. Mybatis和struts2的整合
新建一个web project
搭建开发环境
导入jar包 : struts需要的jar mybatis需要的jar导入配置文件 (src) : struts.xml mybatis-config.xml 小配置文件conf初始化配置: web.xml( 核心过滤器) mybatis-config.xml 复用代码 ---- util(MybatisUtil)开发 建表建实体类 ( 关系属性的处理 )在mybatis-config.xml文件里定义实体类的别名定义dao接口提供映射文件mapper ( 查所有 )定义service层接口 , 为接口提供实现类(注意控制事务 ; session关闭问题)定义action程序(实例变量传递数据) 并且配置 ---- struts.xml定义view.jsp显示数据 ( 使用struts标签 )Mybatis 回顾 一. SqlSession // 获取SqlSessionFactory Factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(“mybatis-config.xml”)); // 获取sqlSession sqlSession = factory.openSession(); 注: sqlSession的作用
控制事务获取dao接口实现类的对象 二. 参数绑定机制 Public Student queryById(Integer id); Public User queryByUsernameAndPassword(@Param(“username”)String username,@Param(“password”)String password); Public void insert(User user);// #{对象属性名} Ps: 下标的形式 和注解的形式 , 对象的形式 三. resultMap <resultMap id=”userMap” type=”实体类全限定名/ 别名”> // column 出现在查询结果中的列的名字 property 对应的实体属性名 //关系属性 类型是简单的java对象 <association property=”关系属性变量名” javaType=”关系属性类型的全限定名/ 别名”> … //关系属性 类型一个list集合 <collection property=” 关系属性变量名” ofType=”集合元素类型的全限定名/ 别名”> … 四. 动态sql <forEach …>Sql 片段 五. Struts2+ mybatis整合完成ems2.0 分析建表: 确定项目中有几张表,每个表中有哪些字段 分析表与表之间的关系 用户表 员工表 部门表 六. 缓存(cache) – 内存 : 针对项目优化的一种策略 .缓存机制: 在项目中加入缓存机制后, 用户每次进行查询操作的时候, 先到缓存中拿数据, 如果没有,再到数据库查询.( 每一次在数据库中查询完的数据, 会放到缓存中一份).使用缓存的好处: 避免了频繁的创建和销毁数据库链接.提高查询数据的效率. Mybatis中缓存的应用 -一级缓存 : 基于SqlSession的 -二级缓存 :基于SqlSessionFactory级别, 默认情况下,mybatis的二级缓存是关闭的.3.1 开启mybatis的二级缓存 3.2 在对应需要使用缓存的mapper文件中加入配置: 3.3 mybatis缓存使用注意事项: - sqlSession使用完 必须关闭. // 不关闭sqlSession不会向缓存中放数据 -实体类要实现序列化接口 Serializable 3.4 脏数据: 缓存中的数据与数据库中的数据不一致. 注意: 为了避免脏数据的出现, mybatis默认在执行完增 删 改 之后, 自动清空缓存.
