发表于: 2017-12-20 21:46:48

2 584


一.今日完成

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>


二.明日计划

写文学部后台文章列表页和详情页接口


三.遇到问题

暂无


四.收获

以上



返回列表 返回列表
评论

    分享到