mybatis入門截圖二
--------------------
線程不安全問題
首先明白什麽是線程不安全:
舉例:struts2中,每個action中都定義了model模型對象(action類中是全局對象的存在 數據域屬性) 用於封裝前端頁面提交過來的數據 所以就造成了struts2是非線程安全的,
即struts2不能使用單例模式,而只能使用多例模式,因為:當進行多線程並發請求的時候 多個線程會共用一個成員變量的值(例如兩個用戶請求action時 他們的數據就會有問題)
所以為了解決這個問題 struts2自然就成了多例模式的存在(註解方式配置action時 @Scope(prototype))
所以這句話就可以解釋了
----------------------------------------
問題的引出:使用原始的方式開發dao
實現類:
package org.mybatis.dao; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.po.User; public class UserDaoImpl implements UserDao {//通過構造註入SqlSessionFactory private SqlSessionFactory sqlSessionFacory; public UserDaoImpl(){ } public UserDaoImpl(SqlSessionFactory sqlSessionFacory){ this.sqlSessionFacory=sqlSessionFacory; } //問題1:因為sqlSession是非線程安全的 所以不能把sqlSession創建成全局變量 而只能寫在每個方法體內 這就造成了問題2的產生//問題2:這裏面把sqlSession在每個方法中都進行了一次創建 以及事務提交 SQLSession關閉 出現大量重復代碼 唯獨不 //同的就是 執行的語句不同 //3.解決問題2的方法 就是使用代理模式 在執行真正的增刪改查之前 先執行這些公共的代碼 執行增刪改查之後 執行公共代碼 @Override public void deleteUser(int id) throws Exception { // TODO Auto-generated method stub SqlSession sqlSession=this.sqlSessionFacory.openSession(); sqlSession.delete("test.deleteUser",id); sqlSession.commit(); sqlSession.close(); } @Override public User findUserById(int id) throws Exception { // TODO Auto-generated method stub SqlSession sqlSession=this.sqlSessionFacory.openSession(); User user=sqlSession.selectOne("test.findUserById",id);//調用的是user.xml中寫好的sql語句 //sqlSession.commit(); 沒有做數據的變更 此代碼不寫 sqlSession.close(); return user; } @Override public void insertUser(User user) throws Exception { // TODO Auto-generated method stub SqlSession sqlSession=this.sqlSessionFacory.openSession(); sqlSession.insert("test.insertUser",user); sqlSession.commit(); sqlSession.close(); } }
測試代碼:
package org.mybatis.dao; import static org.junit.Assert.*; import java.io.InputStream; 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.Before; import org.junit.Test; import org.mybatis.po.User; public class UserDaoImplTest { private SqlSessionFactory sqlSessionFactory; //這個代碼是在測試方法之前執行的代碼 @Before public void setUp() throws Exception { String resource="SqlMapConfig.xml"; //得到配置文件流 InputStream resourceAsStream = Resources.getResourceAsStream(resource); //創建回話工廠 this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream); } @Test public void testFindUserById() throws Exception { UserDao userDao=new UserDaoImpl(sqlSessionFactory); User user=userDao.findUserById(1); System.out.println(user); } }
問題的解決:使用代理模式
測試下面配置的方法
創建接口類 接口中的方法 需要和上面的id一樣
namespace需要寫成接口類的地址
在mybatis核心配置文件中引入sql語句文件
測試類:
package org.mybatis.mapper; import java.io.InputStream; 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.Before; import org.junit.Test; import org.mybatis.dao.UserDao; import org.mybatis.dao.UserDaoImpl; import org.mybatis.po.User; public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // String resource="SqlMapConfig.xml"; InputStream input=Resources.getResourceAsStream(resource); sqlSessionFactory=new SqlSessionFactoryBuilder().build(input); } @Test public void testFindUserById() throws Exception { // UserDao userDao=new UserDaoImpl(sqlSessionFactory); // User user=userDao.findUserById(1); // System.out.println(user); SqlSession sqlSession=sqlSessionFactory.openSession(); //得到代理對象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //通過代理對象 調用UserMapper類中的方法 User user=mapper.findUserById(1); System.out.println(user); } }
開發思路:開發mapper.xml(UserMapper.xml) 開發mapper接口(UserMapper.java)(不需要實現類 因為sql代碼在配置文件中已經創建了) 在核心配置文件中引入mapper.xml
然後就可以在測試類中通過代理對象
(
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
)
調用mapper接口中的方法
User user=mapper.findUserById(1);
--------------------------------------------
全局配置文件中屬性:
------------------------------
1.properties:
------------------------------------
---------------------------------------
---------------------------------
-------------------------------------
使用代理方式的前提下(1.配置文件中的namespace=對應接口類的全路徑 2.接口類中的方法名=配置文件中statement對象【sql標簽對象】的id值) mapper.xml和對應的接口類mapper.java在同一目錄下 (接口類名稱和xml配置文件名稱一樣) 加載該類所在的包即可
-------------------------------------------------------
mybatis入門截圖二