Mybatis动态SQL配置

微信扫一扫,分享到朋友圈

Mybatis动态SQL配置

使用 if where foreach标签对映射配置文件中sql语句进行动态配置

1、首先在dao接口中设置两个查询方法

1 package sun.dao;
2
3 import sun.domain.QueryObj;
4 import sun.domain.User;
5
6 import java.util.List;
7
8 public interface UserDao {
9
10     /**
11      * 根据已有条件进行查询(if where)
12      */
13     List<User> findUserByCondition(User user);
14
15     /**
16      * 根据集合中的id进行查询(if where foreach)
17      */
18     List<User> findUserByList(QueryObj qobj);
19 }

2、配置映射配置文件(使用if where foreach三种标签)

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper
3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6 <mapper namespace="sun.dao.UserDao">
7     <resultMap id="userMap" type="sun.domain.User">
8         <!--主键字段对应-->
9         <id property="user_id" column="id"></id>
10         <!--非主键关系对应-->
11         <result property="user_name" column="username"></result>
12         <result property="user_birthday" column="birthday"></result>
13         <result property="user_address" column="address"></result>
14         <result property="user_sex" column="sex"></result>
15     </resultMap>
16
17     <!--公共sql语句抽取-->
18     <sql id="defaultSelect">
19         select * from user
20     </sql>
21
22     <!--根据条件进行查询-->
23     <select id="findUserByCondition" resultMap="userMap" parameterType="user">
24         <include refid="defaultSelect"></include>
25         <where>
26             <if test="user_name!=null">
27                 and username=#{user_name}
28             </if>
29             <if test="user_sex!=null">
30                 and sex=#{user_sex}
31             </if>
32         </where>
33     </select>
34     <!--根据id列表进行查询-->
35     <select id="findUserByList" parameterType="queryobj" resultMap="userMap">
36         <include refid="defaultSelect"></include>
37         <where>
38             <if test="ids!=null and ids.size()>0">
39                 <foreach collection="ids" open="id in (" close=")" item="id" separator=",">
40                     #{id}
41                 </foreach>
42             </if>
43         </where>
44     </select>
45 </mapper>

在映射配置文件中可以使用sql标签对常用的sql语句进行抽取,在操作标签内如果需要使用该sql语句可使用include标签进行导入即可。

(注意:使用sql语句进行抽取时,sql语句后面不要添加分号,否则会导致在操作标签内引用后拼接sql字符串时造成错误)

如果在该段代码中有关于parameterType未使用全限定类名的疑惑请参考 Mybatis项目构建和CURD操作 博客最下面的 properties标签和typeAliases标签的使用

3、测试类中进行测试

1 package sun.test;
2
3
4 import org.apache.ibatis.io.Resources;
5 import org.apache.ibatis.session.SqlSession;
6 import org.apache.ibatis.session.SqlSessionFactory;
7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
8 import org.junit.After;
9 import org.junit.Before;
10 import org.junit.Test;
11 import sun.dao.UserDao;
12 import sun.domain.QueryObj;
13 import sun.domain.User;
14
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.util.ArrayList;
18 import java.util.Date;
19 import java.util.List;
20
21 public class MybatisTest {
22
23     private InputStream in;
24     private SqlSession sqlSession;
25     private UserDao userDao;
26
27     @Before
28     public void init() throws IOException {
29         // 读取配置文件
30         in = Resources.getResourceAsStream("SqlMapConfig.xml");
31         // 创建SqlSessionFactory
32         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
33         SqlSessionFactory factory = builder.build(in);
34         // 使用工厂生产sqlsession对象
35         sqlSession = factory.openSession();
36         // 使用sqlsession创建UserDao接口代理对象
37         userDao = sqlSession.getMapper(UserDao.class);
38     }
39
40     @After
41     public void destory() throws IOException {
42         sqlSession.commit();
43         sqlSession.close();
44         in.close();
45     }
46
47
48     @Test
49     public void conditionTest(){
50         User user = new User();
51         user.setUser_name("kelvin");
52         user.setUser_sex("女");
53         List<User> users = userDao.findUserByCondition(user);
54         for (User user1 : users) {
55             System.out.println(user1);
56         }
57     }
58
59     @Test
60     public void ids(){
61         QueryObj queryObj = new QueryObj();
62         ArrayList<Integer> ids = new ArrayList<Integer>();
63         ids.add(51);
64         ids.add(52);
65         ids.add(53);
66         queryObj.setIds(ids);
67         List<User> users = userDao.findUserByList(queryObj);
68         for (User user : users) {
69             System.out.println(user);
70         }
71
72     }
73 }

测试结果如下:

微信扫一扫,分享到朋友圈

Mybatis动态SQL配置

ofo小黄车“自动续费”仍正常运作!快去看看你的关闭了没有

上一篇

外媒:京东方明年下半年有望为苹果iPhone 13供应OLED屏幕

下一篇

你也可能喜欢

Mybatis动态SQL配置

长按储存图像,分享给朋友