zoukankan      html  css  js  c++  java
  • Mybatis基础学习(三)—映射文件

    一、输入映射

    1.parameterType

        指定输入参数的Java类,可以使用别名或者类的全限定名。它也可以接受基本数据类型、POJO对象、HashMap。

    (1)基本数据类型

    image

    (2)POJO对象

    image

    (3)传递POJO包装对象

        开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

    UserQueryVo.java

    public class UserQueryVO{
    
    	// 用户信息
    	private User user;
    
    	public User getUser(){
    		return user;
    	}
    
    	public void setUser(User user){
    		this.user = user;
    	}
    
    }

    UserMapper.xml

    image

    UserMapper.java

    image

    Test.java

    image

    (4)传递HashMap

        map的key相当于POJO的属性。

    UserMapper.xml

    image

    UserMapper.java

    image

    Test.java

    image

    结果:

         User [id=25, username=陈小明, sex=2, birthday=Fri Jul 01 00:00:00 GMT+08:00 2016, address=长春市]

    二、SQL标签

         通过Mybatis提供的各种动态标签实现动态拼接sql,使得mapper映射文件在编写SQL时更加灵活,方便。常用动态SQL标签有:if、where、foreach。

    1.if和where标签

    if: 作为判断入参来使用的,如果符合条件,则把if标签体内SQL拼接上。注意:用if 标签判断是否为空时,不仅要判断null,也有判断空串""。

    where: 会去掉条件中的第一个And符号。

    案例一: 根据用户名和性别查询

    UserMapper.xml

    <!-- 标签的使用 -->
        <select id="findUsersByNameAndSex" parameterType="userQueryVo" resultType="user">
            SELECT * FROM user
    
            <!--wher标签:将后面第一个AND去掉,如果没有条件则把自己去掉 -->
            <where>
                <if test="user != null">
    
                    <if test="user.username != null and user.username != ''">
                        AND username LIKE '%${user.username}%'
                    </if>
    
                    <if test="user.sex != null and user.sex != ''">
                        AND sex = #{user.sex}
                    </if>
    
                </if>
    
            </where>
    
        </select>

    UserMapper.java

    public interface UserMapper{
    
    	public User findUserById(int id);
    	
    	public void saveUser(User user);
    	
    	public List<User> findUserList(UserQueryVO uq);
    	
    	public List<User> findUserByNameAndSex(HashMap hashMap);
    	
    	public List<User> findUsersByNameAndSex(UserQueryVO vo);
    }

    Test.java

    	@Test
    	public void testFindUsersByNameAndSex(){
    		
    		SqlSession sqlSession = sqlSessionFactory.openSession();
    		
    		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    		
    		UserQueryVO vo = new UserQueryVO();
    		User u = new User();
    //		u.setUsername("小明");
    //		u.setSex("1");
    		vo.setUser(u);
    		
    		List<User> list = mapper.findUsersByNameAndSex(vo);
    		
    		for(User user : list){
    			System.out.println(user);
    		}
    		
    		sqlSession.close();
    	}

    此时发出的Sql语句:  SELECT * FROM user

    去掉注释发出的Sql语句是:

    Preparing: SELECT * FROM user WHERE username LIKE '%小明%' AND sex = ?
    Parameters: 1(String)

    2.sql片段

         SQL片段的功能可以提高Sql的可重用性。

    (1)定义

    <!-- Sql片段: 可以将sql中任何部分放到sql片段中 建议: 不要将sql中的关键字放进去,比如 select where -->
    <sql id="whereClause">
        <if test="user != null">
    
            <if test="user.username != null and user.username != ''">
                AND username LIKE '%${user.username}%'
            </if>
    
            <if test="user.sex != null and user.sex != ''">
                AND sex = #{user.sex}
            </if>
    
        </if>
    </sql>

    (2)引用SQL片段

    <!-- 标签的使用 -->
        <select id="findUsersByNameAndSex" parameterType="userQueryVo" resultType="user">
            SELECT * FROM user
    
            <!--wher标签:将后面第一个AND去掉,如果没有条件则把自己去掉 -->
            <where>
                <!-- refid: Sql片段的ID -->
                <include refid="whereClause"></include>
    
            </where>
    
        </select>

    3.foreach标签

        向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到Sql中。

    UserMapper.xml

    image

    UserMapper.java

    image

    Test.java

    image

    输出的sql语句:

    Preparing: SELECT * FROM user WHERE id IN ( ? , ? , ? , ? )
    Parameters: 29(Integer), 31(Integer), 32(Integer), 33(Integer)

  • 相关阅读:
    MFC中char*,string和CString之间的转换(待补充)
    Gem/Bundle/Rvm
    Ruby开发入门
    Maven原型骨架及常见问题
    Nginx Upstream模块源码分析(上)
    mysqldump的几个主要选项探究
    探索Antlr(Antlr 3.0更新版)
    Maven2插件开发入门
    说说家乡的互联网-沈阳
    Nginx模块之SessionSticky
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5634712.html
Copyright © 2011-2022 走看看