mybatis (高级映射 缓存 延迟加载)

1     一对一查询映射的pojo

创建pojo包括 订单信息和用户信息,resultType才可以完成映射。

一个订单对应一个用户   因此在订单实体类中 我们应该加入一个用户属性  实体类如下:

public class Order {
    private Integer orid;
    private Integer userid;
    private Double ordermoney;
    private User user;
}

接下来  我们该在mapper.xml中利用(resultMap 和association   标签配置User)

 <resultMap type="com.login.entity.Order" id="userAndOrder">
		<result property="orid" column="order_id" />
		<result property="userid" column="user_id"/>
		<result property="ordermoney"  column="order_money"/>
		<association property="user" javaType="com.login.entity.User">
			<result property="username" column="user_name"/>
			<result property="userpwd" column="user_pwd"/>
			<result property="userphone" column="user_phone"/>

		</association>

</resultMap>

<select id="findOrderAndUserById" resultMap="userAndOrder">

	SELECT * FROM qxglxt.order orde JOIN qxglxt.user u ON orde.user_id=u.user_id where u.user_id=2

</select>  

测试:

public static void main(String[] args) {
		try {
			Reader reader=Resources.getResourceAsReader("SqlMapConfig.xml");
			SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
			SqlSession sqlSession=sqlSessionFactory.openSession();
			//订单
			OrderMapper  orderMapper=sqlSession.getMapper(OrderMapper.class);
			Order ord=orderMapper.findOrderById(1);

  

2     一对多查询映射的pojo

创建pojo包括 订单信息和用户信息,resultType才可以完成映射。

一个用户应该有多个订单  因此在用户实体类中我们应该加入List<Order> list 属性  实体类如下:

public class User {
	private String username;
	private String userpwd;
	private String userphone;
	private List<Order> list;
}

  接下来  我们该在mapper.xml中利用(resultMap 和connection   标签配置list)

    <resultMap type="com.login.entity.User" id="uid">

        <result property="username" column="user_name"/>
        <result property="userpwd" column="user_pwd"/>
        <result property="userphone" column="user_phone"/>

        <collection property="list" ofType="com.login.entity.Order">
            <result property="orid" column="order_id" />
            <result property="userid" column="user_id"/>
            <result property="ordermoney"  column="order_money"/>
        </collection>
        <!-- 名字不一样必须配置 名字一样 可以不配的  -->
    </resultMap>

    <select id="findUserById" resultMap="uid">
        select * from user where user_id=#{id}
    </select>
    

一对一的xml配置详细介绍:

 private User user;

一对多的xml配置详细介绍:

private List<Order> list;

3  延迟加载

  ·在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。

mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。

例子 :  当查询一个订单时   如果没有点击订单详情的东西  就只需要将订单表中的信息显示出来   而订单详情的东西则等到调用的时候再显示

首先应该配置核心xml  SqlMapConfig.xml  开启延迟加载

<!-- 全局配置参数 -->
	<settings>
		<!-- 延迟加载总开关 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 设置按需加载 如果存在多个懒加载 就是说 订单中有用户 用户中有地址 那么如果设置为true  就会在加载用户的时候吧用户的地址也给加载了  如果为false 就是使用到才加载 -->
		<setting name="aggressiveLazyLoading" value="false" />
	</settings>

  

需求:

查询订单及用户的信息,一对一查询。刚开始只查询订单信息,当需要用户时调用 Orders类中的getUser()方法执行延迟加载 ,向数据库发出sql。

mapper.xml

resultMap

findUserByid   方法:     user_id (关联字段)

  <select id="findOrderAndUserById" resultMap="userAndOrder">

      SELECT * FROM qxglxt.order orde JOIN qxglxt.user u ON orde.user_id=u.user_id where u.user_id=2

   </select>

mapper.java

测试代码

4  缓存

 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存二级缓存的支持

  1. mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。

   2.Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。

  对于两级缓存来说   使用close方法后则往缓存区存入数据    使用commit 后 就会清空缓存区的数据,在执行增加,删除,修改操作后必须要使用commit提交事务  。

  3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。

原文地址:https://www.cnblogs.com/MyJavaStudy/p/9272836.html

时间: 2024-11-02 17:52:08

mybatis (高级映射 缓存 延迟加载)的相关文章

Mybatis学习笔记(三)—高级映射,延迟加载

本文主要介绍了如何使用resultMap完成高级映射:分析数据库中表之间的关系(一对一.一对多.多对多) 如何在mapper.xml文件中配置resultMap实现一对一.一对多.多对多:mybatis如何实现延迟加载 1       数据模型 数据库中有已经导入的四个表:items:(商品信息表):orderdetail:(订单明细表):orders:(订单表):user:(用户表) 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT

MyBatis高级映射查询(3)

一.数据库数据和项目搭建过程 1.主要要四张表,分别为user用户信息表.items商品表.orderdetail订单明细表.orders订单表.表的结构和数据如下: 表结构 CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci CREATE TABLE `items` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(32) NOT NUL

六 mybatis高级映射(一对一,一对多,多对多)

1  订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习. 1.1     数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空字段.外键字段 3.数据库级别表与表之间的关系 外键关系 4.表与表之间的业务关系 在分析表与表之间的业务关系时一定要建立 在某个业务意义基础上去分析. 1.2     数据模型分析 用户表user: 记录了购买商品的用户信息 订单表:order

(转)Mybatis高级映射、动态SQL及获得自增主键

原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者的博客信息.那么最容易想到的做法就是遍历authorList,获取相应的信息查询数据库. for(int i=0;I &l

Mybatis高级映射、动态SQL及获得自增主键

一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者的博客信息.那么最容易想到的做法就是遍历authorList,获取相应的信息查询数据库. for(int i=0;I < authorList.size();i++) { …… //查询数据库代码 //select * from blog where author=#{author,jdbcType

Mybatis高级映射

<select id="selectBlog_by_id" parameterType="int" resultMap="Blog_result"> select b.id, b.title, b.author_id, a.id, a.username, a.password, a.email, a.bio from Blog b left join Author a on b.author_id = a.id where b.id

mybatis 高级映射 简单例子

1.建表 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `gender` varchar(1) NOT NULL, `name` varchar(255) NOT NULL, `id` int(11) NOT NULL AUTO_INCREMENT, `birthday` date DEFAULT NULL, `classesid` varchar(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=Inno

MyBatis入门第2天--高级映射与查询缓存

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.28 lutianfei none mybatis框架执行过程: 1.配置mybatis的配置文件,SqlMapConfig.xml(名称不固定) 2.通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂 SqlSessionFactory在实际使用时按单例方式. 3.通过SqlSessionFactory创建SqlSession SqlSession是一个面向用户接口(提供操

【MyBatis框架】高级映射-延迟加载

延迟加载1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.需求:如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 延迟加载:先从单表查询.需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 2.使用association实现