小技巧
<!--设置经典数据库命名(CURRENT_TIME)为驼峰命名(currentTime)-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
动态SQL
1.定义:增加了逻辑判断进行拼接的SQL语句
UserMapperTest.class
public class UserMapperTest {
SqlSession sqlSession;
UserMapper userMapper;
StudentMapper studentMapper;
TeacherMapper teacherMapper;
public UserMapperTest() throws IOException {
this.sqlSession = MybatisUtil.getSQLSession();
this.userMapper = sqlSession.getMapper(UserMapper.class);
this.studentMapper = sqlSession.getMapper(StudentMapper.class);
this.teacherMapper = sqlSession.getMapper(TeacherMapper.class);
}
//动态SLQ之if
@Test
public void getUserByid(){
UserPojo userPojo = new UserPojo(9000,"2000","500");
List<UserPojo> userByid = userMapper.getUserByid(userPojo);
for (UserPojo user:userByid){
System.out.println(user);
}
}
@Test
public void updateUserByid2(){
UserPojo userPojo = new UserPojo(500,"9000000","500");
int i = userMapper.updateUserByid2(userPojo);
System.out.println(i);
}
@Test
public void getListUser2(){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1000);
list.add(500);
list.add(5);
list.add(4);
list.add(3);
list.add(2);
List<UserPojo> listUser = userMapper.getListUser(list);
for (UserPojo user:listUser) {
System.out.println(user);
}
}
}
UserMapper.class
public interface UserMapper {
//查询所有用户
@Select("select id,name,password pwd from user")
List<UserPojo> getListUser();
//添加用户
@Insert("insert into user values(#{id},#{name},#{pwd})")
int addUser(UserPojo userPojo);
//更新用户
@Update("update user set name=#{name},password=#{pwd} where id=#{id}")
int updateUser(UserPojo userPojo);
//查询id为500 and 如果password有值,也作为一个条件
List<UserPojo> getUserByid(UserPojo userPojo);
int updateUserByid2(UserPojo userPojo);
//forEach
List<UserPojo> getListUser(ArrayList<Integer> list);
}
UserMapper.xml
<?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">
<!--namespace相当于(UserMapperImpl)实现dao层接口-->
<mapper namespace="com.test.mapper.UserMapper">
<!--动态SQL之if-->
<!--<select id="getUserByid" resultType="UserAliasesType">
select id,name,password pwd from user
where id=#{id}
<if test="pwd!=null">
and password=#{pwd}
</if>
</select>-->
<!--含有多个if的情况
1.null不等于""
2.test中的条件可以自定义(可以添加逻辑and or)
3.if满足之后下一个if继续判断,并不会满足前面的后面的就停止
-->
<!--<select id="getUserByid" resultType="UserAliasesType">
select id,name,password pwd from user
where id=#{id}
<if test="pwd!=''">
and password=#{pwd}
</if>
<if test="name!=null">
and name=#{name}
</if>
</select>-->
<!--动态SQL之choose,when,otherwise
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
1.满足when中的一个条件就返回
2.所有都不满足就返回otherwise中的值
如同(if elseif else)
-->
<!--<select id="getUserByid" resultType="UserAliasesType">
select id,name,password pwd from user
where 1=1
<choose>
<when test="id==1000">
and id=#{id}
</when>
<when test="id==500">
and id=#{id}
</when>
<otherwise>
and id=1
</otherwise>
</choose>
</select>-->
<!--动态SQL之While,trim,set
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。
1.where不用手写了变成了自动拼接的标签
2.and可以直接全部加上mybatis会自动去掉,但是不能不写
-->
<!--<select id="getUserByid" resultType="UserAliasesType">
select id,name,password pwd from user
<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
</where>
</select>-->
<!--trim标签
prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。
prefix:前缀
prefixOverrides:前缀重写
suffix:后缀
suffixOverrides:后缀重写
-->
<!--<select id="getUserByid" resultType="UserAliasesType">
select id,name,password pwd from user
<trim prefix="where" prefixOverrides="and">
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
</trim>
</select>-->
<!--set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。
1.同样这里的,不能不写,可以多写-->
<!--<update id="updateUserByid2">
update user
<set>
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
name=#{name},
</if>
</set>
where id=#{id}
</update>-->
<!--trim 自定义set-->
<!--<update id="updateUserByid2">
update user
<trim prefix="set" suffixOverrides=",">
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
name=#{name},
</if>
</trim>
where id=#{id}
</update>-->
<!--foreach
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)-->
<select id="getListUser" resultType="UserAliasesType">
select * from USER
where id in
<foreach collection="ArrayList" item="id" index="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>