1. 程式人生 > >mybatis入門截圖二

mybatis入門截圖二

str 產生 apache 屬性 pub assert sqlmap mapper col

技術分享

--------------------

線程不安全問題

技術分享

首先明白什麽是線程不安全:

舉例: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入門截圖二