CREATE DATABASE `mybatis_study`; USE `mybatis_study`; CREATE TABLE `user`( `user_id` INT(20) NOT NULL PRIMARY KEY, `user_name` VARCHAR(30) DEFAULT NULL, `password` VARCHAR(30) DEFAULT NULL )ENGINE = INNODB DEFAULT CHARSET = utf8; INSERT INTO `user` (`user_id`,`user_name`,`password`) VALUES (1, '张三', '123456'), (2, 'admin', 'admin'), (3, 'root', 'root');
在 MyBatis 的 SQL映射文件中,有时候需要根据一些查询条件,来选择不同的SQL语句,如果每一个场景都重写SQL,很显然效率没有很高,而 MyBatis 的动态SQL很好的解决了这种问题,根据条件动态的处理 SQL, 特别简单的说就是,写一次SQL,但是根据分支等的跳转,在多个场景下也可以使用,例如:
<where>
标签包含<where>
可以使用 <if test="....">
分条件进行处理,实现动态<foreach>
遍历标签,在用户中查询寻多个id,例如(12,16,17)在此之外,动态SQL同时结局了,在原生 JDBC 中需要拼接SQL语句时由于书写问题,而导致报错
List<User> getUserList(User user);
<select id="getUserList" resultType="com.test.pojo.User" parameterType="com.test.pojo.User"> select * from mybatis_study.user <where> <if test="user_name != null"> and user_name = #{user_name} </if> <if test="password != null"> and password = #{password} </if> </where> </select>
注意:在SQL中,“and” 用来拼接已有一个或多个查询条件的语句,当此语句为第一个查询条件的时候,会因为 的存在屏蔽第一个 “and”
import com.test.MyBatisUtils; import com.test.mapper.UserMapper; import com.test.pojo.User; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class UserTest { @Test public void test(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUser_name("admin"); List<User> userList = mapper.getUserList(user); for (User u:userList) { System.out.println(u); } sqlSession.close(); } }
提出这样一种需求,在用户中查询寻多个id,例如(12,16,17)我们可以这样写SQL
select * from mybatis_study.user where user_id=1 or user_id=2 or user_id=3
或者这样
select * from mybatis_study.user where id in (1,2,3)
而这种情况下,我们需要向SQL中传递一个数据或者List类型的参数,然后使用 标签去遍历然后解析
List<User> getUserList(List<Integer> ids);
<select id="getUserList" resultType="com.test.pojo.User" parameterType="list"> select * from mybatis_study.user <where> <foreach collection="list" open="and user_id in (" close=")" item="item" separator=","> #{item} </foreach> </where> </select>
foreach元素的属性主要有item,index,collection,open,separator,close。
import com.test.MyBatisUtils; import com.test.mapper.UserMapper; import com.test.pojo.User; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.Arrays; import java.util.List; public class UserTest { @Test public void test(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<Integer> ids = Arrays.asList(1, 2, 3); List<User> userList = mapper.getUserList(ids); for (User u:userList) { System.out.println(u); } sqlSession.close(); } }