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(); } }