一. mybatis多表连接操作
对上一篇mybatis的补充
多对多查询
实体类:
Student.java.
Orders.java
OrderDesc.java
Goods.java
一个用户对应多个订单:
<mapper namespace="com.zx.mapper.StudentMapper">
<resultMap id="studentOrdersMap" type="com.zx.model.Student" autoMapping="true">
<id property="stu_id" column="stu_id"/>
<collection property="ordersList"
column="stu_id"
ofType="com.zx.model.Orders"
select="com.zx.mapper.OrderMapper.QueryStudentGoodByOrderStuId"
fetchType="lazy"
autoMapping="true">
</collection>
</resultMap>
<select id="queryStuGoodsByStuId" resultMap="studentOrdersMap">
select * from student where stu_id=#{stu_id}
</select>
</mapper>
一个订单对应多个订单明细:
<mapper namespace="com.zx.mapper.OrderMapper">
<resultMap id="ordersOrderDescMap" type="com.zx.model.Orders" autoMapping="true">
<id property="order_id" column="order_id"/>
<collection property="ordersDescList"
column="order_id"
select="com.zx.mapper.OrderDescMapper.queryStudentGoodsByOrderDescOrderId"
ofType="com.zx.model.OrderDesc"
fetchType="lazy"
autoMapping="true">
</collection>
</resultMap>
<select id="QueryStudentGoodByOrderStuId" resultMap="ordersOrderDescMap">
select * from orders where stu_id=#{stu_id}
</select>
</mapper>
多个订单明细对应一个商品:
<mapper namespace="com.zx.mapper.OrderDescMapper">
<resultMap id="OrderDescGoods" type="com.zx.model.OrderDesc" autoMapping="true">
<id property="g_id" column="g_id"/>
<association property="goods" column="g_id"
select="com.zx.mapper.GoodsMapper.queryStudentGoodsByGoodId"
fetchType="lazy"></association>
</resultMap>
<select id="queryStudentGoodsByOrderDescOrderId" resultMap="OrderDescGoods">
select * from orderDesc where order_id=#{order_id}
</select>
</mapper>
商品查询:
<mapper namespace="com.zx.mapper.GoodsMapper">
<select id="queryStudentGoodsByGoodId" resultType="com.zx.model.Goods">
select * from goods where g_id=#{g_id}
</select>
</mapper>
注意:在一般情况下,在一对多关联的时候,一方使用延迟加载的策略获取关联对象(多方);在多对一的情况下,
多方一般使用立即加载所对应的一方对象(关联对象);如果在mybatis中使用了表连接的方式来查询,则无法使
用延迟加载机制。
二. 基于注解的方式
//注解的方式编写简单的SQL语句
@Insert("insert into tbl_user values(default," +
"#{stu_name},#{stu_sex},#{stu_age},#{stu_major},#{stu_address}")
void addStudent(Student student);
@Select("select * from student where stu_id=#{stu_id}")
Student findStudent(int stu_id);
@Delete("delete from student where stu_id=#{stu_id}")
void deletStudent(int stu_id);
@Update("update student set stu_name=#{stu_name} stu_age=#{stu_age} where stu_id=#{stu_id}")
void updateStudent(Student student);
MyBatis 常用注解
1.@Insert:等同于<insert>定义 insert SQL 语句
2.@Update:等同于<updatet>定义 update SQL 语句
3.@Delete: 等同于<delete>定义 delete SQL 语句
4.@Select: 等同于<select>定义 select SQL 语句
5. @Results:等于与<resultMap>定义结果映射
6.@Result:等同于<id>和<result>,用于映射属性 @ResultMap:用于引用 Results 定义的结果映射
7.@one:等同于<association>,用于多对一关联中映射单个对象
6. @Many: 等同于<collection>,用于一对多关联中映射多方
对于简单的sql语句来说推荐使用注解的方式,但对于复杂的sql语句,还是建议使用xml文件的方式
二.mybatis 的缓存机制
Mybatis提供缓存机制时为了提高查询效率,降低数据库负担,通过缓存机制降低与数据库的交互次数
Mybatis的两种缓存:
- 一级缓存(sqlsession级缓存):在同一个sqlsession中起作用,sqlsession一旦关闭,一级缓存消失
一级缓存属于 mybatis 的默认缓存,默认开启,直接使用 当我们执行查询语句时,mybatis 都会将查询的数据存在一级缓存中,直到 session 关闭或事务提交或手动清空缓存 当执行查询时,mybatis 先在一级缓存中查找待查询的数据,如果一级缓存中存在则直 接使用不再访问数据库,如果一级缓存中不存在则访问数据库查询,将查询的结果向 一级缓存中存储一份,等待后续使用;当执行 commit 事务提交时,会自动清空一级缓存中的数据。 - 二级缓存(mapper级缓存):在同一个mapper中多个sqlsession可以共享缓存
二级缓存脱离 sqlSession 存在的,而且是同一个 mapper 共享的,所以默认情 况对象并不进入二级缓存,需要手动设置要向二级缓存中存放的对象(一般情况下使 用比较频繁的对象放入二级缓存)
在 Mapper 中通过标签让当前对象存入到二级缓存中
需要存入到二级缓存的对象,必须实现序列化接口 Mybatis 中默认开启二级缓存,在需要的 mapper(映射器)中配置要缓存的对象 即可使用当查询一个对象时,会先在二级缓存中查找(该对象允许存入到二级缓存中), 如果找到则直接返回,如果找不到则在到一级缓存中查找,如果找到则返回,如果找 不到会向数据库发送查询请求,并查询相应的数据,将该数据存入到一级缓存和二级 缓存(该对象允许存入到二级缓存中),以备后期使用