学习MyBatis必知必会(7)~注解开发、动态SQL


一、MyBatis的注解开发

  • 开发中推荐是使用xml文件配置

1、配置映射关系【使用注解的方式】:

 

   	
	
		
		
	
  

2、通过注解,把sql和映射写到Mapper接口:

public interface UserMapper {

	@Insert("insert into t_user (name, salary) values (#{name}, #{salary});")
	@Options(useGeneratedKeys = true,keyProperty = "id")
	void save(User user);
	
	@Delete("delete from t_user where id = #{id};")
	void delete(Long id);
	
	@Update("update t_user set name = #{name}, salary = #{salary} where id = #{id};")
	void update(User user);
//	void update(User user, Long id);//错误:myBatis默认只能传递一个参数
	
	@Select("select id u_id, name as u_name, salary u_salary from t_user where id = #{id}")
	@Results(id="BaseResultMap", value= {
			@Result(column = "u_id",property = "id"),
			@Result(column = "u_name",property = "name"),
			@Result(column = "u_salary",property = "salary")
	})
	User get(Long id);
	
	@Select("select id u_id, name as u_name, salary u_salary from t_user")
	@ResultMap("BaseResultMap")
	List getListAll();
}

3、测试(这里以测试查询为例):

	/* 测试查询 */
	@Test
	public void testGet() throws IOException {
		SqlSession session = MyBatisUtil.getSession();
		UserMapper userMapper = session.getMapper(UserMapper.class);
		User user = userMapper.get(2L);
		System.out.println(user);
		//5、关闭资源
		session.close();
	}



二、动态SQL 【类似JSTL(java标准标签库)语法】

  • if

  • choose (when, otherwise)

  • trim (where, set)

  • foreach

  • 其他(bind,sql,include)

1、if 举例:

  
  
  • 细节:在xml中 小于符合不能直接输入 < , 会被当做标签的开始标志,需要使用转义符号 <;

  • 防止第一个查询条件是null,加上 where 1=1,然后其他查询条件接着and 写。


2、choose (when, otherwise) 举例:

 
 

3-1、trim (where, set)- where 举例:

  • 解决sql拼接查询条件时第一个条件为null,而加上 where 1=1,导致不能进行索引查询,影响性能。

  • where 元素:判断查询条件是否有where关键字,若没有,则第一个查询条件之前要插入 where

    ​ 若发现查询条件是以and/or开头,则会把第一个查询条件前的and/or 替换成 where

  
  

3-2、trim (where, set)-set 举例:

  • 和where 类似,动态去掉最后一个逗号

  update Author
    
      username=#{username},
      password=#{password},
      email=#{email},
      bio=#{bio}
    
  where id=#{id}

3-3、trim (where, set)-trim :


	

prefix – 在这个字符串之前插入 prefix 属性值。

prefixOverrides – 并且字符串的内容以 prefixOverrides 中的内容开头(可以包含管道符号),那么使用 prefix 属性值替换内容的开头。

suffix – 在这个字符串之后插入 suffix 属性值。

suffixOverrides –并且字符串的内容以 suffixOverrides 中的内容结尾(可以包含管道符号),那么使用 suffix 属性值替换内容的结尾。

  • 使用 where 等价于: 注意:此时 AND 后面有一个空格。

  • 使用 set 等价于:


4、foreach 举例1:

/* Mapper接口 */
void batchDelete(@Param("ids")List ids);



 
  
  	delete from employee where id in
  	
  		#{id}
  	
  

■ foreach 举例2:

/* Mapper接口 */
void batchSave(@Param("emps")Listemps);

  
  
  	insert into employee (name, sn, salary) values 
  	
  		(#{e.name}, #{e.sn}, #{e.salary})
  	
  

5、其他(bind,sql,include) 举例-高级分页查询:

■ sql,include 的例子:



	
		
			
				
				
				and (name like concat('%', #{keyword}, '%') or sn like concat('%', #{keyword}, '%'))
			
			
				and salary >= #{minSalary}
			
			
				and salary <= #{maxSalary}
			
			
				and deptId = #{deptId}
			
		
	
	
	

	


■ bind(跟concat一样是用于拼接字符串) 的例子:


	
	
	
    
	
			and (name like #{keywordLike} or sn like #{keywordLike})

你可能感兴趣的:(学习MyBatis必知必会(7)~注解开发、动态SQL)