1.创建表

  1. CREATE TABLE tb_employee (
  2. ID INT(11) PRIMARY KEY AUTO_INCREMENT,
  3. loginname VARCHAR(18),
  4. PASSWORD VARCHAR(18),
  5. NAME VARCHAR(18) DEFAULT NULL,
  6. SEX CHAR(2) DEFAULT NULL,
  7. AGE INT(11) DEFAULT NULL,
  8. phone VARCHAR(21),
  9. sal DOUBLE,
  10. state VARCHAR(18)
  11. )
  12.  
  13. INSERT INTO tb_employee(loginname,PASSWORD,NAME,sex,age,phone,sal,state)
  14. VALUES('jack','123456','杰克','男',30,'15012345678',5000,'1');
  15. INSERT INTO tb_employee(loginname,PASSWORD,NAME,sex,age,phone,sal,state)
  16. VALUES('rose','123456','露丝','女',28,'135612345678',4000,'1');

 2.创建实体
Employee.java

  1. package org.fkit.domain;
  2. import java.io.Serializable;
  3. public class Employee implements Serializable {
  4.  
  5. private Integer id; // 主键id
  6. private String loginname; // 登录名
  7. private String password; // 密码
  8. private String name; // 真实姓名
  9. private String sex; // 性别
  10. private Integer age; // 年龄
  11. private String phone; // 电话
  12. private Double sal; // 薪水
  13. private String state; // 状态
  14.  
  15. public Employee() {
  16. super();
  17. }
  18. public Integer getId() {
  19. return id;
  20. }
  21. public void setId(Integer id) {
  22. this.id = id;
  23. }
  24. public String getLoginname() {
  25. return loginname;
  26. }
  27. public void setLoginname(String loginname) {
  28. this.loginname = loginname;
  29. }
  30. public String getPassword() {
  31. return password;
  32. }
  33. public void setPassword(String password) {
  34. this.password = password;
  35. }
  36. public String getName() {
  37. return name;
  38. }
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42. public String getSex() {
  43. return sex;
  44. }
  45. public void setSex(String sex) {
  46. this.sex = sex;
  47. }
  48. public Integer getAge() {
  49. return age;
  50. }
  51. public void setAge(Integer age) {
  52. this.age = age;
  53. }
  54. public String getPhone() {
  55. return phone;
  56. }
  57. public void setPhone(String phone) {
  58. this.phone = phone;
  59. }
  60. public Double getSal() {
  61. return sal;
  62. }
  63. public void setSal(Double sal) {
  64. this.sal = sal;
  65. }
  66. public String getState() {
  67. return state;
  68. }
  69. public void setState(String state) {
  70. this.state = state;
  71. }
  72. @Override
  73. public String toString() {
  74. return "data [id=" + id + ", loginname=" + loginname
  75. + ", password=" + password + ", name=" + name + ", sex=" + sex
  76. + ", age=" + age + ", phone=" + phone + ", sal=" + sal
  77. + ", state=" + state + "]";
  78. }
  79. }

3.mapper创建

EmployeeMapper.java

  1. package org.fkit.mapper;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import org.fkit.domain.Employee;
  5. public interface EmployeeMapper {
  6. List<Employee> selectEmployeeByIdLike(HashMap<String, Object> params);
  7. List<Employee> selectEmployeeByLoginLike(HashMap<String, Object> params);
  8. List<Employee> selectEmployeeChoose(HashMap<String, Object> params);
  9. List<Employee> findEmployeeLike(HashMap<String, Object> params);
  10. List<Employee> selectEmployeeLike(HashMap<String, Object> params);
  11. Employee selectEmployeeWithId(Integer id);
  12. void updateEmployeeIfNecessary(Employee employee);
  13. List<Employee> selectEmployeeIn(List<Integer> ids);
  14. List<Employee> selectEmployeeLikeName(Employee employee);
  15. }

EmployeeMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <!-- namespace指用户自定义的命名空间。 -->
  5. <mapper namespace="org.fkit.mapper.EmployeeMapper">
  6.  
  7. <select id="selectEmployeeWithId" parameterType="int" resultType="org.fkit.domain.Employee">
  8. SELECT * FROM tb_employee where id = #{id}
  9. </select>
  10.  
  11. <!-- if -->
  12. <select id="selectEmployeeByIdLike"
  13. resultType="org.fkit.domain.Employee">
  14. SELECT * FROM tb_employee WHERE state = '1'
  15. <!-- 可选条件,如果传进来的参数有id属性,则加上id查询条件 -->
  16. <if test="id != null ">
  17. and id = #{id}
  18. </if>
  19. </select>
  20.  
  21. <!-- if -->
  22. <select id="selectEmployeeByLoginLike"
  23. resultType="org.fkit.domain.Employee">
  24. SELECT * FROM tb_employee WHERE state = '1'
  25. <!-- 两个可选条件,例如登录功能的登录名和密码查询 -->
  26. <if test="loginname != null and password != null">
  27. and loginname = #{loginname} and password = #{password}
  28. </if>
  29. </select>
  30.  
  31. <!-- choose(when、otherwise) -->
  32. <select id="selectEmployeeChoose"
  33. parameterType="hashmap"
  34. resultType="org.fkit.domain.Employee">
  35. SELECT * FROM tb_employee WHERE state = '1'
  36. <!-- 如果传入了id,就根据id查询,没有传入id就根据loginname和password查询,否则查询sex等于男的数据 -->
  37. <choose>
  38. <when test="id != null">
  39. and id = #{id}
  40. </when>
  41. <when test="loginname != null and password != null">
  42. and loginname = #{loginname} and password = #{password}
  43. </when>
  44. <otherwise>
  45. and sex = '男'
  46. </otherwise>
  47. </choose>
  48. </select>
  49.  
  50. <select id="findEmployeeLike"
  51. resultType="org.fkit.domain.Employee">
  52. SELECT * FROM tb_employee WHERE
  53. <if test="state != null ">
  54. state = #{state}
  55. </if>
  56. <if test="id != null ">
  57. and id = #{id}
  58. </if>
  59. <if test="loginname != null and password != null">
  60. and loginname = #{loginname} and password = #{password}
  61. </if>
  62. </select>
  63.  
  64. <!-- where -->
  65. <select id="selectEmployeeLike"
  66. resultType="org.fkit.domain.Employee">
  67. SELECT * FROM tb_employee
  68. <where>
  69. <if test="state != null ">
  70. state = #{state}
  71. </if>
  72. <if test="id != null ">
  73. and id = #{id}
  74. </if>
  75. <if test="loginname != null and password != null">
  76. and loginname = #{loginname} and password = #{password}
  77. </if>
  78. </where>
  79. </select>
  80.  
  81. <!-- set -->
  82. <update id="updateEmployeeIfNecessary"
  83. parameterType="org.fkit.domain.Employee">
  84. update tb_employee
  85. <set>
  86. <if test="loginname != null">loginname=#{loginname},</if>
  87. <if test="password != null">password=#{password},</if>
  88. <if test="name != null">name=#{name},</if>
  89. <if test="sex != null">sex=#{sex},</if>
  90. <if test="age != null">age=#{age},</if>
  91. <if test="phone != null">phone=#{phone},</if>
  92. <if test="sal != null">sal=#{sal},</if>
  93. <if test="state != null">state=#{state}</if>
  94. </set>
  95. where id=#{id}
  96. </update>
  97.  
  98. <!-- foreach -->
  99. <select id="selectEmployeeIn" resultType="org.fkit.domain.Employee">
  100. SELECT *
  101. FROM tb_employee
  102. WHERE ID in
  103. <foreach item="item" index="index" collection="list"
  104. open="(" separator="," close=")">
  105. #{item}
  106. </foreach>
  107. </select>
  108.  
  109. <!-- bind -->
  110. <select id="selectEmployeeLikeName" resultType="org.fkit.domain.Employee">
  111. <bind name="pattern" value="'%' + _parameter.getName() + '%'" />
  112. SELECT * FROM tb_employee
  113. WHERE loginname LIKE #{pattern}
  114. </select>
  115. </mapper>
知识点描述:
(1).if
if用来判断字段是否有值,值是否为空,或者判断一些值不会让sql语句出错等
  1. <!-- if -->
  2. <select id="selectEmployeeByIdLike"
  3. resultType="org.fkit.domain.Employee">
  4. SELECT * FROM tb_employee WHERE state = '1'
  5. <!-- 可选条件,如果传进来的参数有id属性,则加上id查询条件 -->
  6. <if test="id != null ">
  7. and id = #{id}
  8. </if>
  9. </select>
  10.  
  11. <!-- if -->
  12. <select id="selectEmployeeByLoginLike"
  13. resultType="org.fkit.domain.Employee">
  14. SELECT * FROM tb_employee WHERE state = '1'
  15. <!-- 两个可选条件,例如登录功能的登录名和密码查询 -->
  16. <if test="loginname != null and password != null">
  17. and loginname = #{loginname} and password = #{password}
  18. </if>
  19. </select>

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

  1. <!-- choose(when、otherwise) -->
  2. <select id="selectEmployeeChoose"
  3. parameterType="hashmap"
  4. resultType="org.fkit.domain.Employee">
  5. SELECT * FROM tb_employee WHERE state = '1'
  6. <!-- 如果传入了id,就根据id查询,没有传入id就根据loginname和password查询,否则查询sex等于男的数据 -->
  7. <choose>
  8. <when test="id != null">
  9. and id = #{id}
  10. </when>
  11. <when test="loginname != null and password != null">
  12. and loginname = #{loginname} and password = #{password}
  13. </when>
  14. <otherwise>
  15. and sex = '男'
  16. </otherwise>
  17. </choose>
  18. </select>

(3).where

  1. <!-- where -->
  2. <select id="selectEmployeeLike"
  3. resultType="org.fkit.domain.Employee">
  4. SELECT * FROM tb_employee
  5. <where>
  6. <if test="state != null ">
  7. state = #{state}
  8. </if>
  9. <if test="id != null ">
  10. and id = #{id}
  11. </if>
  12. <if test="loginname != null and password != null">
  13. and loginname = #{loginname} and password = #{password}
  14. </if>
  15. </where>
  16. </select>

(4).set

动态更新语句使用set元素,set元素可以被用于动态包含需要更新字段。
  1. <!-- set -->
  2. <update id="updateEmployeeIfNecessary"
  3. parameterType="org.fkit.domain.Employee">
  4. update tb_employee
  5. <set>
  6. <if test="loginname != null">loginname=#{loginname},</if>
  7. <if test="password != null">password=#{password},</if>
  8. <if test="name != null">name=#{name},</if>
  9. <if test="sex != null">sex=#{sex},</if>
  10. <if test="age != null">age=#{age},</if>
  11. <if test="phone != null">phone=#{phone},</if>
  12. <if test="sal != null">sal=#{sal},</if>
  13. <if test="state != null">state=#{state}</if>
  14. </set>
  15. where id=#{id}
  16. </update>

(5).foreach

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

  1. <!-- foreach -->
  2. <select id="selectEmployeeIn" resultType="org.fkit.domain.Employee">
  3. SELECT *
  4. FROM tb_employee
  5. WHERE ID in
  6. <foreach item="item" index="index" collection="list"
  7. open="(" separator="," close=")">
  8. #{item}
  9. </foreach>
  10. </select>

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

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

4.mybatis-config.xml

log4j.properties

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

mybatis-config.xml

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

5.测试

  1. package org.fkit.test;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.fkit.domain.Employee;
  11. import org.fkit.mapper.EmployeeMapper;
  12.  
  13. public class DynamicSQLTest {
  14. public static void main(String[] args) throws Exception {
  15. // 读取mybatis-config.xml文件
  16. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  17. // 初始化mybatis,创建SqlSessionFactory类的实例
  18. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
  19. .build(inputStream);
  20. // 创建Session实例
  21. SqlSession session = sqlSessionFactory.openSession();
  22. DynamicSQLTest t = new DynamicSQLTest();
  23. t.testSelectEmployeeByIdLike(session);
  24. //t.testSelectEmployeeByLoginLike(session);
  25. //t.testSelectEmployeeChoose(session);
  26. //t.testFindEmployeeLike(session);
  27. //t.testSelectEmployeeLike(session);
  28. //t.testUpdateEmployeeIfNecessary(session);
  29. //t.testSelectEmployeeIn(session);
  30. //t.testSelectEmployeeLikeName(session);
  31. // 提交事务
  32. session.commit();
  33. // 关闭Session
  34. session.close();
  35. }
  36.  
  37. // 测试<select id="selectEmployeeByIdLike" ...>
  38. public void testSelectEmployeeByIdLike(SqlSession session){
  39. // 获得EmployeeMapper接口的代理对象
  40. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  41. // 创建一个HashMap存储参数
  42. HashMap<String, Object> params = new HashMap<String, Object>();
  43. // 设置id属性
  44. //params.put("id", 1);
  45. // 调用EmployeeMapper接口的selectEmployeeByIdLike方法
  46. List<Employee> list = em.selectEmployeeByIdLike(params);
  47. // 查看返回结果
  48. list.forEach(employee -> System.out.println(employee));
  49. }
  50.  
  51. public void testSelectEmployeeByLoginLike(SqlSession session){
  52. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  53. HashMap<String, Object> params = new HashMap<String, Object>();
  54. // 设置loginname和password属性
  55. params.put("loginname", "jack");
  56. params.put("password", "123456");
  57. List<Employee> list = em.selectEmployeeByLoginLike(params);
  58. list.forEach(employee -> System.out.println(employee));
  59. }
  60.  
  61. public void testSelectEmployeeChoose(SqlSession session){
  62. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  63. HashMap<String, Object> params = new HashMap<String, Object>();
  64. // 设置id属性
  65. // params.put("id", 1);
  66. // params.put("loginname", "jack");
  67. // params.put("password", "123456");
  68. List<Employee> list = em.selectEmployeeChoose(params);
  69. list.forEach(employee -> System.out.println(employee));
  70. }
  71.  
  72. public void testFindEmployeeLike(SqlSession session){
  73. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  74. HashMap<String, Object> params = new HashMap<String, Object>();
  75. params.put("id", 1);
  76. List<Employee> list = em.findEmployeeLike(params);
  77. list.forEach(employee -> System.out.println(employee));
  78. }
  79.  
  80. public void testSelectEmployeeLike(SqlSession session){
  81. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  82. HashMap<String, Object> params = new HashMap<String, Object>();
  83. // 设置state属性和id属性
  84. params.put("id", 1);
  85. params.put("loginname", "jack");
  86. params.put("password", "123456");
  87. List<Employee> list = em.selectEmployeeLike(params);
  88. list.forEach(employee -> System.out.println(employee));
  89. }
  90.  
  91. public void testUpdateEmployeeIfNecessary(SqlSession session){
  92. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  93. Employee employee = em.selectEmployeeWithId(4);
  94. // 设置需要修改的属性
  95. employee.setLoginname("mary");
  96. employee.setPassword("123");
  97. employee.setName("玛丽");
  98. em.updateEmployeeIfNecessary(employee);
  99. }
  100.  
  101. public void testSelectEmployeeIn(SqlSession session){
  102. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  103. // 创建List集合
  104. List<Integer> ids = new ArrayList<Integer>();
  105. // 往List集合中添加两个测试数据
  106. ids.add(1);
  107. ids.add(2);
  108. List<Employee> list = em.selectEmployeeIn(ids);
  109. list.forEach(employee -> System.out.println(employee));
  110. }
  111.  
  112. public void testSelectEmployeeLikeName(SqlSession session){
  113. EmployeeMapper em = session.getMapper(EmployeeMapper.class);
  114. Employee employee = new Employee();
  115. // 设置模糊查询的参数
  116. employee.setName("o");
  117. List<Employee> list = em.selectEmployeeLikeName(employee);
  118. list.forEach(result -> System.out.println(result));
  119. }
  120. }

05—动态sql的更多相关文章

  1. [05] 动态SQL

    MyBatis的强大特性之一就是它的动态SQL,它可以根据不同的条件动态地组成SQL语句进行执行.为此,MyBatis提供了一系列强大的表达式,本章将就此进行学习,主要内容直接参考的是官方文档< ...

  2. 游标、动态sql、异常

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlIAAAFeCAIAAADBl2bCAAAgAElEQVR4nOyddXgU197H12OEELxIkV

  3. mybatis——动态sql

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...

  4. IBATIS动态SQL

    转自:http://www.cnblogs.com/phoebus0501/archive/2011/05/16/2048126.html 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值 ...

  5. 动态游标(例如表名作为参数)以及动态SQL分析

    表名作为参数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...

  6. db2存储过程动态sql被截断

    编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql ...

  7. (2.3)DDL增强功能-流程化控制与动态sql

    1.流程控制 在T-SQL中,与流程控制语句相关的关键字有8个: BEGIN...END BREAK GOTO CONTINUE IF...ELSE WHILE RETURN WAITFOR 其实还可 ...

  8. (转)Oracle中动态SQL详解

    本文转载自:http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html 1.静态SQLSQL与动态SQL Oracle编译PL ...

  9. 使用Oracle的DBMS_SQL包执行动态SQL语句

    引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...

随机推荐

  1. 最新 顺网科技java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.顺网科技得等10家互联网公司的校招Offer,因为某些自身原因最终选择了顺网科技.6.7月主要是做系统复习.项目复盘.Lee ...

  2. codevs 1039:数的划分

    http://codevs.cn/problem/1039/ 题目描述 Description将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序).例如:n=7,k=3,下面三种划 ...

  3. IDEA 启动项目 很慢,总会到某个点进行延迟卡顿。

    最开始的我解决的方式 clean 项目 忙完后,闲暇时间想起这个问题,然后进行 面向百度,发现了问题所在 参考文档:https://www.cnblogs.com/zhangzhonghui/p/11 ...

  4. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  5. LC 349. Intersection of Two Arrays

    题目描述 Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1, ...

  6. 【静态延迟加载】self关键字和static关键字的区别

    先来看下代码,从代码中发现问题.解决问题 //先实现一个手机工厂类 class Phone{ public static function setBrand(){ echo "Main Ph ...

  7. 适合新手的160个creakme(二)

    先跑一下,然后找出关键字符串 关键字符串是You Get Wrong和Try Again,不过IDA好像识别不出来这个字符串,在Ollydbg中右键Search For,寻找所有字符串,可以找到这些字 ...

  8. eclipse导入maven空项目,eclipse导入时不识别maven项目

    经常我们在网上下载的一些开源项目中,想要导入eclipse中,却发现eclipse不识别这个项目,这时候怎么办呢? 解决办法多种多样,我这里举例出最实用的2种: 1.在项目的根目录中加入.classp ...

  9. volatile 关键字(修饰变量)

    目录 volatile 关键字(修饰变量) 1. 含义 2. 作用 3. 如何保证可见性 4. 如何禁止指令重排序优化 5. volatile 是不安全的 6. volatile 不适用场景 vola ...

  10. sqlce基本语法

    整理和总结一下SQLCE的用法引用  System.Data.SqlServerCe(1)数据库文件的创建     SqlCeEngine eng = new SqlCeEngine("Da ...