一、动态SQL

  1、sql片段

    解决sql语句的冗余代码问题。   

<sql id="SELECT_T_USER">
    select id,name,password,birthday
</sql>

<select id="queryUserById" resultType="User">
    <include refid="SELECT_T_USER"/>
    from t_user
    where id=#{id}
</select>

  2、where子句的处理

    DAO接口代码:

public interface UserDao{

    public User queryUser(@Param("id") Integer id,@Param("name")String name,@Param("password")String password);

}

    mapper文件:

<select id="queryUser" resultType="user">
    <include refid="SELECT_T_USER"/>
    from t_user
    <trim prefix="where" prefixOverrides="and|or">
        <if test="id!=null">
            id=#{id}
        </if>
        <if test="name!=null">
            and name=#{name}
        </if>
        <if test="password!=null">
            and password=#{password}
        </if>
    </trim>
</select>

    解释:prifixOverrides="and|or"----->自动忽略最前面的and或者or。

       prefix="where"------>表示where子句。

       ps、id应该写成包装器类型。因为有可能值为null。

  3、set子句的处理

    Dao接口代码: 

public interface UserDao{

    public void modifyUser(@Param("id")Integer id,@Param("name")String name,@Param("password")String password);

}

    mapper文件:

<update id="modifyUser" parameterType="User">
    update t_user
    <trim prefix="set" suffixOverrides=",">
        <if test="name!=null">
            name=#{name},
        </if>
        <if test="password!=null">
            password=#{password}
        </if>
    </trim>
    where id=#{id}
</update>

    解释:

      predix="set"---->表示set子句。

      suffixOverrides=","------>表示自动忽略最后面的","。

  4、批量查询、删除

    sql语句:

,,)

    DAO接口:

public interface UserDao{

    public List<User> queryUserByIds(List<Integer> ids);

} 

    mapper文件:

<select id="queryUserByIds" resultType="User">
    select * from t_user where id in
    <foreach collection="list" open="(" item="item" separator="," close=")">
        #{item}
    </foreach>
</select>

    解释:

      item="item"------->是当前所遍历的元素。

    delete from t_user where id in (1,2,3)

二、缓存机制

  1、激活mybatis的全局缓存

    a、在mybatis-config.xml中添加语句:

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

    b、给对应的mapper文件加入<cache></cache>。

    c、实体要做可序列化的声明

public class User implements Serializable{
    priavte Interger id;
    private String name;
    private String password;
}

    implements Serializable,实现该接口便是声明该类可以被序列化。

  2、注意

    a、只有在sqlSession关闭的时候,mybatis才会把查询的数据放置在缓存中。

    b、脏数据问题:sqlSession在事务提交的时候,会自动清空缓存。

    c、查询操作:操作后,应该关闭sqlSession确保查询的数据可以被缓存。

        增删改操作:操作后,应该进行事务提交,以避免脏数据问题。

 

      

浅谈Mybatis(三)的更多相关文章

  1. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  2. 浅谈Mybatis(一)

    一.MyBatis引言 1.基本概念 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  3. 浅谈mybatis如何半自动化解耦

    在JAVA发展过程中,涌现出一系列的ORM框架,JPA,Hibernate,Mybatis和Spring jdbc,本系列,将来研究Mybatis. 通过研究mybatis源码,可将mybatis的大 ...

  4. 浅谈mybatis如何半自动化解耦和ORM实现

    在JAVA发展过程中,涌现出一系列的ORM框架,JPA,Hibernate,Mybatis和Spring jdbc,本系列,将来研究Mybatis. 通过研究mybatis源码,可将mybatis的大 ...

  5. 浅谈Mybatis持久化框架在Spring、SSM、SpringBoot整合的演进及简化过程

    前言 最近开始了SpringBoot相关知识的学习,作为为目前比较流行.用的比较广的Spring框架,是每一个Java学习者及从业者都会接触到一个知识点.作为Spring框架项目,肯定少不了与数据库持 ...

  6. 浅谈mybatis中的#和$的区别

    1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111&qu ...

  7. 浅谈Servlet(三)

    一.三种作用域 作用域:web开发中用于存储和获得数据. 1.request 一次请求有效,在forward跳转时可用request作用域传递数据. 2.session client不变,sessio ...

  8. 浅谈TCP三次握手和四次挥手

    学习三次握手和四次挥手前,先了解下几个基础的概念. Seq:数据段序号,我们都知道TCP是提供有序传输的,有序传输的基础就是数据段序号,接收方在收到发送方乱序包的情况下可以根据Seq进行重新排序,确保 ...

  9. 浅谈 Mybatis中的 ${ } 和 #{ }的区别

    好了,真正做开发也差不多一年了.一直都是看别人的博客,自己懒得写,而且也不会写博客,今天就开始慢慢的练习一下写博客吧.前段时间刚好在公司遇到这样的问题. 一.举例说明 select * from us ...

随机推荐

  1. iOS开发之GCD使用总结

    GCD是iOS的一种底层多线程机制,今天总结一下GCD的常用API和概念,希望对大家的学习起到帮助作用. GCD队列的概念 在多线程开发当中,程序员只要将想做的事情定义好,并追加到DispatchQu ...

  2. iOS_根据文字字数动态确定Label宽高

    iOS7中用以下方法 CGSize 替代过时的iOS6中的- (CGSize)sizeWithFont:(UIFont *)font 方法 // iOS7_API_根据文字 字数动态确定Label宽高 ...

  3. 获取枚举Name,Value,Description两种方法

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  4. Oracle 经常使用命令小结

    1.当前数据库中查看建表语句 select dbms_metadata.get_ddl('TABLE','表名') from dual; 2.当前数据库中查看视图创建Sql select text f ...

  5. 重写系统中的UINavigationController返回按钮的事件

    1.扩展UIviewController UIViewController+BackButtonHandler.h #import <UIKit/UIKit.h> @protocol Ba ...

  6. git 删除远程主分支及其它操作

    1. 删除远程分支 如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放稳定代码的地方),可以用这个非常无厘头的语法来删除它:git push [远程 ...

  7. IOS 获取手机各种信息

    /手机序列号      NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier];     NSLog(@&qu ...

  8. mysql-5.7.10-winx64 MySQL服务无法启动,服务没有报告任何错误的解决办法

      总结报错原因:在my.init文件下新增data目录(datadir = F:\mysqldata ) 最新解压版本的mysql 解压安装的时候报错D:\mysql\mysql-5.7.10-wi ...

  9. poj3122--二分加贪心

    大致题意: 就是公平地分披萨pie 我生日,买了n个pie,找来f个朋友,那么总人数共f+1人 每个pie都是高为1的圆柱体,输入这n个pie的每一个尺寸(半径),如果要公平地把pie分给每一个人(就 ...

  10. 用正则表达式替换内容 php

    以前做一个项目,就是有一个问答的页面,比如说在回答或者提问的内容中插入表情.写到内容里的是表情图片的名字(而且是不带后缀的,比如:f_002.png)表情包放在项目里,我需要在取除内容的时候将里面的表 ...