mybatis动态SQL语句和日志
动态SQL语句
现使用的mybatis的接口+xml方式,SQL语句在xml文件中,因为mybatis有很好的标签提供我们使用
- 标签sql可以为为我们省略重复代码,但需要下面的select语句引入include
- 标签where,可以自动在SQL语句添加where,
- 在where标签下有if标签,可以判断传过来的参数是否包含特点的参数,第二个判断一点要添加and,但当第一个判断为否时,标签会自动省略and
- foreach标签为循环标签,但必须传过来的是一个集合,
<mapper namespace="com.qfedu.pojo.IUserDao">
<sql id="all">
select * from user
</sql>
<select id="selectAll" resultType="user">
<include refid="all"/>
</select>
<select id="selectUserByUid" resultType="user">
<include refid="all"/>
where uid = #{uid}
</select>
<select id="selectIf" resultType="user">
<include refid="all"/>
<where>
<if test="username != null">
username = #{username}
</if>
<if test="password != null">
and password = #{password}
</if>
</where>
</select>
<select id="selectIn" resultType="user">
<include refid="all" />
<where>
uid in
<foreach collection="ids" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</where>
</select>
</mapper>
当映射文件使用了标签foreach时,是使用map集合添加集合,与标签id对应
public class TestUserSQL {
private SqlSession session = null;
@Before
public void setUp() {
session = SessionUtils.getSession();
}
@After
public void tearDown() {
SessionUtils.closeSession(session);
}
@Test
public void testGetAllUsers() {
List<User> list = session.selectList("com.qfedu.dao.IUserDao.selectAll");
for (User u : list) {
System.out.println(u);
}
}
@Test
public void testGetAllUsersByUid() {
User u = session.selectOne("com.qfedu.dao.IUserDao.selectUserByUid", 1);
System.out.println(u);
}
@Test
public void testGetUserByIf(){
Map<String, Object> map = new HashMap<>();
// map.put("username", "sunwukong");
map.put("password", "333333");
List<User> list = session.selectList("com.qfedu.dao.IUserDao.selectIf", map);
for (User u : list) {
System.out.println(u);
}
}
@Test
public void testGetUsersByIn(){
List<Integer> ids = new ArrayList<>();
Collections.addAll(ids, 1, 2, 3, 4, 100);
System.out.println(ids);
Map<String, Object> map = new HashMap<>();
map.put("ids", ids);
List<User> list = session.selectList("com.qfedu.pojo.IUserDao.selectIn", map);
for (User u : list) {
System.out.println(u);
}
}
}
日志
日志有四个级别:error(错误)、warn(警告)、info(信息)、debug(调试)。从高到低排序,高不会显示低的信息,但低会显示高的信息
给当前mybatis项目添加日志项目功能,使用STDOUT_LOGING(标准输出)值的好处是不用添加第三方jar包就可以有日志的输出
STDOUT_LOGING
mybatis.xml
<settings>
<setting name="logImpl" value="STDOUT_LOGING"/>
</settings>
LOG4J
添加jar包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
添加日志配置,其中第二行代码是可控范围
log4j.properties
# 全局日志配置
# 日志有四个级别:error,warn,info,debug
log4j.rootLogger=error, stdout, F
# MyBatis 日志配置,控制范围
log4j.logger.com.qfedu=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%6p [%t] - %m%n
当添加下面的配置时,会生成文件,文件没有则以相对路径创建
log4j.appender.F = org.apache.log4j.DailyRollingFileAppender
log4j.appender.F.File =myproj.log
log4j.appender.F.Append = true
log4j.appender.F.Threshold = DEBUG
log4j.appender.F.layout=org.apache.log4j.PatternLayout
log4j.appender.F.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss}-[%p %F\:%L] %m%n
在mybatis添加
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
配置完成后,