SSMMyBatis(九.查询语句专题)

Posted Beyong2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSMMyBatis(九.查询语句专题)相关的知识,希望对你有一定的参考价值。

文章目录

1.返回Car

CarMapper.xml

    <select id="selectById" resultType="Car">
        select
            id,
            car_num as carNum,
            brand,
            guide_price as guidePrice,
            produce_time as produceTime,
            car_type as carType
        from
            t_car
        where
            id = #id
    </select>

2.返回List< Car >

CarMapper.xml

    <select id="selectAll" resultType="Car">
        select
            id,
            car_num as carNum,
            brand,
            guide_price as guidePrice,
            produce_time as produceTime,
            car_type as carType
        from
            t_car
    </select>

3.返回map集合

CarMapper.xml

    <select id="selectByIdRetMap" resultType="map">
        select * from t_car where id = #id
    </select>

4.返回List< Map >

CarMapper.xml

    <select id="selectAllRetListMap" resultType="map">
        select * from t_car
    </select>

CarMapper.java

List<Map<String, Object>> selectAllRetListMap();

5. 返回Map<String, Map>

CarMapper.xml

    <select id="selectAllRetMap" resultType="map">
        select * from t_car
    </select>

CarMapper.java


  /**
   * 返回大Map集合,
   * 大Map集合的key为每一条记录的主键值,
   *           value为每一条记录
   * @return
   */
  @MapKey("id") //将结果的id 作为大Map集合的key
  Map<Long, Map<String, Object>> selectAllRetMap();

6.结果映射

查询结果的列名和java对象的属性名对应不上怎么办?
● 第一种方式:as 给列起别名
● 第二种方式:使用resultMap进行结果映射
● 第三种方式:是否开启驼峰命名自动映射(配置settings)

6.1 使用resultMap

CarMapper.xml

    <!--
        resultMap:
            id:这个结果映射的标识,作为select标签的resultMap属性的值。
            type:结果集要映射的类。可以使用别名。
    -->
    <resultMap id="carResultMap" type="Car">
        <!--对象的唯一标识,官方解释是:为了提高mybatis的性能。建议写上。-->
        <id property="id" column="id"/>
        <result property="carNum" column="car_num"/>
        <!--当属性名和数据库列名一致时,可以省略。但建议都写上。-->
        <!--javaType用来指定属性类型。jdbcType用来指定列类型。一般可以省略。-->
        <result property="brand" column="brand" javaType="string" jdbcType="VARCHAR"/>
        <result property="guidePrice" column="guide_price"/>
        <result property="produceTime" column="produce_time"/>
        <result property="carType" column="car_type"/>
    </resultMap>
    <select id="selectAllByResultMap" resultMap="carResultMap">
        select * from t_car
    </select>

CarMapper.java

    List<Car> selectAllByResultMap();

6.2 开启驼峰命名

在mybatis-config.xml文件中进行配置:

<!--放在properties标签后面-->
<settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

7.返回总记录条数

CarMapper.xml

<select id="selectTotal" resultType="long">
  select count(*) from t_car
</select>

SSMMybatis配置缓存

1.在没有配置的情况下,mybatis默认开启一级缓存。

1 Object object=mapper.getXxx(object);
2 Object object2=mapper.getXxx(object);

打个断点测试一下就知道了。

在同一个SqlSession中,第一次查询后,调用mapper相同方法,SqlSession会从一级缓存中取数据,而且得到的是相同的对象。不会发送SQL。

如果SqlSession进行了提交,那么一级缓存将会清除。

 1 public void test(){
 2         SqlSession session = MyBatisUtil.getSession();
 3         IUserDAO mapper = session.getMapper(IUserDAO.class);
 4         UserOneToMany user = new UserOneToMany();
 5         user.setUsercode("zhangsan");
 6         UserOneToMany userOneToMany = mapper.getUserOneToManyBills(user);
 7         System.out.println("======"+userOneToMany);
 8         session.commit();
 9         UserOneToMany userOneToMany2 = mapper.getUserOneToManyBills(user);
10         System.out.println("======"+userOneToMany2);
11         session.close();
12     }

打印结果不同,且发送了两次SQL,获得了两个不同的对象:

 

 

2.MyBatis开启二级缓存第一步:大配置中settings节点加入:<setting name="cacheEnabled" value="true"/>

第二步:命名空间加入节点:<cache/>

 

这里<cache/>节点可以设置得更详细些,比如:

<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>

其中eviction代表回收策略(LRU|FIFO|SOFT|WEAK);flushInterval代表刷新间隔时间,单位是毫秒;size是引用数目,就是缓存中可以存放多少个对象;readOnly只读,缓存只能读取不能修改。

简单说明下四个回收策略:

1.LRU(默认):最近最少使用,移除最长时间不用的对象。

2.FIFO:先进先出,按对象进入缓存的顺序移除它们。

3.SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象。

4.WEAK:弱引用,移除基于垃圾回收器状态和弱引用规则的对象。

第三步:相应实体类实现Serializable接口

测试方法不变,观察结果:

首先,程序只发送了一次SQL。其次,第二次取到的数据是从缓存中获得的,同样获取的是两个不同的对象。

 

 

以上是关于SSMMyBatis(九.查询语句专题)的主要内容,如果未能解决你的问题,请参考以下文章

SSMMybatis配置缓存

MySQL专题九:SQL注入问题

专题九.Mysql数据库编程基础知识

SQL语句复习专题四

PHP & MySQL数据库专题 第七课 数据查询语句

PHP & MySQL数据库专题 第七课 数据查询语句