首页 > 代码库 > 浅谈Mybatis(三)

浅谈Mybatis(三)

一、动态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语句:

select * form t_user where id in(1,2,3)

    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(三)