mybatis动态sql和缓存
搭建环境和前面的基本一样,主要是配置mapper 接口,mapperXml文件,mybaits核心配置文件,测试类有不同的地方
1.mapper接口
package mapper; import pojo.User; import java.util.HashMap; import java.util.List; import java.util.Map; public interface UserMapper { public List<User> getUserList(); public List<User> getUserList2(); public List<User> getUserLisIf(HashMap<String,Object> map); }
2.mapperXml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--绑定一个操作数据库的接口--> <mapper namespace="mapper.UserMapper"> <!-- 在UserMapper中开启缓存 --> <cache eviction="FIFO" flushInterval="60" size="500" readOnly="true"></cache> <!--查询 --> <!--本来这里的resultType要写全限定类名,但是在mybaits-config.xml文件中配置了别名user后,这里可以直接写user--> <select id="getUserList" resultType="user"> select * from user </select> <!--使用resultmap 解决实体类和数据库字段不一致的问题,这里我故意把实体类的email 改为userEmail --> <resultMap id="userMap" type="user"> <!-- column是数据库中的字段名, property是实体类的属性 --> <result column="email" property="userEmail"></result> </resultMap> <select id="getUserList2" resultMap="userMap"> select * from user </select> <!-- 使用动态sql if 标签--> <!-- <select id="getUserLisIf" parameterType="map" resultType="user">--> <!-- select * from user where 1=1--> <!-- <if test="userId!=null">--> <!-- and userId=#{userId}--> <!-- </if>--> <!-- <if test="userName!=null">--> <!-- and userName=#{userName}--> <!-- </if>--> <!-- </select>--> <!-- <!– 使用动态sql where标签会自动去掉没必要的and,比如 userId成立的情况,会自动去掉userName前面的and–>--> <select id="getUserLisIf" parameterType="map" resultType="user"> select * from user <where> <if test="userId!=null"> userId=#{userId} </if> <if test="userName!=null"> and userName=#{userName} </if> </where> </select> <!-- 还有一个是update 的set 标签,<set></set> --> </mapper>
3.mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置日志文件 -->
<settings>
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<setting name="logImpl" value="log4j"/>
<!-- 开启驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- <properties resource="db.properties"/>-->
<!--别名 -->
<typeAliases>
<!-- <!–设置User类的别名为user –>-->
<!-- <typeAlias type="pojo.User" alias="user"></typeAlias>-->
<!-- 设置pojo包下的所有实体类的别名为类名的首字母小写 -->
<package name="pojo"/>
</typeAliases>
<environments default="develoment">
<environment id="develoment">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://47.112.227.192:3306/spring?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--每一个mapper 都要在mybatis 的核心配置文件中注册 -->
<mappers >
<!-- 用resource映射的话就用全路径-->
<mapper resource="mapper/userMapper.xml"></mapper>
<!-- <mapper resource="mapper/studentMapper.xml"></mapper>-->
<!-- 用class 映射的话,要用接口的类的全限定类名 -->
<!-- <mapper class="mapper.StudentMapper"></mapper>-->
<!-- <mapper resource="mapper/teacherMapper.xml"></mapper>-->
</mappers>
</configuration>
4.测试类
package test; import commonUntil.MybatisUntil; import mapper.UserMapper; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import pojo.User; import java.util.HashMap; import java.util.List; public class Mytest { @Test public void getUserList(){ SqlSession sqlSession= MybatisUntil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userList = userMapper.getUserList(); System.out.println("userList:"+userList); sqlSession.close(); //当这里没有为UserMapper设置二级缓存的时候,两次查询都会去连接数据库查数据 //当在userMapper.xml里面设置了缓存后,第二次查询就不走数据库了,直接缓存中去获取 SqlSession sqlSession2= MybatisUntil.getSqlSession(); UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class); List<User> userList2 = userMapper2.getUserList(); System.out.println("userList2:"+userList2); sqlSession.close(); } @Test public void getUserLisIf(){ SqlSession sqlSession= MybatisUntil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<String, Object>(); //这里根据条件动态加入条件 // map.put("userId",20); map.put("userName","四皇凯多"); List<User> userList = userMapper.getUserLisIf(map); // 由于mybatis 有一级缓存的原因,在一个sqlSession会话内再次去拿同样的数据会去一级缓存拿 List<User> userList2 = userMapper.getUserLisIf(map); System.out.println("userList:"+userList); System.out.println("userList2:"+userList2); sqlSession.close(); } }

浙公网安备 33010602011771号