什么是动态SQL
MyBatis的核心:对SQL语句进行灵活操作,通过表达式进行判断,对SQL进行灵活拼接、组装
动态SQL的入门案例
需求:用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态SQL 需要对查询条件进行判断:如果输入参数不为空才进行查询条件拼接 数据库的配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
<?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>
< properties resource = " db.properties" > </ properties>
< environments default = " development" >
< environment id = " development" >
< transactionManager type = " JDBC" />
< dataSource type = " POOLED" >
< property name = " driver" value = " ${jdbc.driver}" />
< property name = " url" value = " ${jdbc.url}" />
< property name = " username" value = " ${jdbc.username}" />
< property name = " password" value = " ${jdbc.password}" />
</ dataSource>
</ environment>
</ environments>
< mappers>
< package name = " com.ycom1024.mybatis.mapper" />
</ mappers>
</ configuration>
public interface UserMapper {
List< UserCustom> findUserList ( UserQueryVo vo) throws Exception;
}
<?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.ycom1024.mybatis.mapper.UserMapper" >
< select id = " findUserList"
parameterType = " com.ycom1024.mybatis.po.UserQueryVo"
resultType = " com.ycom1024.mybatis.po.UserCustom" >
SELECT * FROM USER WHERE 1 = 1
< if test = " userCustom != null" >
< if test = " userCustom.sex != null and userCustom.sex != ' ' " >
AND sex = #{userCustom.sex}
</ if>
< if test = " userCustom.username != null and userCustom.username != ' ' " >
AND username LIKE '%${userCustom.username}%'
</ if>
</ if>
</ select>
</ mapper>
@Test
void testFindUserList ( ) throws Exception {
SqlSessionFactory sqlSessionFactory = MyBatisUtils. getSqlSessionFactory ( ) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
UserCustom userCustom = new UserCustom ( ) ;
UserQueryVo vo = new UserQueryVo ( ) ;
vo. setUserCustom ( userCustom) ;
UserMapper userMapper = sqlSession. getMapper ( UserMapper. class ) ;
List< UserCustom> userCustoms = userMapper. findUserList ( vo) ;
System. out. println ( userCustoms) ;
System. out. println ( userCustoms. size ( ) ) ;
sqlSession. close ( ) ;
}
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[ User [ id= 1 , username= 王五, birthday= null, sex= 2 , address= null] , User [ id= 10 , username= 张三, birthday= Thu Jul 10 00 : 00 : 00 CST 2014 , sex= 1 , address= 北京市] , User [ id= 16 , username= 张小明, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 22 , username= 陈小明, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 24 , username= 张三丰, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 25 , username= 陈小明, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 26 , username= 王五, birthday= null, sex= null, address= null] , User [ id= 27 , username= rose, birthday= null, sex= null, address= null] , User [ id= 28 , username= jim, birthday= null, sex= 1 , address= null] , User [ id= 29 , username= kitty, birthday= null, sex= 2 , address= null] , User [ id= 32 , username= Admin, birthday= null, sex= 1 , address= China] , User [ id= 33 , username= administrator, birthday= null, sex= null, address= China] ]
12
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@Test
void testFindUserList ( ) throws Exception {
SqlSessionFactory sqlSessionFactory = MyBatisUtils. getSqlSessionFactory ( ) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
UserCustom userCustom = new UserCustom ( ) ;
userCustom. setSex ( "1" ) ;
UserQueryVo vo = new UserQueryVo ( ) ;
vo. setUserCustom ( userCustom) ;
UserMapper userMapper = sqlSession. getMapper ( UserMapper. class ) ;
List< UserCustom> userCustoms = userMapper. findUserList ( vo) ;
System. out. println ( userCustoms) ;
System. out. println ( userCustoms. size ( ) ) ;
sqlSession. close ( ) ;
}
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[ User [ id= 10 , username= 张三, birthday= Thu Jul 10 00 : 00 : 00 CST 2014 , sex= 1 , address= 北京市] , User [ id= 16 , username= 张小明, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 22 , username= 陈小明, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 24 , username= 张三丰, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 25 , username= 陈小明, birthday= null, sex= 1 , address= 河南郑州] , User [ id= 28 , username= jim, birthday= null, sex= 1 , address= null] , User [ id= 32 , username= Admin, birthday= null, sex= 1 , address= China] ]
7
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@Test
void testFindUserList ( ) throws Exception {
SqlSessionFactory sqlSessionFactory = MyBatisUtils. getSqlSessionFactory ( ) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
UserCustom userCustom = new UserCustom ( ) ;
userCustom. setUsername ( "i" ) ;
UserQueryVo vo = new UserQueryVo ( ) ;
vo. setUserCustom ( userCustom) ;
UserMapper userMapper = sqlSession. getMapper ( UserMapper. class ) ;
List< UserCustom> userCustoms = userMapper. findUserList ( vo) ;
System. out. println ( userCustoms) ;
System. out. println ( userCustoms. size ( ) ) ;
sqlSession. close ( ) ;
}
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[ User [ id= 28 , username= jim, birthday= null, sex= 1 , address= null] , User [ id= 29 , username= kitty, birthday= null, sex= 2 , address= null] , User [ id= 32 , username= Admin, birthday= null, sex= 1 , address= China] , User [ id= 33 , username= administrator, birthday= null, sex= null, address= China] ]
4
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@Test
void testFindUserList ( ) throws Exception {
SqlSessionFactory sqlSessionFactory = MyBatisUtils. getSqlSessionFactory ( ) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
UserCustom userCustom = new UserCustom ( ) ;
userCustom. setSex ( "1" ) ;
userCustom. setUsername ( "i" ) ;
UserQueryVo vo = new UserQueryVo ( ) ;
vo. setUserCustom ( userCustom) ;
UserMapper userMapper = sqlSession. getMapper ( UserMapper. class ) ;
List< UserCustom> userCustoms = userMapper. findUserList ( vo) ;
System. out. println ( userCustoms) ;
System. out. println ( userCustoms. size ( ) ) ;
sqlSession. close ( ) ;
}
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[ User [ id= 28 , username= jim, birthday= null, sex= 1 , address= null] , User [ id= 32 , username= Admin, birthday= null, sex= 1 , address= China] ]
2
楼上的案例说明了:我们只在mapper映射文件中编写了一次SQL代码:但是在Java代码中传入不同状态的查询条件得到的结果是不同的:SQL语句能够适应Java代码动态的生成:动态SQL
在楼上的mapper配置文件中的SQL语句中我们使用where 1 = 1
的写法:改写法是在原生JDBC程序中用来动态拼接SQL的时候使用的:但是在mybatis中可以不用这么写:解决方案
如下:使用where标签:where标签可以自动去掉查询条件中的第一个AND
<?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.ycom1024.mybatis.mapper.UserMapper" >
< select id = " findUserList"
parameterType = " com.ycom1024.mybatis.po.UserQueryVo"
resultType = " com.ycom1024.mybatis.po.UserCustom" >
SELECT * FROM USER
< where>
< if test = " userCustom != null" >
< if test = " userCustom.sex != null and userCustom.sex != ' ' " >
AND sex = #{userCustom.sex}
</ if>
< if test = " userCustom.username != null and userCustom.username != ' ' " >
AND username LIKE '%${userCustom.username}%'
</ if>
</ if>
</ where>
</ select>
</ mapper>
SQL片段
需求:将楼上实现的冬天SQL判断代码块抽取出来组成一个SQL片段,其他的statement中就可以引用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.ycom1024.mybatis.mapper.UserMapper" >
< sql id = " quesy_user_list" >
< if test = " userCustom != null" >
< if test = " userCustom.sex != null and userCustom.sex != ' ' " >
AND sex = #{userCustom.sex}
</ if>
< if test = " userCustom.username != null and userCustom.username != ' ' " >
AND username LIKE '%${userCustom.username}%'
</ if>
</ if>
</ sql>
< select id = " findUserList"
parameterType = " com.ycom1024.mybatis.po.UserQueryVo"
resultType = " com.ycom1024.mybatis.po.UserCustom" >
SELECT * FROM USER
< where>
< include refid = " quesy_user_list" > </ include>
</ where>
</ select>
</ mapper>
经验:基于单表来定义SQL片段,这样的话这个SQL片段的可重用性才高;在SQL片段中不要包括where
向SQL传递数组或List
向SQL传递数组或List,mybatis需要foreach解析 需求:在用户查询列表中增加多个id,有两个方法: (1) SELECT * FROM USER WHERE id = 1 OR id = 10 OR id = 27
(2) SELECT * FROM USER WHERE id IN (1, 10, 27)
<?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.ycom1024.mybatis.mapper.UserMapper" >
< sql id = " quesy_user_list" >
< if test = " userCustom != null" >
< if test = " userCustom.sex != null and userCustom.sex != ' ' " >
AND sex = #{userCustom.sex}
</ if>
< if test = " userCustom.username != null and userCustom.username != ' ' " >
AND username LIKE '%${userCustom.username}%'
</ if>
</ if>
</ sql>
< select id = " findUserList"
parameterType = " com.ycom1024.mybatis.po.UserQueryVo"
resultType = " com.ycom1024.mybatis.po.UserCustom" >
SELECT * FROM USER
< where>
< include refid = " quesy_user_list" > </ include>
< if test = " ids != null" >
< foreach collection = " ids" item = " user_id"
open = " AND (" close = " )" separator = " OR" >
id = #{user_id}
</ foreach>
</ if>
</ where>
</ select>
</ mapper>
@Test
void testFindUserList ( ) throws Exception {
SqlSessionFactory sqlSessionFactory = MyBatisUtils. getSqlSessionFactory ( ) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
List< Integer> ids = new ArrayList < > ( ) ;
ids. add ( 1 ) ;
ids. add ( 10 ) ;
ids. add ( 27 ) ;
UserQueryVo vo = new UserQueryVo ( ) ;
vo. setIds ( ids) ;
UserMapper userMapper = sqlSession. getMapper ( UserMapper. class ) ;
List< UserCustom> userCustoms = userMapper. findUserList ( vo) ;
System. out. println ( userCustoms) ;
System. out. println ( userCustoms. size ( ) ) ;
sqlSession. close ( ) ;
}
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
[ User [ id= 1 , username= 王五, birthday= null, sex= 2 , address= null] , User [ id= 10 , username= 张三, birthday= Thu Jul 10 00 : 00 : 00 CST 2014 , sex= 1 , address= 北京市] , User [ id= 27 , username= rose, birthday= null, sex= null, address= null] ]
3
另一种语法