发表于: 2017-12-20 21:46:48
2 585
一.今日完成
1.上午写了文学部前台文章详情页接口,学习了Java代码特殊注释
(1) TODO
表示需要实现,但目前还未实现的功能
(2) XXX
勉强可以工作,但是性能差等原因
(3) FIXME
代码是错误的,不能工作,需要修复
TODO: + 说明:
如果代码中有该标识,说明在标识处有功能代码待编写,待实现的功能在说明中会简略说明。
FIXME: + 说明:
如果代码中有该标识,说明标识处代码需要修正,甚至代码是错误的,不能工作,需要修复,如何修正会在说明中简略说明。
XXX: + 说明:
如果代码中有该标识,说明标识处代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进,要改进的地方会在说明中简略说明。
2.下午开始写后台接口,先去学习了mybatis动态查询
mybatis中的动态SQL主要包含如下几种元素:if、choose、when、otherwise、trim、where、set以及foreach几种.
(1)if是mybatis动态SQL中的判断元素,这个有点类似于Java中的if语句,不同的是这里的if一般常常和test配合使用。
<select id="getUser" resultMap="u" parameterType="String">
select * from user2
<if test="address!=null and address !=''">
WHERE address LIKE concat('%',#{address},'%')
</if>
</select>
当用户传入的address不为null或者空字符串的时候,就加上一个where条件,否则就什么条件都不加入。
在UserMapper这个接口中定义的相关方法:
public List<User> getUser(@Param("address") String address);
在调用这个方法的时候,如果传入了address参数,那么查询条件中就有address,否则就没有。
测试代码:
SqlSession sqlSession = null;
try {
sqlSession = DBUtils.openSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getUser("西安");
for (User user : list) {
System.out.println(user);
}
sqlSession.commit();
} catch (Exception e) {
System.err.println(e.getMessage());
sqlSession.rollback();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
(2)choose有点类似于Java中的switch,常常配合when和otherwise一起来使用。看一个简单的例子:
<select id="getUser2" resultMap="u">
SELECT * FROM user2 WHERE 1=1
<choose>
<when test="id!=null">
AND id=#{id}
</when>
<when test="address!=null">
AND address=#{address}
</when>
<when test="username!=null">
AND user_name LIKE concat(#{username},'%')
</when>
<otherwise>
AND 10>id
</otherwise>
</choose>
</select>
在查询条件中,如果用户传来了id,那么就查询该id的数据,如果用户传来了address,那么就添加address的查询条件,如果用户传来了username,就添加username的查询条件,最后如果用户任何一个查询条件都没有添加进来,那么默认查询条件就是查询id小于10的所有数据。
(3)where
在上面的案例在添加查询条件的时候,在查询条件之前都先添加了where 1=1,然后后面直接在这之后再追加and子句,那么每次这样来写显然有点麻烦,可以通过where元素简化,如下:
<select id="getUser3" resultMap="u">
SELECT * FROM user2
<where>
<choose>
<when test="id!=null">
AND id=#{id}
</when>
<when test="address!=null">
AND address=#{address}
</when>
<when test="username!=null">
AND user_name LIKE concat(#{username},'%')
</when>
<otherwise>
AND 10>id
</otherwise>
</choose>
</where>
</select>
这样,只有where元素中有条件成立,才会将where关键字组装到SQL中,这样就比前一种方式简单许多。
(4)trim
trim有点元素替换的意思,可以将and替换为where,如下:
<select id="getUser4" resultMap="u">
SELECT * FROM user2
<trim prefix="where" prefixOverrides="and">
AND id=1
</trim>
</select>
(5)set
set是在更新表的时候使用的元素,通过set元素,可以逐字段的修改一条数据,如下:
<update id="update">
UPDATE user2
<set>
<if test="username!=null">
user_name=#{username},
</if>
<if test="password!=null">
password=#{password}
</if>
</set>
WHERE id=#{id}
</update>
在set元素中,如果遇到了逗号,系统会自动将之去除。
(6)foreach
foreach元素用来遍历集合,比如想查询多个城市的人,的sql语句可能是这样SELECT * FROM user2 WHERE address IN('西安','北京'),在查询的时候可能只是传入了一个list集合,该集合中有西安和北京两个查询条件,那如何将这个集合组装成一个sql语句呢?很简单,如下:
<select id="getUserInCities" resultMap="u">
SELECT * FROM user2
WHERE address IN
<foreach collection="cities" index="city" open="(" separator="," close=")" item="city">
#{city}
</foreach>
</select>
(7)bind
使用bind元素可以预先定义一些变量,然后在查询语句中使用,如下:
<select id="getUserByName" resultMap="u">
<bind name="un" value="username+'%'"></bind>
SELECT* FROM user2 WHERE user_name LIKE #{un}
</select>
二.明日计划
写文学部后台文章列表页和详情页接口
三.遇到问题
暂无
四.收获
以上
评论