MyBatis學習總結(三)---面向接口編程

     1.示例項目目錄:

        

         

       2.相關接口和映射文件之間的規則

         (1) 在mapper.xml中將namespace設置爲對應的mapper.java(Dao接口)的全限定名 。如:

            

    
         (2) 將mapper.java接口的方法名和mapper.xml中statement的id保持一致。 
         (3) 將mapper.java接口的方法輸入參數類型和mapper.xml中statement的parameterType保持一致 
         (4) 將mapper.java接口的方法輸出 結果類型和mapper.xml中statement的resultType保持一致

     

       3.Dao 接口不需要實現類

     MyBatis在採用面向接口編程時,採用實體+接口+映射文件的方式。其中接口是不需要實現類的。

     因爲Mybatis 提供了 Mapper接口的代理對象(mybatis通過JDK的動態代理方式,在啓動加載配置文件時,根據配置mapper的xml去生成Dao的實現,session.getMapper()使用了代理,當調用一次此方法,都會產生一個代理class的instance。),在執行 Mapper接口方法時,實際執行的是Mybatis的代理對象,代理對象在 invoke 方法內獲取 Mapper接口類全名+方法全名 作爲statement的ID,然後通過ID去Statement匹配註冊的SQL,然後使用 SqlSession 執行這個 SQL。所以,這也解釋了爲什麼Mybatis映射文件需要 namespace 和 id , 前者是類全名,後者是方法名。

 

      4.具體示例

        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 + "]";
	}

}

          userMapper.xml(實體映射文件)

         

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mybatisstudy.dao.IUserDao">
	<select id="selectAllUser"
		resultType="com.mybatisstudy.model.User">
		SELECT * FROM user ;
	</select>
	
	<select id="selectUserById" parameterType="int" 
		resultType="com.mybatisstudy.model.User">
		SELECT * FROM user where id = #{id} ;
	</select>

	<insert id="addUser" parameterType="com.mybatisstudy.model.User">
		INSERT INTO user(id,name,sex,age) VALUES(#{id},#{name},#{sex},#{age});
	</insert>

	<delete id="deleteUserById" parameterType="com.mybatisstudy.model.User">
		DELETE FROM user WHERE id=#{id};
	</delete>
	
	
	<update id="updateUser" parameterType="com.mybatisstudy.model.User">
		UPDATE user SET age=#{age} ,name=#{name}  WHERE id=#{id}
	</update>

</mapper>

       IUserDao.java(Dao  接口)

    

package com.mybatisstudy.dao;

import java.util.List;


import com.mybatisstudy.model.User;


public interface IUserDao {
   public List<User> selectAllUser();
   public User selectUserById(int id);
   public int addUser(User user);
   public int deleteUserById(int id);
   public int updateUser(User user);
}

      TestUser.java(單元測試類)

    

package com.mybatisstudy.test;

import static org.junit.jupiter.api.Assertions.*;

import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
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 org.junit.Assert;
import com.mybatisstudy.dao.IUserDao;
import com.mybatisstudy.model.User;

class TestUser {
	static SqlSessionFactory factory;
	static SqlSession session;
	IUserDao userDao;

	@BeforeAll
	static void setUpBeforeClass() throws Exception {
		String resource = "mybatisconf.xml";
		factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
		session = factory.openSession();
	}

	@AfterAll
	static void tearDownAfterClass() throws Exception {
		if (session != null) {
			session.close();
		}
		session = null;
		factory = null;
	}

	@BeforeEach
	void setUp() throws Exception {
	}

	@AfterEach
	void tearDown() throws Exception {
	}

	@Test
	void testSelectAllUser() {
		// 採用了實體+接口+映射文件的方式,在IUserDao中並沒有實現selectAllUser方法,而在映射文件中進行了實現
		IUserDao userDao = session.getMapper(IUserDao.class);
		List<User> users = userDao.selectAllUser();
		System.out.println(users);
	}

	@Test
	void testSelectUserById() {
		IUserDao userDao = session.getMapper(IUserDao.class);
		int userId = 1001;
		User user = userDao.selectUserById(userId);
		System.out.println(user);
	}

	@Test
	void testAddUser() {
		IUserDao userDao = session.getMapper(IUserDao.class);
		User user = new User(1003, "小杰", "男", 20);
		int line = userDao.addUser(user);
		// 使用斷言
		// assertEquals 如果預期值與真實值相等,則運行success,反之Failure
		Assert.assertEquals(1, line);
	}

	@Test
	void testUpdateUser() {
		IUserDao userDao = session.getMapper(IUserDao.class);
		User user = new User(1003, "小明", "男", 21);
		int line = userDao.updateUser(user);
		Assert.assertEquals(1, line);
	}

	@Test
	void testDeleteUserById() {
		IUserDao userDao = session.getMapper(IUserDao.class);
		int line = userDao.deleteUserById(1003);
		Assert.assertEquals(1, line);
	}

}

    mybatisconf.xml(MyBatis配置文件)

 

<?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/dao/userMapper.xml" />
	</mappers>
</configuration>

    db.properties(數據庫配置信息)

  

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisstudy?useUnicode=true&characterEncoding=utf8
username=root
password=

 

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