mybatis学习笔记四(动态sql)

时间:2023-03-08 17:24:50
mybatis学习笔记四(动态sql)

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

1 数据库

  mybatis学习笔记四(动态sql)

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