关于Mybatis
一 :Mybatis概述
1.1 什么是框架
框架:是一个应用系统的半成品,开发人员在框架的基础上,根据业务需求开发功能
※让开发人员的代码更简单,功能更强
1.2 框架解决了什么问题
框架主要解决了技术整合问题
框架一般处于底层应用平台(如JavaEE)和高层业务逻辑之间
1.3 有哪些常见的框架
①Mybatis:作用于dao层,负责数据库访问的框架
是一个优秀的java轻量级的dao层框架,对JDBC进行了封装,使开发人员只需要注意sql语句,不需要关注JDBC的API执行细节
②Hibernate:作用于dao层,负责数据库访问的框架
封装程度过高,导致它的执行效率受到了影响,是重量级框架,使用的很少
③SpringMVC:作用在web层,负责和客户端交互的框架
使用简单,和Spring整合简单,导致SpringMVC框架在国内使用的越来越多
④Struts1/Struts2:作用在web层,负责和客户端交互的框架
Struts1是比较老的框架,目前已经基本不使用了。
Struts2目前使用的也越来越少,逐步被SpringMVC代替
⑤Spring:不是作用在某一层,而是实现web层、Service层、Dao层之间解耦的框架,是三层之间的粘合剂
二.Mybatis 快速入门
- 准备工作
- 创建库表
- 创建Maven工程,引入坐标依赖
- 创建和数据库表对应的JavaBean
- 创建接口
- 创建映射文件(com/itheima/mapper)
- 创建核心配置文件SqlMapConfig.xml
2 核心配置文件
-
顺序
-
引入外部的配置文件
<!--jdbc.properties jdbc.xxxx--> <property resource ="jdbc.properties"/>
-
JavaBean起别名
<typeAliases>
<package name="要起别名的JavaBean所在的包路径"/>
</typeAliases>
-
批量引入映射文件
<mappers>
<package name="接口所在的包路径"/>
</mappers>
3 参数
- 入参(parameterType)
- 简单类型(字符串和数字) #{xxx} xxx 和方法形参的名称一致
- JavaBean #{xxx} xxx 和对应的JavaBean中的字段名一致
- 封装的JavaBean #{xxx} xxx 字段名+ “.” + 字段名对应的JavaBean的字段名
- 出参(resultType resultMap)
- 简单类型 Integer
- JavaBean|List 方法返回值的全限定名,如果是List,泛型得全限定名
- resultMap 处理字段名和列名不一致的问题
4 #{} VS ${}
- #{} 占位符,自动类型转换,防止SQL注入
- ${},拼接sql,不支持类型转换,有SQL注入的风险.
三. 日志
- 拷贝坐标依赖
- 拷贝配置文件
- 使用方式
- 线上|生产 error,file
- 测试 info,file
- 开发 debug,std
四.连接池和事务
- 连接池好处(缩短单词请求的响应时间,避免连接资源的浪费)
- 在企业开发中使用的都是第三方连接池
- 事务( sqlSessionFactory.openSession(true) )
- 企业开发中使用的是Spring的声明式事务
五. 映射文件的深入
if 标签
<if test="要判断的条件,不应使用 && ,不要用占位符,判断要严谨"></if>
where 标签
<!--
1 判断SQL2的长度,若sql2的长度为0,啥都不干 2 判断SQL2的长度,若sql2的长度不为0,SQL1后盾追加 WHERE,去掉SQL2中第一个出现的AND或者OR,在把sql1 和SQL2 拼接起来
-->
SQL1
<where>
<if test="">
SQL2
</if>
```
foreach 标签
<foreach collection="要遍历的集合" open="以什么开始" close="以什么结束" item="临时变量userId" separator="以什么分割">
#{userId}
</foreach>
sql 片段
<sql id="selectUser">
SELECT * FROM user
</sql>
<include refid="selectUser"></include>
六. 多表查询
- 概念
- 一对一
- 一对多
- 多对多
- 操作
- 一对一
public class Account{
private int aid;
/*表达一对一*/
private User user;}
- 一对一
<resultMap id="AccountResultMap" type="全限定名">
<id column="" property=""/>
<result column="" property=""/>
<!--表达一对一-->
<association property="表达一对一的字段名" javaType="表达一对一的字段名对应的JavaBean的全限定名">
<id column="" property=""/>
<result column="" property=""/>
</association>
</resultMap>
<select id="findAll" resultMap="AccountResultMap"></select>
- 一对多
public class User{
private int uid;
/*表达一对多*/
private List<Account> accounts;s}
<resultMap id="UserResultMap" type="全限定名">
<id column="" property=""/>
<result column="" property=""/>
<!--表达一对多-->
<collection property="表达一对一的字段名" ofType="表达一对一的字段名对应的JavaBean的全限定名">
<id column="" property=""/>
<result column="" property=""/>
</collection>
</resultMap>
<select id="findAll" resultMap="UserResultMap"></select>
七 . 延迟加载
1.1 什么是延迟加载?
需要的时候才去查询
1.2 xml方式延迟加载
- 一对一
public class Account{
/*一对一*/
private User user;}
<resultMap id="AccountResultMap" type="全限定名">
<id column="" property=""/>
<result column="" property=""/>
<!--表达一对一-->
<association property="表达一对一的字段名" javaType="表达一对一的字段名对应的JavaBean的全限定名" select="第二个sql的位置" fetchType="lazy" column="哪个列作为参数传给第二个sql" >
<id column="" property=""/>
<result column="" property=""/>
</association>
</resultMap>
<select id="findAll" resultMap="AccountResultMap"></select>
- 一对多
public class User{
private int uid;
/*表达一对多*/
private List<Account> accounts;}
<resultMap id="UserResultMap" type="全限定名">
<id column="" property=""/>
<result column="" property=""/>
<!--表达一对多-->
<collection property="表达一对一的字段名" ofType="表达一对一的字段名对应的JavaBean的全限定名" select="第二个sql的位置" column="参数列" fetchType="lazy" >
<id column="" property=""/>
<result column="" property=""/>
</collection>
</resultMap>
<select id="findAll" resultMap="UserResultMap"></select>
八. 缓存
1.1 什么是缓存
缓存就是一块儿内存,提升产品的用户体验.
1.2 mybatis的缓存类型
- 一级缓存 SqlSession,close() commit(),非用不可
- 二级缓存 SQLSessionFactory
- SqlMapConfig.xml
- UserMapper.xml
- 查询方法
九. 注解-CRUD
- 新增 @Insert @SelectKey
- 更新 @Update
- 删除 @Delete
- 查询 @Select
十. 注解-多表关联&&延迟加载
1.1 一对一(账户 VS 用户)
- 1 Account 表达一对一
- 2 mapper定义方法
- 2.1 根据UID查询用户
@Select("xxx")
public User findByUid(Interger uid);
- 2.2 查询全部账户
@Results({
@Result(column="aid" property="aid",id=true),
@Result(column="uid" property="uid"),
@Result(column="money" property="money"),
<!--关联即懒加载-->
@Result(column="uid",property="User",one=@One(select="第二个SQL的位置",fetchType="lazy")) })
@Select("SELECT * FROM t_account")
public List<Account> findAll();
1.2 一对多
4.2 一对多
- User 表达一对多
- mapper定义方法
- 根据UID查询账户信息
@Select("SELECT * FROM t_account WHERE uid = #{uid}")
public List<Account> findByUid(int uid);
- 查询全部的用户信息
@Results({
@Result(column="uid",property="uid",id=true),
@Result(column="address",property="address")
,
<!--表达一对多-->
@Result(column="uid",property="accounts",many=@Many(select="第二个sql的位置",fetchType="lazy")) })
@Select("SELECT * FROM t_user")
public List<User> findAll();