05—动态sql

1.创建表

CREATE TABLE tb_employee (
  ID INT(11) PRIMARY KEY AUTO_INCREMENT,
  loginname VARCHAR(18),
  PASSWORD VARCHAR(18),
  NAME VARCHAR(18) DEFAULT NULL,
  SEX CHAR(2) DEFAULT NULL,
  AGE INT(11) DEFAULT NULL,
  phone VARCHAR(21),
  sal DOUBLE,
  state VARCHAR(18)
 )
 
 INSERT INTO tb_employee(loginname,PASSWORD,NAME,sex,age,phone,sal,state)
 VALUES('jack','123456','杰克','男',30,'15012345678',5000,'1');
  INSERT INTO tb_employee(loginname,PASSWORD,NAME,sex,age,phone,sal,state)
 VALUES('rose','123456','露丝','女',28,'135612345678',4000,'1');

 2.创建实体
Employee.java

package org.fkit.domain;
import java.io.Serializable;
public class Employee implements Serializable {
    
    private Integer id;             // 主键id
    private String loginname;     // 登录名
    private String password;     // 密码
    private String name;         // 真实姓名
    private String sex;             // 性别
    private Integer age;         // 年龄
    private String phone;         // 电话
    private Double sal;             // 薪水
    private String state;          // 状态
    
    public Employee() {
        super();
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getLoginname() {
        return loginname;
    }
    public void setLoginname(String loginname) {
        this.loginname = loginname;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public Double getSal() {
        return sal;
    }
    public void setSal(Double sal) {
        this.sal = sal;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    @Override
    public String toString() {
        return "data [id=" + id + ", loginname=" + loginname
                + ", password=" + password + ", name=" + name + ", sex=" + sex
                + ", age=" + age + ", phone=" + phone + ", sal=" + sal
                + ", state=" + state + "]";
    }    
}


3.mapper创建

EmployeeMapper.java

package org.fkit.mapper;
import java.util.HashMap;
import java.util.List;
import org.fkit.domain.Employee;
public interface EmployeeMapper {
    List<Employee> selectEmployeeByIdLike(HashMap<String, Object> params);
    List<Employee> selectEmployeeByLoginLike(HashMap<String, Object> params);
    List<Employee> selectEmployeeChoose(HashMap<String, Object> params);
    List<Employee> findEmployeeLike(HashMap<String, Object> params);
    List<Employee> selectEmployeeLike(HashMap<String, Object> params);
    Employee selectEmployeeWithId(Integer id);
    void updateEmployeeIfNecessary(Employee employee);
    List<Employee> selectEmployeeIn(List<Integer> ids);
    List<Employee> selectEmployeeLikeName(Employee employee);
}

EmployeeMapper.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指用户自定义的命名空间。 -->
<mapper namespace="org.fkit.mapper.EmployeeMapper">

    <select id="selectEmployeeWithId" parameterType="int" resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee where id = #{id}
  </select>
    
  <!-- if -->
  <select id="selectEmployeeByIdLike" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee WHERE state = '1'
      <!-- 可选条件,如果传进来的参数有id属性,则加上id查询条件 -->
      <if test="id != null ">
          and id = #{id}
      </if>
  </select>
  
  <!-- if -->
  <select id="selectEmployeeByLoginLike" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee WHERE state = '1'
      <!-- 两个可选条件,例如登录功能的登录名和密码查询 -->
      <if test="loginname != null and password != null">
          and loginname = #{loginname} and password = #{password}
      </if>
  </select>
  
  <!-- choose(when、otherwise) -->
  <select id="selectEmployeeChoose" 
      parameterType="hashmap" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee WHERE state = '1'
      <!-- 如果传入了id,就根据id查询,没有传入id就根据loginname和password查询,否则查询sex等于男的数据 -->
      <choose>
          <when test="id != null">
              and id = #{id}
          </when>
          <when test="loginname != null and password != null">
              and loginname = #{loginname} and password = #{password}
          </when>
          <otherwise>
              and sex = '男'
          </otherwise>
      </choose>
  </select>
  
  <select id="findEmployeeLike"  
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee WHERE 
      <if test="state != null ">
          state = #{state}
      </if>
      <if test="id != null ">
          and id = #{id}
      </if>
      <if test="loginname != null and password != null">
          and loginname = #{loginname} and password = #{password}
      </if>
  </select>
  
  <!-- where -->
  <select id="selectEmployeeLike" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee  
      <where>
          <if test="state != null ">
              state = #{state}
          </if>
          <if test="id != null ">
              and id = #{id}
          </if>
          <if test="loginname != null and password != null">
              and loginname = #{loginname} and password = #{password}
          </if>
      </where>
  </select>
  
  <!-- set -->
  <update id="updateEmployeeIfNecessary" 
      parameterType="org.fkit.domain.Employee">
      update tb_employee
        <set>
          <if test="loginname != null">loginname=#{loginname},</if>
          <if test="password != null">password=#{password},</if>
          <if test="name != null">name=#{name},</if>
          <if test="sex != null">sex=#{sex},</if>
          <if test="age != null">age=#{age},</if>
          <if test="phone != null">phone=#{phone},</if>
          <if test="sal != null">sal=#{sal},</if>
          <if test="state != null">state=#{state}</if>
        </set>
      where id=#{id}
    </update>
  
  <!-- foreach -->
  <select id="selectEmployeeIn" resultType="org.fkit.domain.Employee">
      SELECT *
      FROM tb_employee
      WHERE ID in
      <foreach item="item" index="index" collection="list"
          open="(" separator="," close=")">
            #{item}
      </foreach>
  </select>
  
  <!-- bind -->
    <select id="selectEmployeeLikeName"  resultType="org.fkit.domain.Employee">
      <bind name="pattern" value="'%' + _parameter.getName() + '%'" />
          SELECT * FROM tb_employee
          WHERE loginname LIKE #{pattern}
    </select>
</mapper>

 

知识点描述:
(1).if
if用来判断字段是否有值,值是否为空,或者判断一些值不会让sql语句出错等
<!-- if -->
  <select id="selectEmployeeByIdLike" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee WHERE state = '1'
      <!-- 可选条件,如果传进来的参数有id属性,则加上id查询条件 -->
      <if test="id != null ">
          and id = #{id}
      </if>
  </select>
  
  <!-- if -->
  <select id="selectEmployeeByLoginLike" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee WHERE state = '1'
      <!-- 两个可选条件,例如登录功能的登录名和密码查询 -->
      <if test="loginname != null and password != null">
          and loginname = #{loginname} and password = #{password}
      </if>
  </select>


(2).choose(when、otherwise)
有时候,我们不想用所有的条件语句,而只想从中选择其一二,对与这种情况,mybatis提供了chooose元素,它有点像java中的switch。

<!-- choose(when、otherwise) -->
  <select id="selectEmployeeChoose" 
      parameterType="hashmap" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee WHERE state = '1'
      <!-- 如果传入了id,就根据id查询,没有传入id就根据loginname和password查询,否则查询sex等于男的数据 -->
      <choose>
          <when test="id != null">
              and id = #{id}
          </when>
          <when test="loginname != null and password != null">
              and loginname = #{loginname} and password = #{password}
          </when>
          <otherwise>
              and sex = '男'
          </otherwise>
      </choose>
  </select>

(3).where

 <!-- where -->
  <select id="selectEmployeeLike" 
      resultType="org.fkit.domain.Employee">
      SELECT * FROM tb_employee  
      <where>
          <if test="state != null ">
              state = #{state}
          </if>
          <if test="id != null ">
              and id = #{id}
          </if>
          <if test="loginname != null and password != null">
              and loginname = #{loginname} and password = #{password}
          </if>
      </where>
  </select>

(4).set

动态更新语句使用set元素,set元素可以被用于动态包含需要更新字段。
<!-- set -->
  <update id="updateEmployeeIfNecessary" 
      parameterType="org.fkit.domain.Employee">
      update tb_employee
        <set>
          <if test="loginname != null">loginname=#{loginname},</if>
          <if test="password != null">password=#{password},</if>
          <if test="name != null">name=#{name},</if>
          <if test="sex != null">sex=#{sex},</if>
          <if test="age != null">age=#{age},</if>
          <if test="phone != null">phone=#{phone},</if>
          <if test="sal != null">sal=#{sal},</if>
          <if test="state != null">state=#{state}</if>
        </set>
      where id=#{id}
  </update>

(5).foreach

对一个集合操作的时间使用,通常发生在构建in条件语句时。

<!-- foreach -->
  <select id="selectEmployeeIn" resultType="org.fkit.domain.Employee">
      SELECT *
      FROM tb_employee
      WHERE ID in
      <foreach item="item" index="index" collection="list"
          open="(" separator="," close=")">
            #{item}
      </foreach>
  </select>

(6).bind
bind元素可以从ognl表达式中创建一个变量并将其绑定到上下文中。

 <!-- bind -->
    <select id="selectEmployeeLikeName"  resultType="org.fkit.domain.Employee">
      <bind name="pattern" value="'%' + _parameter.getName() + '%'" />
          SELECT * FROM tb_employee
          WHERE loginname LIKE #{pattern}
    </select>

4.mybatis-config.xml

log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.fkit.mapper.EmployeeMapper=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <!--  XML 配置文件包含对 MyBatis 系统的核心设置 -->
<configuration>
    <!-- 指定 MyBatis 所用日志的具体实现 -->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <!-- 要使延迟加载生效必须配置下面两个属性 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    <environments default="mysql">
    <!-- 环境配置,即连接的数据库。 -->
    <environment id="mysql">
    <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
      <transactionManager type="JDBC"/>
      <!--  dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 -->
  <mappers>
      <mapper resource="org/fkit/mapper/EmployeeMapper.xml"/>
  </mappers>
</configuration>

5.测试

package org.fkit.test;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.fkit.domain.Employee;
import org.fkit.mapper.EmployeeMapper;

public class DynamicSQLTest {
    public static void main(String[] args) throws Exception {
        // 读取mybatis-config.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        // 创建Session实例
        SqlSession session = sqlSessionFactory.openSession();
        DynamicSQLTest t = new DynamicSQLTest();
        t.testSelectEmployeeByIdLike(session);
               //t.testSelectEmployeeByLoginLike(session);
               //t.testSelectEmployeeChoose(session);
               //t.testFindEmployeeLike(session);
               //t.testSelectEmployeeLike(session);
               //t.testUpdateEmployeeIfNecessary(session);
               //t.testSelectEmployeeIn(session);
        //t.testSelectEmployeeLikeName(session);
        // 提交事务
        session.commit();
        // 关闭Session
        session.close();
    }
    
    // 测试<select id="selectEmployeeByIdLike" ...>
    public void testSelectEmployeeByIdLike(SqlSession session){
        // 获得EmployeeMapper接口的代理对象
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        // 创建一个HashMap存储参数
        HashMap<String, Object> params = new HashMap<String, Object>();
        // 设置id属性
        //params.put("id", 1);
        // 调用EmployeeMapper接口的selectEmployeeByIdLike方法
        List<Employee> list = em.selectEmployeeByIdLike(params);
        // 查看返回结果
        list.forEach(employee -> System.out.println(employee));
    }
    
    public void testSelectEmployeeByLoginLike(SqlSession session){
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        HashMap<String, Object> params = new HashMap<String, Object>();
        // 设置loginname和password属性
        params.put("loginname", "jack");
        params.put("password", "123456");
        List<Employee> list = em.selectEmployeeByLoginLike(params);
        list.forEach(employee -> System.out.println(employee));
    }
    
    public void testSelectEmployeeChoose(SqlSession session){
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        HashMap<String, Object> params = new HashMap<String, Object>();
        // 设置id属性
//        params.put("id", 1);
//        params.put("loginname", "jack");
//        params.put("password", "123456");
        List<Employee> list = em.selectEmployeeChoose(params);
        list.forEach(employee -> System.out.println(employee));
    }
    
    public void testFindEmployeeLike(SqlSession session){
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        HashMap<String, Object> params = new HashMap<String, Object>();
        params.put("id", 1);
        List<Employee> list = em.findEmployeeLike(params);
        list.forEach(employee -> System.out.println(employee));
    }
    
    public void testSelectEmployeeLike(SqlSession session){
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        HashMap<String, Object> params = new HashMap<String, Object>();
        // 设置state属性和id属性
        params.put("id", 1);
        params.put("loginname", "jack");
        params.put("password", "123456");
        List<Employee> list = em.selectEmployeeLike(params);
        list.forEach(employee -> System.out.println(employee));
    }
    
    public void testUpdateEmployeeIfNecessary(SqlSession session){
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        Employee employee = em.selectEmployeeWithId(4);
        // 设置需要修改的属性
        employee.setLoginname("mary");
        employee.setPassword("123");
        employee.setName("玛丽");
        em.updateEmployeeIfNecessary(employee);
    }
    
    public void testSelectEmployeeIn(SqlSession session){
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        // 创建List集合
        List<Integer> ids = new ArrayList<Integer>();
        // 往List集合中添加两个测试数据
        ids.add(1);
        ids.add(2);
        List<Employee> list = em.selectEmployeeIn(ids);
        list.forEach(employee -> System.out.println(employee));
    }
    
    public void testSelectEmployeeLikeName(SqlSession session){
        EmployeeMapper em = session.getMapper(EmployeeMapper.class);
        Employee employee = new Employee();
        // 设置模糊查询的参数
        employee.setName("o");
        List<Employee> list = em.selectEmployeeLikeName(employee);
        list.forEach(result -> System.out.println(result));
    }
}

 

posted @ 2017-03-06 11:15  码大坑  阅读(225)  评论(0编辑  收藏  举报