mybatis学习笔记四(动态sql)

  直接贴图,注解在代码上,其他的配置文件在学习一中就不贴了

1 数据库

  

2 实体类

  

package com.home.entity;

/**
 * 此类是: 用户实体类
 * @author hpc
 * @2017年1月15日下午2:16:27
 */
public class User {
    private Integer user_id;// 用户id
    private String user_name;// 用户名称
    private String user_pwd;// 用户密码
    
    public User(Integer user_id, String user_name, String user_pwd) {
        super();
        this.user_id = user_id;
        this.user_name = user_name;
        this.user_pwd = user_pwd;
    }
    public User(){}
    public Integer getUser_id() {
        return user_id;
    }
    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }
    public String getUser_name() {
        return user_name;
    }
    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }
    public String getUser_pwd() {
        return user_pwd;
    }
    public void setUser_pwd(String user_pwd) {
        this.user_pwd = user_pwd;
    }
    @Override
    public String toString() {
        return "User [user_id=" + user_id + ", user_name=" + user_name + ", user_pwd=" + user_pwd + "]";
    }
    
}

3.动态sql配置

 

<?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="com.home.mapper">
    <!-- mybatis中的动态标签和struts,JSTL标签十分相似,如果学习过的话,很容易就理解了 -->
    <select id="loadUser" resultType="user" parameterType="user">
        <!-- 如果user_id 等于4 就执行这条sql语句,
            test中的是实体类的属性,是通过反射获取出来的,
            所以我们这里传进来的参数是一个实体类对象 -->
        <if test="user_id == 4">
            select *
            from users u
            where u.user_id=#{user_id}
        </if>
        <!-- 如果user_id不等于空和不等于4 就进入这一个,
            逻辑运算符 
                and,or 
                ==,!= 
                >,>= 
                <,<= ...等
                -->
        <if test="user_id != null and user_id !=4">
            <!-- choose相当于java中的switch -->
            <choose>
                <!-- when 相当于case -->
                <!-- 只有当user_id不等于空的时候才查找对应的user信息 -->
                <when test="user_id > 4">
                    select *
                    from users u
                    where u.user_id=#{user_id}

                </when>
                <!-- 相当于default -->
                <!-- 当user_id等于空就执行下面这条sql,查询名字为hpc的用户 -->
                <otherwise>
                    select *
                    from users
                    where user_name='hpc'
                </otherwise>
            </choose>
        </if>
    </select>
</mapper>

4.测试类

package com.home.mybatis;

import java.io.IOException;

import org.apache.ibatis.session.SqlSession;

import com.home.entity.User;

public class TestApp {
    public static void main(String[] args) throws IOException {
        // 我将获取session的代码封装成了一个工具类,直接用工具类来获取session
        SqlSession session = SessionUtils.getSession("mybatis.xml");
        String loadUser = "com.home.mapper.loadUser";
        // 看会不会动态的去获取,按理论应该是执行if标签的sql,用户为id为4的
        User user = session.selectOne(loadUser, new User(4, null, null));
        System.out.println("看会不会动态的去获取,按理论应该是执行if标签的sql,用户为id为4的");
        System.out.println(user);
        // 看会不会动态的去获取,按理论应该是执行otherwise标签的sql,用户为hpc的
        user = session.selectOne(loadUser, new User(2, null, null));
        System.out.println("看会不会动态的去获取,按理论应该是执行otherwise标签的sql,用户为hpc的");
        System.out.println(user);
        // 看会不会动态的去获取,按理论应该是执行when标签的sql,用户为5的
        user = session.selectOne(loadUser, new User(5, null, null));
        System.out.println("看会不会动态的去获取,按理论应该是执行when标签的sql,用户为5的");
        System.out.println(user);
        // 将数据属性到数据中去
        session.commit();
        // 关闭session
        session.close();
    }
}

5 .结果

看会不会动态的去获取,按理论应该是执行if标签的sql,用户为id为4的
User [user_id=4, user_name=zll, user_pwd=123]
看会不会动态的去获取,按理论应该是执行otherwise标签的sql,用户为hpc的
User [user_id=3, user_name=hpc, user_pwd=123]
看会不会动态的去获取,按理论应该是执行when标签的sql,用户为5的
null

 

posted @ 2017-01-15 16:57  墨.荷  阅读(935)  评论(0)    收藏  举报