MyBatis研习录(11)——MyBatis动态SQL
2019-11-27 21:52
148 查看
讲给Android程序员看的前端系列教程(40集免费视频教程+源码)
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
概述
动态SQL是MyBatis 的强大特性,利用动态SQL可以极大的优化SQL语句的编写及其处理。
数据准备
CREATE TABLE user( id INT PRIMARY KEY auto_increment, username VARCHAR(50), password VARCHAR(50), gender VARCHAR(10) ); INSERT INTO user(username,password,gender) VALUES("lucy","123456","female"); INSERT INTO user(username,password,gender) VALUES("momo","234567","female"); INSERT INTO user(username,password,gender) VALUES("xixi","345678","female"); INSERT INTO user(username,password,gender) VALUES("pepe","456123","female"); SELECT * FROM user;
搭建开发环境
创建普通的Java工程,结构如下:
User
package cn.com.pojo; /** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */ public class User { private Integer id; private String username; private String password; private String gender; public User() { } public User(Integer id, String username, String password, String gender) { super(); this.id = id; this.username = username; this.password = password; this.gender = gender; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + ", gender=" + gender + "]"; } }
UserMapper.java
package cn.com.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import cn.com.pojo.User; /** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */ public interface UserMapper { //测试动态SQL语句if public List<User> queryUserWithIf(@Param("username")String username,@Param("password")String password); //测试动态SQL语句where public List<User> queryUserWithWhere(@Param("username")String username,@Param("password")String password); //测试动态SQL语句choose public List<User> queryUserWithChoose(@Param("username")String username,@Param("password")String password); //测试动态SQL语句set public int updateUserWithSet(User user); //测试动态SQL语句trim public int updateUserWithTrim(User user); //测试动态SQL语句bind public List<User> queryUserWithBind(@Param("username")String username); //测试动态SQL语句foreach public List<User> queryUserWithForeach(@Param("userIDList")List<Integer> userIDList); //测试动态SQL语句include public List<User> queryUserWithInclude(@Param("username")String username,@Param("password")String password); }
常用动态SQL
if
if用于进行条件判断,其test属性用于指定判断条件。
注意事项:
在test的属性值中不必再使用占位符#{ }
where
where主要用于用于管理where子句,其主要作用如下:
- 1、如果没有where子句则不生成where关键字
- 2、如果有where子句则自动添加where关键字
- 3、如果where子句第一个条件中有and则将其去除
choose
choose常与when、otherwise配合使用用于分支选择,其使用方式和作用非常类似于switch case default语句。
set
set用于维护update语句中的set子句,其主要作用如下:
- 1、满足条件时, 自动添加set关键字
- 2、不满足条件时, 不会生成set关键字
- 3、删除set子句中多余的逗号
trim
trim用于在SQL语句前后添加或删除一些内容,其属性作用如下:
- 1、prefix:在SQL语句前面添加内容
- 2、prefixOverrides:从SQL语句前面去除内容
- 3、suffix:向SQL语句后面添加内容
- 4、suffixOverrides:从SQL语句后面去除内容
bind
bind用于对数据进行再加工,常用于模糊查询。
foreach
foreach用于在SQL语句中遍历集合参数,常在in查询中使用;,其属性作用如下:
- 1、collection:设置待遍历集合
- 2、open:设置开始符号
- 3、item:迭代变量
- 4、separator:分隔符
- 5、close:设置结束符号
include
include常与sql配合使用;其中,sql抽取公用SQL语句include引用该语句。
UserMapper.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"> <mapper namespace="cn.com.mapper.UserMapper"> <!-- 测试动态SQL语句if --> <select id="queryUserWithIf" resultType="cn.com.pojo.User"> select * from user where 1=1 <if test="username !=null and username !=''"> and username=#{username} </if> <if test="password !=null and password !=''"> and password=#{password} </if> </select> <!-- 测试动态SQL语句where --> <select id="queryUserWithWhere" resultType="cn.com.pojo.User"> select * from user <where> <if test="username !=null and username !=''"> and username=#{username} </if> <if test="password !=null and password !=''"> and password=#{password} </if> </where> </select> <!-- 测试动态SQL语句choose --> <select id="queryUserWithChoose" resultType="cn.com.pojo.User"> select * from user <where> <choose> <when test="username !=null and username !=''"> and username=#{username} </when> <when test="password !=null and password !=''"> and password=#{password} </when> <otherwise> and username like concat('%','lu','%') </otherwise> </choose> </where> </select> <!-- 测试动态SQL语句set --> <update id="updateUserWithSet" parameterType="cn.com.pojo.User"> update user <set> <if test="username !=null and username !=''"> username=#{username}, </if> <if test="password !=null and password !=''"> password=#{password}, </if> <if test="gender !=null and gender !=''"> gender=#{gender} </if> </set> where id=#{id} </update> <!-- 测试动态SQL语句trim --> <update id="updateUserWithTrim" parameterType="cn.com.pojo.User"> update user <trim prefix="set" suffixOverrides=",,,"> username=#{username},,, </trim> where id=#{id} </update> <!-- 测试动态SQL语句bind --> <select id="queryUserWithBind" resultType="cn.com.pojo.User"> select * from user <where> <if test="username !=null and username !=''"> <bind name="username" value="'%'+username+'%'"/> username like #{username} </if> </where> </select> <!-- 测试动态SQL语句foreach --> <select id="queryUserWithForeach" parameterType="list" resultType="cn.com.pojo.User"> select * from user where id in <foreach collection="userIDList" open="(" separator="," close=")" item="userID"> #{userID} </foreach> </select> <!-- 测试动态SQL语句include --> <sql id="columns">id,username,password,gender</sql> <select id="queryUserWithInclude" resultType="cn.com.pojo.User"> select <include refid="columns"/> from user <where> <if test="username !=null and username !=''"> and username=#{username} </if> <if test="password !=null and password !=''"> and password=#{password} </if> </where> </select> </mapper>
MybatisTest
package cn.com.test; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; 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.junit.Test; import cn.com.mapper.UserMapper; import cn.com.pojo.User; /** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */ public class MybatisTest { static SqlSessionFactory sqlSessionFactory = null; public static SqlSessionFactory getSqlSessionFactory() { try { if (sqlSessionFactory == null) { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); } return sqlSessionFactory; } catch (Exception e) { // TODO: handle exception } finally { } return null; } @Test public void testQueryUserWithIf() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 List<User> userList = userMapper.queryUserWithIf("lucy", "123456"); //List<User> userList = userMapper.queryUserWithIf("", ""); //List<User> userList = userMapper.queryUserWithIf("lucy", ""); //List<User> userList = userMapper.queryUserWithIf("", "123456"); Iterator<User> iterator = userList.iterator(); while(iterator.hasNext()) { User user = iterator.next(); System.out.println(user); } //关闭SqlSession sqlSession.close(); } @Test public void testQueryUserWithWhere() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 List<User> userList = userMapper.queryUserWithWhere("lucy", "123456"); //List<User> userList = userMapper.queryUserWithWhere("", ""); //List<User> userList = userMapper.queryUserWithWhere("lucy", ""); //List<User> userList = userMapper.queryUserWithWhere("", "123456"); Iterator<User> iterator = userList.iterator(); while(iterator.hasNext()) { User user = iterator.next(); System.out.println(user); } //关闭SqlSession sqlSession.close(); } @Test public void testQueryUserWithChoose() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 List<User> userList = userMapper.queryUserWithChoose("lucy", "123456"); //List<User> userList = userMapper.queryUserWithChoose("", ""); //List<User> userList = userMapper.queryUserWithChoose("lucy", ""); //List<User> userList = userMapper.queryUserWithChoose("", "123456"); Iterator<User> iterator = userList.iterator(); while(iterator.hasNext()) { User user = iterator.next(); System.out.println(user); } //关闭SqlSession sqlSession.close(); } @Test public void testUpdateUserWithSet() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 User user=new User(1, "tutu", "666999", "male"); int result=userMapper.updateUserWithSet(user); System.out.println(result); //提交 sqlSession.commit(); //关闭SqlSession sqlSession.close(); } @Test public void testUpdateUserWithTrim() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 User user=new User(1, "wawa", "666666", "male"); int result=userMapper.updateUserWithTrim(user); System.out.println(result); //提交 sqlSession.commit(); //关闭SqlSession sqlSession.close(); } @Test public void testQueryUserWithBind() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 List<User> userList = userMapper.queryUserWithBind("xi"); Iterator<User> iterator = userList.iterator(); while(iterator.hasNext()) { User user = iterator.next(); System.out.println(user); } //关闭SqlSession sqlSession.close(); } @Test public void testQueryUserWithForeach() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 List<Integer> userIDList=new ArrayList<Integer>(); userIDList.add(1); userIDList.add(2); userIDList.add(3); List<User> userList = userMapper.queryUserWithForeach(userIDList); Iterator<User> iterator = userList.iterator(); while(iterator.hasNext()) { User user = iterator.next(); System.out.println(user); } //关闭SqlSession sqlSession.close(); } @Test public void testQueryUserWithInclude() { //获取SqlSession SqlSession sqlSession=getSqlSessionFactory().openSession(); //利用SqlSession得到UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //利用SqlSession执行数据操作 List<User> userList = userMapper.queryUserWithInclude("pepe", "456123"); Iterator<User> iterator = userList.iterator(); while(iterator.hasNext()) { User user = iterator.next(); System.out.println(user); } //关闭SqlSession sqlSession.close(); } }
log4j.properties
# Global logging configuration log4j.rootLogger=DEBUG, stdout # 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"> <configuration> <!-- 配置数据源 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatisDatabase"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 配置mapper --> <mappers> <mapper resource="cn/com/pojo/UserMapper.xml"/> </mappers> </configuration>谷哥的小弟 博客专家 原创文章 1028获赞 2010访问量 243万+ 关注 他的留言板
相关文章推荐
- MyBatis学习总结(11)——MyBatis动态Sql语句
- MyBatis学习总结_11_MyBatis动态Sql语句
- mybatis(11)--动态sql
- MyBatis学习总结(11)——MyBatis动态Sql语句
- 使用MyBatis(11)动态SQL
- mybatis中动态sql标签之if trim
- mybatis动态sql
- mybatis 动态sql
- MyBatis3入门程序(04_动态SQL)
- MyBatis学习 之 三、动态SQL语句
- mybatis动态SQL
- Mybatis使用动态sql
- MyBatis动态SQL
- 【mybatis深度历险系列】mybatis中的动态sql
- mybatis 动态sql语句
- MyBatis归纳之动态SQL
- mybatis 动态sql
- mybatis 使用动态SQL
- MyBatis的动态SQL详解
- MyBatis动态sql小结(三)