一、瞭解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);
}
}
✿ 獲取主鍵的作用
---註冊時,一次性填寫過多資訊,不友好,分成兩次填寫唄【獲取主鍵,將其傳遞給第二個填寫註冊資訊介面】