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();
}
}