在最初設計時,MyBatis是一個XML驅動的框架。配置信息是基於XML的,而且映射語句也是定義在XML中的。所以之前基本都採用XML的方式來配置信息,而到了MyBatis3,有新的可用的選擇了。MyBatis3構建在基於全面而且強大的Java配置API之上。這個配置API是基於XML的MyBatis配置的基礎,也是新的基於註解配置的基礎。註解提供了一種簡單的方式來實現簡單映射語句,而不會引入大量的開銷。
回顧基於XML方式實現CRUD操作,可看:https://blog.csdn.net/qq_40348465/article/details/84309345
基於註解方式實現CRUD操作示例:
1.項目目錄如:
2.定義sql映射的接口,如下:
這是基於註解的方式,所以需要建立一個接口,並在定義的方法上配置上應有的註解,註解中含有sql語句,需要提示的是這個接口不需要類去實現它
package com.mybatisstudy.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.mybatisstudy.model.User;
public interface IUserDao {
@Select("SELECT * FROM user ;")
public List<User> getAllUser();
@Select("SELECT * FROM user where id = #{id} ;")
public User getUserById(int id);
@Insert("INSERT INTO user(id,name,sex,age) VALUES(#{id},#{name},#{sex},#{age});")
public int addUser(User user);
@Update("UPDATE user SET age=#{age} ,name=#{name} WHERE id=#{id} ;")
public int updateUser(User user);
@Delete("DELETE FROM user WHERE id=#{id};")
public int deleteUser(int id);
}
3.在MyBatis的xml配置文件中註冊這個映射接口,如:
<mappers>
<!-- 配置實體映射文件 -->
<mapper class="com.mybatisstudy.mapper.IUserDao" />
</mappers>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引用並使用db.properties -->
<properties resource="db.properties" />
<!-- environments:信息配置的是連接數據庫的(數據源的)一些參數,如用戶名,密碼等,MyBatis數據庫操作的session就是根據這些信息初始化的-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 數據源配置 -->
<dataSource type="POOLED">
<!-- 數據庫驅動 -->
<property name="driver" value="${driver}" />
<!-- 數據庫連接URL -->
<property name="url" value="${url}"/>
<!-- 數據庫用戶名和密碼 -->
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- mappers:配置的是一個個Mapper文件,這些文件來約束數據庫的信息(Relationship) 和 對象(Object)的信息映射(Mapper);它負責完成對象和數據庫表的映射,是ORM最具體的配置-->
<!-- <mappers>
配置實體映射文件
<mapper resource="com/mybatisstudy/mapper/userMap.xml" />
</mappers> -->
<!-- 改爲用註解的方式,需要註冊IUserDao映射接口 -->
<mappers>
<!-- 配置實體映射文件 -->
<mapper class="com.mybatisstudy.mapper.IUserDao" />
</mappers>
</configuration>
4.單元測試類如下:
package com.mybatisstudy.test;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.mybatisstudy.mapper.IUserDao;
import com.mybatisstudy.model.User;
import com.mybatisstudy.util.MybatisUtil;
class TestUserDao {
static IUserDao userDao;
static SqlSession session;
@BeforeAll
static void setUpBeforeClass() throws Exception {
session = MybatisUtil.getSession();
userDao = session.getMapper(IUserDao.class);
}
@AfterAll
static void tearDownAfterClass() throws Exception {
session.close();
}
@BeforeEach
void setUp() throws Exception {
}
@AfterEach
void tearDown() throws Exception {
session.commit();
}
@Test
void testGetAllUser() {
List<User> users = userDao.getAllUser();
System.out.println(users);
}
@Test
void testGetUserById() {
session = MybatisUtil.getSession();
userDao = session.getMapper(IUserDao.class);
User user = userDao.getUserById(1001);
System.out.println(user);
}
@Test
void testAddUser() {
User user = new User(1003, "小杰", "男", 20);
int line = userDao.addUser(user);
// 使用斷言
// assertEquals 如果預期值與真實值相等,則運行success,反之Failure
Assert.assertEquals(1, line);
}
@Test
void testUpdateUser() {
User user = new User(1003, "小明", "男", 21);
int line = userDao.updateUser(user);
Assert.assertEquals(1, line);
}
@Test
void testDeleteUser() {
int userId = 1003;
int line = userDao.deleteUser(userId);
Assert.assertEquals(1, line);
}
}
5.MybatisUtil類(用於產生sqlsession)如下:
package com.mybatisstudy.util;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil {
static SqlSessionFactory factory;
static {
String resource = "mybatisconf.xml";
try {
if(factory==null) {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
}
}catch(IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
return factory.openSession();
}
}
6.數據庫信息的配置文件 db.properties文件如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisstudy?useUnicode=true&characterEncoding=utf8
username=root
password=
7.User實體類如下:
package com.mybatisstudy.model;
public class User {
private int id;
private String name;
private String sex;
private int age;
public User() {
super();
}
public User(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public User(int id, String name, String sex, int age) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "[id:" + id + ",name:" + name + ",sex:" + sex + ",age:" + age + "]";
}
}