【SSM_10】Mybatis-注解、扩展知识

原创
02/17 19:56
阅读数 109

一、注解开发

//插入
@Insert("insert into orders value(null,#{ordertime},#{total},#{uid})")
void save(Orders orders);

//删除
@Delete("delete from orders where id = #{vaalue}")
void del(int id);

//修改
@Update("update orders set ordertime = #{ordertime},total = #{total},uid = #{uid} where id = #{id}")
void edit(Orders orders);

//查询所有
@Select("select * from orders")
List<Orders> findAll();

//查询指定字段
@Select(" select * from orders where id = #{value}")
Orders findById(int id);

//一对一 查询
@Select("select * from orders")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "ordertime",column = "ordertime"),
@Result(property = "total",column = "total"),
@Result(
    property = "user",
    column = "uid",
    javaType = User.class,
    one = @One(select = "com.softwareMan.dao.UserDao.findById")
    )
})
List<Orders> findOne_One();

//一对多/多对多,区别在与many = @Many(select = "执行方法")
@Select("select * from user")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "birthday",column = "birthday"),
@Result(
    property = "ordersList",        //要封装的属性
    column = "id",                  //根据已查出的那个字段作为条件去查询 orders 表
    javaType = List.class,          //属性类型
    many = @Many(select = "com.softwareMan.dao.OrdersDao.findByUserId")     //执行那个接口的那个方法
    )
})
List<User> findone_two();

二、Mybatis补充

1. 主键返回

<!--
    last_insert_id()    :    查询刚插入数据自增id
    order               :    执行的时机 after 之前执行; before 之后执行
    keyProperty         :    与实体类属性保持一致
    keyColumn           :    与数据库字段保持一致
-->
<insert id="save" parameterType="orders" >
    <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER" >
        select last_insert_id();
    </selectKey>
    
    insert into orders value(null,#{ordertime},#{total},#{uid})
</insert>

2. 模糊查询

① ${}  //底层进行字符串拼接  --- sql注入 不适用
    --->  平
    select * from orders where name = '%${value}%'

② #{}  //底层预编译sql
    ---> %平%
    select * from orders where name = '#{value}'

扩展

一、延迟加载

1. 概述

- 等到需要用到数据的时候才去查询,不用的时候不查询。
    * 先从一张表中查询出外键字段,然后拿着这个字段去查另一张表

2. 延迟加载的 mapper 配置

<resultMap id="userAccountMap" type="user">
    <id property="id" column="id"></id>
    <result property="username" column="username"></result>
    <result property="address" column="address"></result>
    <result property="sex" column="sex"></result>
    <result property="birthday" column="birthday"></result>

    <!-- 
        配置 user 对象中 accounts 集合的映射 
        使用 select 调用另一个方法按照已查出字段 id 查询信息
    -->
    <collection property="accounts" 
                column="id" 
                ofType="account" 
                select="com.softwareMan.dao.AccountDao.findAccountByUid">
    </collection>
</resultMap>

<select id="findAll" resultMap="userAccountMap">
    select * from user
</select>

3. 开启延迟加载

<settings>
    <!--开启Mybatis支持延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"></setting>
</settings>

二、Mybatis 缓存

1. 概述

- 一级缓存是 sqlSession 级别的,存在于 sqlSession 中,sqlsession 存在,以及缓存就存在
- 二级缓存是 mapper 级别的,多个 sqlSession 操作同一个 mapper 映射的 sql,共用同一份 二级缓存

2. 一级缓存

- 发起一次用户请求时会先去一级缓存找,找不到再去数据库查询,并将数据存入一级缓存
- 一级缓存执行 增、删、改、commit()、close() 等方法时会清空缓存

3. 二级缓存使用

- 在 mubatis 中开启二级缓存
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

- 在 mapper 中开启 二级缓存 支持
    <cache/>

- statement 上添加 useCache 属性
    <select id="findById" parameterType="INT" resultType="user" useCache="true">
        select * from user where id = #{uid}
    </select>
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部