MyBatis註解方式增刪查改及實現動態SQL的條件查詢,批量刪除/插入

MyBatis的註解開發

MyBatis提供了下面註解進行映射文件配置
  @Select 查詢數據註解
  @Insert 插入數據註解
  @Delete 刪除數據註解
  @Update 修改數據註解
  @Options 選項配置
  @Results 手動映射配置
  @Result : @results中的具體的某一列的映射信息配置

主配置文件 mybatis-config.xml

  <!-- xml 約束,約束下面可以使用那些標籤 (元素)-->
<?xml version="1.0" encoding="UTF-8" ?><!-- xml聲明,固定語法 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

  
  
  <!-- 
  	開啓Mybatis的配置
  	<configuration> 根元素,任何html文件都有一個根元素
   -->
<configuration>

	<!--  讀取數據庫配置文件 -->
	<properties resource="db.properties"/>
	
	<!-- 設置 -->
	<settings> 
		<!-- 開啓支持駝峯命名法 -->
		 <setting name="mapUnderscoreToCamelCase" value="true"/> 
		
	 </settings>

	<!-- 配置別名 -->
		<typeAliases>
			<!-- 配置單個別名 -->
			<typeAlias type="com.ywq.mybatis.pojo.User" alias="User"/>
			
			<!-- 使用包掃描配置別名,包下面所有pojo類都回設置別名,簡單類名首字母變小寫(不區分大小寫) -->
			<package name="com.ywq.mybatis.pojo"/>
		</typeAliases>
	
	<!-- 
		配置Mybatis的環境
		<environments default="mysql">
			default:默認的環境,值就是內部<environment id="mysql">的id值
	 -->
  <environments default="mysql">
  
  	<!-- 	
		具體環境標識
		<environment id="mysql">
			id:當前環境唯一標識 見名知意
	 -->
    <environment id="mysql">
    
    	<!-- 事務管理器(操作數據庫有事務概念),使用默認JDBC (MyBatis底層就是封裝原生JDBC)事務 -->
      <transactionManager type="JDBC"/>
      
      <!-- 配置數據域(連接池)
      		<dataSource type="POOLED">
      			type:數據域類型POOLED,MyBatis內置的一個數據域
      			使用框架開發連接數據全部都是使用數據源連接,使用阿里巴巴連接池,Apache的DBCP連接池(和Spring框架集成詳細配置)
       -->
      <dataSource type="POOLED">
      
     	 <!-- 數據庫驅動 -->
        <property name="driver" value="${driverClassName}"/>
        <!-- 連接數據庫url地址 -->
        <property name="url" value="${url}"/>
        <!-- 數據庫賬號 -->
        <property name="username" value="${username}"/>
        <!-- 數據庫密碼 -->
        <property name="password" value="${password}"/>
        
      </dataSource>
    </environment>
  </environments>
  
  <!-- 配置MyBatis的映射文件 -->
  <mappers>
   
   <!-- 配置映射接口 -->
   <!-- <mapper class="接口的全限定名"/> -->
   <mapper class="com.ywq.mybatis.mapper.UserMapper"/>
  </mappers>
</configuration>

pojo類代碼

package com.ywq.mybatis.pojo;

public class User {
	private Integer id ;
	private String name;
	private String password;
	private Integer age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public User(Integer id, String name, String password, Integer age) {
		super();
		this.id = id;
		this.name = name;
		this.password = password;
		this.age = age;
	}
	public User() {
		super();
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]";
	}
	
	
}

Mapper接口代碼

package com.ywq.mybatis.mapper;

import java.util.List;

import javax.annotation.Resource;
import javax.annotation.Resources;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.ywq.mybatis.pojo.User;


/*
 *mybatis的映射接口
 * */
public interface UserMapper {
		
	// DML :增刪改
	@Insert("insert into user (name,password,age)values(#{name},#{password},#{age})")
	int insert(User user);
	
	@Delete("delete from user where id = #{id}")
	int deleteByPrimaryKey(Integer id);
	
	@Update("update user set name = #{name},password=#{password},age=#{age} where id =#{id}")
	int updateByPrimaryKey(User user);
	
	//DQL : 查詢
	@Select("select * from user where id = #{id}")
	User selectByPrimaryKey(Integer id);
	
	@Results({
		
		@Result(id = true,column = "u_id",property = "id"),
		@Result(column = "u_name",property = "name"),
		@Result(column = "u_password",property = "password"),
		@Result(column = "u_age",property = "age")
		
	})
	@Select("select id u_id,name u_name,password u_password, age u_age from user")
	List<User> selectLits();
}

測試代碼

package com.ywq.mybatis.test;

import static org.junit.Assert.*;

import java.util.List;

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

import com.ywq.mybatis.mapper.UserMapper;
import com.ywq.mybatis.pojo.User;
import com.ywq.mybatis.util.MyBatisUtils;

public class MyBatisTest {
	
	@Test
	public void testInert() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		//2.創建UserMapper映射接口的動態代理對象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		System.out.println(userMapper.getClass().getName());
		
		//3.執行insert方法
		User user = new User(null, "jocn", "2020", 33);
		
		int row = userMapper.insert(user);
		System.out.println("受影響的行數:"+row);
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
	}
	
	@Test
	public void testUpdate() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		
		//2.創建UserMapper映射接口的動態對立對象
		UserMapper mapper = session.getMapper(UserMapper.class);
		
		//3.執行修改方法
		
		User user = new User(6, "都邦", "5161", 25);
		int row = mapper.updateByPrimaryKey(user);
		
		System.out.println("受影響行數"+row);
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
		
	}
	
	@Test
	public void testDelete() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		
		//2.創建UserMapper映射接口的動態對立對象
		UserMapper mapper = session.getMapper(UserMapper.class);
		
		//3.執行刪除方法
		
		int row = mapper.deleteByPrimaryKey(11);
		
		System.out.println("受影響行數"+row);
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
		
	}
	
	@Test
	public void testSelectOne() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		
		//2.創建UserMapper映射接口的動態對立對象
		UserMapper mapper = session.getMapper(UserMapper.class);
		
		//3.執行單行查詢方法
		
		User user = mapper.selectByPrimaryKey(5);
		
		System.out.println(user);
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
		
	}
	
	@Test
	public void testSelectList() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		
		//2.創建UserMapper映射接口的動態對立對象
		UserMapper mapper = session.getMapper(UserMapper.class);
		
		//3.執行查詢方法
		
		List<User> users = mapper.selectLits();
		for (User user : users) {
			System.out.println(user);
			
		}
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
		
	}
}



動態SQL的Mapper接口代碼

package com.ywq.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.ywq.mybatis.pojo.User;


/*
 *mybatis的映射接口
 * */
public interface UserMapper {
	
	/*
	 * 查詢動態SQL語句的註解
	 * @SelectProvider(type = ,method=)
	 * type=編寫動態SQL語句的字節碼(專門編寫動態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);
}

動態SQL實現類代碼

package com.ywq.mybatis.mapper;

import java.util.List;

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

import com.ywq.mybatis.pojo.User;

/*
 *專門編寫動態sql語句的類
 *
 * 提供一個返回Strin字符串的方法
 * 
 * 方法內部就是編寫動態SQL語句
 * */
public class UserSqlProvider {

	/*
	 * 此方法就是編寫條件查詢動態SQL語句方法
	 * 
	 * */
	
	public  String selectByCondition(User user) {
		/*
		 * SQL:MyBatis專門封裝用於拼接SQL語句的類
		 * */
		
		SQL sql = new SQL();
		sql.SELECT("*");//select *
		sql.FROM("user");//from user
		
		if (user.getName() != null) {
			sql.WHERE("name like concat('%',#{name},'%')");
		}
		//默認多條件之間是AND關係
		if (user.getAge() !=null) {
			//讓條件變爲OR關係
			sql.OR();
			sql.WHERE("age = #{age}");
			
		}
		
		return sql.toString();
		
	}
	
	public String selectTotalByCondition(User user) {
		/*
		 * SQL:MyBatis專門封裝用於拼接SQL語句的類
		 * */
		
		SQL sql = new SQL();
		sql.SELECT("count(*)");//select *
		sql.FROM("user");//from user
		
		if (user.getName() != null) {
			sql.WHERE("name like concat('%',#{name},'%')");
		}
		//默認多條件之間是AND關係
		if (user.getAge() !=null) {
			//讓條件變爲OR關係
			sql.OR();
			sql.WHERE("age = #{age}");
			
		}
		
		return sql.toString();
		
	}
	
	
	public String updateUserByNotNull(User user) {
		// 創建SQL對象
		SQL sql = new SQL();
		sql.UPDATE("user"); //update user
		
		if (user.getName() != null) {
			sql.SET("name = #{name}");//set name = #{name}
		}
		
		if (user.getPassword() != null) {
			sql.SET("password = #{password}");// set password = #{password}
		}
		
		if (user.getAge() != null) {
			sql.SET("age = #{age}"); // set age = #{age}
		}
		
		sql.WHERE("id= #{id}");// where id =#{id}
		return sql.toString();
	}
	
	public String deleteByIds(@Param("ids")Integer[] ids) {
		
		/*
		 * SQL對象並不能滿足所有的業務需求,只能拼接完成常見比較簡單的動態SQL
		 * 如果是比較複雜業務需求,還需要開發者自己拼接SQL
		 * 	如:批量刪除,批量插入
		 * 
		 * */
		
		//delete from user where id in(?,?,?)
		SQL sql = new SQL();
		sql.DELETE_FROM("user"); // delete from user
		
		//拼接條件: (#{ids[0]},#{ids[1]},#{ids[2]})
		StringBuilder sb = new StringBuilder();
		sb.append("(");
		for (int i = 0; i < ids.length; i++) {
			sb.append("#{ids["+i+"]},");
		}
		//刪除最後一個多餘的逗號
		sb.deleteCharAt(sb.length()-1);
		sb.append(")");
		System.out.println(sb.toString());
		//條件
		sql.WHERE("id in"+sb.toString());
		System.out.println("SQL:"+sql.toString());
		return sql.toString();
		
	}
	
	public String insertByBatch(@Param("users")List<User> users) {
		/*
		 * SQL語句:
		 * insert into user(name,password,age)values
 		 *	('張三','sda',25)
 		 *	('李四','dfga',55)
 		 *	('王五','hda',15)
		 * 
		 * */
		
		StringBuffer sb = new StringBuffer();
		
		sb.append("insert into user(name,password,age)values");
		
		for (int i = 0; i < users.size(); i++) {
			sb.append("(#{users["+i+"].name},#{users["+i+"].password},#{users["+i+"].age}),");
		}
		
		//刪除最後一個多餘的逗號
		sb.deleteCharAt(sb.length()-1);
		return sb.toString();
		
		
	}
	
}

測試代碼

package com.ywq.mybatis.test;

import static org.junit.Assert.*;

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

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

import com.ywq.mybatis.mapper.UserMapper;
import com.ywq.mybatis.pojo.User;
import com.ywq.mybatis.util.MyBatisUtils;

public class MyBatisTest {
	
	@Test
	public void testSelectOne() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		//2.創建UserMapper映射接口的動態代理對象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		
		//3.執行條件查詢方法
		User user = new User();
		user.setName("李");
		user.setAge(20);
		
		List<User> users = userMapper.selectByCondition(user);
		
		for (User user2 : users) {
			System.out.println(user2);
		}
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
	}
	
	
	@Test
	public void testSelect() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		//2.創建UserMapper映射接口的動態代理對象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		
		//3.執行條件查詢總數方法
		User user = new User();
		//user.setName("李");
		user.setAge(25);
		
		Long users = userMapper.selectTotalByCondition(user);
		System.out.println(users);
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
	}
	
	
	@Test
	public void testUpdate() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		//2.創建UserMapper映射接口的動態代理對象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		
		//3.執行修改方法
		User user = new User();
		user.setId(7);
		user.setName("dd");
		
		int row = userMapper.updateUserByNotNull(user);
		System.out.println(row);
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
	}
	
		
	
	@Test
	public void testDelete() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		//2.創建UserMapper映射接口的動態代理對象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		
		//3.執行批量刪除方法
		Integer [] ids = {6,7};
		userMapper.deleteByIds(ids);
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
	}
	
	
	@Test
	public void testInsert() throws Exception {
		
		//1.創建SqlSession對象
		SqlSession session = MyBatisUtils.openSession();
		//2.創建UserMapper映射接口的動態代理對象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		
		//3.執行批量插入方法
		List<User> users = new ArrayList<>();
		
		for (int i = 1; i <=5; i++) {
			User user = new User(null, "猴子"+i, "houzi"+i, i);
			users.add(user);
		}
		
		int row = userMapper.insertByBatch(users);
		System.out.println("受影響行數"+row);
		
		//4.MyBatis默認需要手動提交事務
		session.commit();
		
		//5.關閉session(釋放資源)
		session.close();
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章