學習MyBatis必知必會(5)~瞭解myBatis的作用域和生命週期並抽取工具類MyBatisUtil、mybatis執行增刪改查操作

一樂樂發表於2022-02-02

一、瞭解myBatis的作用域和生命週期[錯誤的使用會導致非常嚴重的併發問題]

(1)SqlSessionFactoryBuilder

[ 作用:僅僅是用來建立SqlSessionFactory,作用域:方法作用域(區域性變數) ]

(2)SqlSessionFactory(類似連線池)

[ 生命週期:一旦被建立就應該在應用的執行期間一直存在,作用域:應用作用域變數(使 用單例模式/靜態單例模式) ]

(3)SqlSession(類似連線物件)

[ 特點:非執行緒安全,不能共享,作用域:請求或方法作用域(區域性變數) ]



二、抽取MyBatis工具類[用來建立Sqlsession]

✿ 在理解myBatis的作用域和生命週期基礎上,抽取MyBatis工具類:

public class MyBatisUtil {
	//建立一個sqlSessionFactory物件【應用物件(靜態單例模式)】
	private static SqlSessionFactory factory = null;
	
	static {
		try {
			InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
			factory = new SqlSessionFactoryBuilder().build(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	//返回sqlSession物件
	public static SqlSession getSession() {
		return factory.openSession();
	}
}
  • 通過factory.openSession() 預設是不提交事務的方式,當修改了物件的屬性之後,發現資料庫的表的記錄的列值沒有改變----因為預設是不提交事務,需要手動提交事務

    //手動提交事務
    session.commit();
    



三、mybatis執行增刪改查操作:

1、mybatis的對映檔案[UserMapper.xml] 編寫增刪改查sql

【 把sql存放到insert|update|delete|select 元素中去】

  <mapper namespace="com.shan.hello.UserMapper">
  	  <!-- 儲存操作 -->
	  <insert id="insert">
	  	insert into t_user (name, salary) values (#{name}, #{salary});
	  </insert>

	  <!-- 儲存操作,並設定返回自動生成的主鍵【useGeneratedKeys、keyProperty】
	  	useGeneratedKeys:是否需要返回自動生成的主鍵     keyProperty:把自動生成的主鍵設定到物件的哪個屬性(OID)
	   -->
	  <insert id="keyInsert" useGeneratedKeys="true" keyProperty="id">
	  	insert into t_user (name, salary) values (#{name}, #{salary});
	  </insert>

	  <!-- 刪除操作 -->
	  <delete id="delete">
	  	delete from t_user where id = #{id};
	  </delete>

	  <!-- 更改操作 -->
	  <update id="update">
	  	update t_user set name = #{name}, salary = #{salary} where id = #{aid}; 
	  </update>

  	  <!-- 查詢操作 -->
	  <select id="get" parameterType="java.lang.Long" resultType="com.shan.hello.User">
	    select * from t_user where id = #{id}
	  </select>

	  <select id="getList" parameterType="java.lang.Long" resultType="com.shan.hello.User">
	    select * from t_user;
	  </select>
</mapper>

2、測試mybatis的增刪改查:

	/* 測試查詢 */
	@Test
	public void testGetList3() {
		//jdk7try-finally結構的另外一種寫法,將關閉資源的finally部分內容放大try後邊的括號內容
		try(SqlSession session = MyBatisUtil.getSession();){
			//4、進行資料庫操作(CRUD)
			User user = session.selectOne("com.shan.hello.UserMapper.get", 2L);
		}
	}

	/* 測試更改 */
	@Test
	public void testUpdate() {
		User user = new User();
		user.setId(4L);
		user.setName("好賤");
		user.setSalary(new BigDecimal(100));

		//jdk7try-finally結構的另外一種寫法,將關閉資源的finally部分內容放大try後邊的括號內容
		try(SqlSession session = MyBatisUtil.getSession();){
			//4、進行資料庫操作(CRUD)
			int rows = session.update("com.shan.hello.UserMapper.update", user);
			session.commit();
		}
	}

	/* 測試刪除 */
	@Test
	public void testDelete() {
		//jdk7try-finally結構的另外一種寫法,將關閉資源的finally部分內容放大try後邊的括號內容
		try(SqlSession session = MyBatisUtil.getSession();){
			//4、進行資料庫操作(CRUD)
			int rows = session.delete("com.shan.hello.UserMapper.delete", 4L);
			session.commit();
		}
	}

	/* 測試儲存 */
	@Test
	public void testInsert() {
		User user = new User();
		user.setName("就是賤");
		user.setSalary(new BigDecimal(1));
		//jdk7try-finally結構的另外一種寫法,將關閉資源的finally部分內容放大try後邊的括號內容
		try(SqlSession session = MyBatisUtil.getSession();){
			//4、進行資料庫操作(CRUD)
			int rows = session.insert("com.shan.hello.UserMapper.insert", user);
			session.commit();
			System.out.println(user);
		}
	}

	/* 測試儲存(獲取自動生成的主鍵) */
	@Test
	public void testKeyInsert() {
		User user = new User();
		user.setName("賤");
		user.setSalary(new BigDecimal(1));
		//jdk7try-finally結構的另外一種寫法,將關閉資源的finally部分內容放大try後邊的括號內容
		try(SqlSession session = MyBatisUtil.getSession();){
			//4、進行資料庫操作(CRUD)
			int rows = session.insert("com.shan.hello.UserMapper.keyInsert", user);
			session.commit();
			System.out.println(user);
		}
	}

✿ 獲取主鍵的作用

---註冊時,一次性填寫過多資訊,不友好,分成兩次填寫唄【獲取主鍵,將其傳遞給第二個填寫註冊資訊介面

相關文章