.Net轉Java自學之路—Mybatis框架篇二(SqlSession、原始開發、代理開發)
SqlSession範圍:
1、SqlSessionFactoryBuilder:通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory。
將SqlSessionFactory當成一個工具類使用即可,不需要使用單例管理SqlSessionFactoryBuilder,在需要創建SqlSessionFactory時,只需要new一次SqlSessionFactoryBuilder即可。
2、SqlSessionFactory:通過SqlSessionFactory創建SqlSession,使用單例模式管理sqlSessionFactory。在Mybatis和spring整合後,使用單例模式管理SqlSessionFactory。
3、SqlSession:
SqlSession是一個面向用戶的接口。它提供了很多的操作數據庫方法。
SqlSession是線程不安全的,在SqlSession實現類中除了有接口中的方法,還有數據域屬性。
SqlSession最佳應用場合在方法體內。定義成局部變量使用。
原始開發方式:
程序需要編寫dao接口和dao實現類。在dao的實現類中需要註入SqlSessionFactory,在方法體內通過SqlSessionFactory創建SqlSession。
public class TestDaoImpl implements TestDao {//通過構造函數方法註入SqlSessionFactory private SqlSessionFactory sqlSessionFactory; public TestDaoImpl(SqlSessionFactory sqlSessionFactory){ this.sqlSessionFactory=sqlSessionFactory; } public User findUserById(int id) throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); User user=sqlSession.selectOne("test.findUserById",id); sqlSession.close(); return user; } public List<User> findUserByName(String username) throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); List<User> list = sqlSession.selectList("test.findUserByName",username); sqlSession.close(); return list; } ...... }
由上述實例可發現原始開發方式存在的問題:
1、dao接口實現類方法中存在大量模板方法。若將這些代碼提取,將大大降低工作量。
2、調用SqlSession方法時將statement的id實施了硬編碼。
3、調用sqlSession方法時傳入的變量,由於sqlSession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,所以不利於開發。
代理開發方式:
1、配置mapper.xml映射文件。同時需要在SqlMapConfig.xml中加載UserMapper.xml。
2、編寫mapper接口,需要遵循的一些開發規範,mybatis可以自動生成mapper接口實現類代理對象
開發規範:
》在mapper.xml中namespace的屬性值為mapper接口地址。
<?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"> <!-- namespace:屬性值指定mapper接口的地址 --> <mapper namespace="cn.ccir.mybatis.entity.UserMapper"> </mapper>
》mapper接口中的方法名和mapper.xml中statement的id一致。
》mapper接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致。
》mapper接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。
public interface UserMapper{ public User findUserById(int id) thorws Exception; public List<User> findUserByName(String name) throws Exception; } public class UserMapperTest{ private SqlSessionFactory sqlSessionFactory; //指定測試方法前執行。 @Before public void setUp() throws Exception{ String resource="SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsString(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public void testFindUserById(){ SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,Mybatis自動生成mapper代理對象。 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(1); } }
mapper接口方法參數只能有一個參數。在系統框架中,dao層的代碼是被業務層公用的。即使mapper接口只有一個參數,也可以使用包裝類型的pojo來滿足不同的業務方法的需求。
註:持久層方法的參數可以包裝類型map,但service方法中不建議使用包裝類型。因為不利於業務層的擴展。
Mybatis配置文件SqlMapConfig.xml:
Mybatis的全局配置文件,配置內容如下:
properties:屬性。
Mybatis將按照下面的順序來加載屬性:
1、在properties元素體內定義的屬性首先被讀取。
2、然後讀取properties元素中resource/url加載的屬性,它會覆蓋已讀取的同名屬性。
3、最後讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
建議:
不要在properties元素體內添加任何屬性值,只將屬性值定義在properties文件中。在properties文件中定義屬性名要有一定的特殊性。
settings:全局參數配置。
Mybatis框架在運行時可以調整一些運行參數。如:開啟二級緩存、開啟延遲加載等。全局參數將會影響Mybatis的運行行為。
typeAliases:類型別名。
如:在mapper.xml中,定義很多的statement,statement需要parameterType指定輸入參數的類型,需要resultType指定輸出結果的映射類型。
若在指定類型時輸入類型全路徑,不方便進行開發,可以針對parameterType或resultType指定的類型定義一些別名,在mapper.xml中通過別名定義,方便開發。
Mybatis有一些默認的別名(URL),而pojo的類型定義別名則需要定義別名:
<!-- 定義別名 --> <typeAliases> <!-- 針對單個別名定義 --> <typeAlias type="cn.ccir.mybatis.entity.User" alias="user"> <!-- 批量別名定義 指定包名,mybatis自動掃描包中的類,自動定義別名,別名就是類型 --> <package name="cn.ccir.mybatis.entity"/> </typeAliases>
typeHandlers:類型處理器。
Mybatis中通過typeHandlers完成jdbc類型和java類型的轉換。
Mybatis默認支持的類型處理器:
通常情況下,mybatis提供的類型處理器已經滿足日常需要,不需要自定義。
objectFactory:對象工廠
pluglns:插件
environments:環境集合屬性對象
> environment:環境子屬性對象
> transactionManager:事務管理
> dataSource:數據源
mappers:映射配置
<mappers> <!-- 一次加載一個映射文件 --> <mapper resource="sqlmap/User.xml"/> <!-- 通過mapper接口加載單個映射文件 遵循的一些規範: 需要將mapper接口類型和mapper.xml映射文件名稱保持一致,且在一個目錄中。 遵循的規範的前提:使用的時mapper代理方法 --> <mapper resource="cn.ccir.mybatis.entity.TestDaoMapper"/> <!-- 批量加載mapper 指定mapper接口包名。mybatis自動掃描包下百年所有mapper接口進行加載。 遵循的一些規範: 需要將mapper接口類型和mapper.xml映射文件名稱保持一致,且在一個目錄中。--> <mapper resource="cn.ccir.mybatis.entity"/> </mappers>
.Net轉Java自學之路—Mybatis框架篇二(SqlSession、原始開發、代理開發)