Mybatis小结

关于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 快速入门

  1. 准备工作
  • 创建库表
  • 创建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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值