MyBatis-动态SQL语句--基于注解方式

说明

复制《mybatis-crul(增删改查)》代码。删除UserMapper.xml文件

第一步:修改mybatis-config.xml

<!-- 配置映射文件 -->
  <mappers>
  	<mapper class="com.mybatis.mapper.UserMapper"/>
  </mappers>

第二步:创建动态Sql类

package com.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;

import com.mybatis.pojo.User;

/*
 * 	此类是专门为UserMapper提供动态sql语句的类
 * 	类中返回一个个String类的方法
 * 	返回的String就是拼接的sql动态语句
 * 
 */
public class UserSqlProvider {
	
	public String selectByCondition(User user) {
		SQL sql=new SQL();
		sql.SELECT("*");//相当于:select *
		sql.FROM("user");//相当于: from user
		if (user.getUsername()!=null) {
			sql.WHERE("username like concat('%',#{username},'%')");
		}
		//使用sql语句拼接多条件默认是and关系
		//可以手动指定or关系。在两个条件的下一个条件内使用sql.OR();
		if (user.getAge()!=null) {
			sql.OR();
			sql.WHERE("age = #{age}");
		}
		System.out.println("sql语句:"+sql.toString());
		return sql.toString();
	}
	
	public String selectTotalByCondition(User user) {
		SQL sql=new SQL();
		sql.SELECT("count(*)");//相当于:select *
		sql.FROM("user");//相当于: from user
		if (user.getUsername()!=null) {
			sql.WHERE("username like concat('%',#{username},'%')");
		}
		//使用sql语句拼接多条件默认是and关系
		//可以手动指定or关系。在两个条件的下一个条件内使用sql.OR();
		if (user.getAge()!=null) {
			sql.OR();
			sql.WHERE("age = #{age}");
		}
		System.out.println("sql语句:"+sql.toString());
		return sql.toString();
	}
	
	public String updateUserByNotNull(User user) {
		SQL sql=new SQL();
		sql.UPDATE("user");
		sql.SET("id=#{id}");
		if (user.getUsername()!=null) {
			sql.SET("username=#{username}");
		}
		if (user.getPassword()!=null) {
			sql.SET("password=#{password}");
		}
		if (user.getAge()!=null) {
			sql.SET("age=#{age}");
		}
		sql.WHERE("id=#{id}");
		return sql.toString();
	}
	//注意:一定要添加@Param
	public String deleteByIds(@Param("ids")Integer[] ids) {
		SQL sql=new SQL();
		sql.DELETE_FROM("user");
		StringBuffer sb=new StringBuffer();
		sb.append("id in (");
		for (int i = 0; i < ids.length; i++) {
			sb.append("#{ids["+i+"]},");
		}
		sb.deleteCharAt(sb.length()-1);
		sb.append(")");
		sql.WHERE(sb.toString());
		return sql.toString();
	}
	
	public String insertByBatch(@Param("users")List<User> users) {
		SQL sql=new SQL();
		//单行插入
//		sql.INSERT_INTO("user");
//		sql.VALUES("username", "#{username}");
//		sql.VALUES("password", "#{password}");
//		sql.VALUES("age", "#{age}");
		//多行插入
		StringBuffer sb=new StringBuffer();
		for (int i = 0; i < users.size(); i++) {
			sb.append("(#{users["+i+"].username},#{users["+i+"].password},#{users["+i+"].age}),");
		}
		sb.deleteCharAt(sb.length()-1);
		sql.INSERT_INTO("user(username,password,age) values"+sb.toString());
		return sql.toString();
	}
}

第三步:修改UserMapper.java

package com.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

import com.mybatis.pojo.User;

/*
 * 使用MyBatis的动态代理开发编写代码遵循四个原则
 *  1.映射文件的namespace命名空间的值必须是对应接口的全限定名
	2.映射文件的对应功能 id值必须等于映射接口中方法的名称
	3.映射文件的参数类型必须和接口中方法的参数类型一致
	4.映射文件查询的返回结果类型必须和接口的方法的返回数据类型一致,
		DML操作返回的受影响的行数,除外
 */
public interface UserMapper {

	/**
	 *  @SelectProvider(type = ,method=)
	 *	查询动态sql语句支持的注解
	 *	type:编写动态sql语句的类
	 *	method:编写动态sql语句类中的对应方法
	 * 
	 */
	@SelectProvider(type =UserSqlProvider.class ,method = "selectByCondition")
	List<User> selectByCondition(User user);
	
	
	@SelectProvider(type =UserSqlProvider.class ,method = "selectTotalByCondition" )
	Long selectTotalByCondition(User user);
	
	@UpdateProvider(type = UserSqlProvider.class,method = "updateUserByNotNull")
	int updateUserByNotNull(User user);
	
	@DeleteProvider(type = UserSqlProvider.class,method = "deleteByIds")
	int deleteByIds(@Param("ids")Integer[] ids);
	
	@InsertProvider(type = UserSqlProvider.class,method = "insertByBatch")
	int insertByBatch(@Param("users")List<User> users);

	
}


第四步:测试代码

package com.mybatis.test;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.User;
import com.mybatis.util.MyBatisUtil;

public class UserMapperTest {

	@Test
	public void testSelectByCondition() {
		// 1.创建SqlSession操作对象
		SqlSession session = MyBatisUtil.openSession();

		// 2.创建UserMapper接口的代理对象
		UserMapper userMapper = session.getMapper(UserMapper.class);

		User conditionUser = new User();
		conditionUser.setAge(30);
		//conditionUser.setUsername("龙");
		List<User> list = userMapper.selectByCondition(conditionUser);
		for (User user : list) {
			System.out.println(user);
		}

		// 3.关闭session
		session.close();
	}

	@Test
	public void testSelectTotalByCondition() {
		// 1.创建SqlSession操作对象
		SqlSession session = MyBatisUtil.openSession();

		// 2.创建UserMapper接口的代理对象
		UserMapper userMapper = session.getMapper(UserMapper.class);

		User conditionUser = new User();
		conditionUser.setAge(30);
		Long total = userMapper.selectTotalByCondition(conditionUser);
		System.out.println(total);
		// 3.关闭session
		session.close();
	}

	@Test
	public void testUpdateUserByNotNull() {
		// 1.创建SqlSession操作对象
		SqlSession session = MyBatisUtil.openSession();

		// 2.创建UserMapper接口的代理对象
		UserMapper userMapper = session.getMapper(UserMapper.class);

		User conditionUser = new User();
		conditionUser.setId(3);
		// conditionUser.setAge(23);
		// conditionUser.setAge(30);
		userMapper.updateUserByNotNull(conditionUser);

		// 3.提交事务
		session.commit();

		// 4.关闭session
		session.close();
	}

	@Test
	public void testDeleteByIds() {
		// 1.创建SqlSession操作对象
		SqlSession session = MyBatisUtil.openSession();

		// 2.创建UserMapper接口的代理对象
		UserMapper userMapper = session.getMapper(UserMapper.class);

		Integer[] ids = { 47, 48, 49, 50 };
		userMapper.deleteByIds(ids);

		// 3.提交事务
		session.commit();

		// 4.关闭session
		session.close();
	}

	@Test
	public void testInsertByBatch() {
		// 1.创建SqlSession操作对象
		SqlSession session = MyBatisUtil.openSession();

		// 2.创建UserMapper接口的代理对象
		UserMapper userMapper = session.getMapper(UserMapper.class);

		List<User> list=new ArrayList<User>();
		User user=null;
		for (int i = 0; i < 10; i++) {
			user=new User(null,"admin_"+i,"enen",23);
			list.add(user);
		}
		int row = userMapper.insertByBatch(list);
		System.out.println("受影响行数:"+row);

		// 3.提交事务
		session.commit();

		// 4.关闭session
		session.close();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值