這篇文章給大家介紹Spring與MyBatis的示例分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
10年積累的做網(wǎng)站、網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有古縣免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
參考:
Mybatis初始化流程及其重要的幾個類
SqlSessionFactory和SqlSession的介紹和運(yùn)用
SqlSessionFactoryBean 源碼解析
@Mapper和@MapperScan的區(qū)別
Spring整合Mybatis原理
使用JDBC
的步驟包括
設(shè)置好數(shù)據(jù)庫的url,用戶名,密碼等常量
加載驅(qū)動類,例如MySQL
的com.mysql.cj.jdbc.Driver
。
加載com.mysql.cj.jdbc.Driver
時會執(zhí)行此驅(qū)動類靜態(tài)代碼塊java.sql.DriverManager.registerDriver(new Driver());
,將驅(qū)動注冊進(jìn)DriverManager
使用Driver
或DriverManager
創(chuàng)建Connection
對象
使用Connection
對象控制事務(wù)是否自動提交,手動提交,回滾或創(chuàng)建Statement
對象執(zhí)行sql語句
下述代碼完成了 將mybatis的xml配置文件加載到Conguration
對象中,創(chuàng)建SqlSessionFactory
對象,創(chuàng)建SqlSession
對象,調(diào)用指定mapper中的方法完成一次數(shù)據(jù)庫查詢
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");
Configuration類的結(jié)構(gòu)和mybatis的xml配置文件的結(jié)構(gòu)是一一對應(yīng)的
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { // 此對象用于解析 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); // parser.parse()實現(xiàn)將mybatis的xml配置文件解析到Java中的Configuration對象,并返回此對象 return build(parser.parse()); } catch (Exception e) { throw ... } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } } // 創(chuàng)建并返回一個DefaultSqlSessionFactory對象 public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
上述使用mybatis的過程中,將解析mybatis配置文件的流程封裝到了SqlSessionFactoryBuilder.build()
方法內(nèi)部
我們也可以使用重載方法,將Configuration
對象作為參數(shù)傳入build
方法,并顯式解析配置文件
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 手動創(chuàng)建XMLConfigBuilder,并解析創(chuàng)建Configuration對象 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null,null); Configuration configuration=parse(); // 使用Configuration對象創(chuàng)建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); // 使用MyBatis SqlSession sqlSession = sqlSessionFactory.openSession(); List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");
SqlSessionFactory的作用
SqlSessionFactory
是個單個數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像。每一個MyBatis
的應(yīng)用程序都以一個SqlSessionFactory
對象的實例為核心。SqlSessionFactory
提供創(chuàng)建SqlSession
對象的方法
SqlSessionFactory的創(chuàng)建方式
直接new一個對象,并為它配置所需要的Configuration
對象
用SqlSessionFactoryBuilder
的build()
方法創(chuàng)建。這個方法被重載多次,其核心是將mybatis的xml文件解析到Configuration
對象中,在此基礎(chǔ)上創(chuàng)建一個SqlSessionFactory
對象
SqlSessionFactory的線程安全性
SqlSessionFactory
是線程安全的,SqlSessionFactory
一旦被創(chuàng)建,應(yīng)該在應(yīng)用執(zhí)行期間都存在。在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次,建議使用單例模式,SqlSessionFactory
是創(chuàng)建SqlSession
的工廠
SqlSession的作用
SqlSession
是執(zhí)行持久化操作的對象。類似于JDBC
中的Connection
。
SqlSession的實現(xiàn)
SqlSession
接口提供CURD方法和對事務(wù)的管理方法和獲取mapper代理對象的方法,它底層封裝了JDBC
SqlSession的線程安全性
它是應(yīng)用程序與持久層之間執(zhí)行交互的一個單線程對象。每個線程都應(yīng)該有自己的SqlSession
實例。SqlSession
的實例不能被共享,同時SqlSession
也是線程不安全的
SqlSessionFactoryBean
的定義信息經(jīng)常這樣使用
SqlSessionFactoryBean
類實現(xiàn)了InitializingBean
接口。調(diào)用其afterPropertiesSet()
方法時創(chuàng)建SqlSessionFactory
對象并賦給成員變量this.sqlSessionFactory
在Spring
項目中使用MyBatis
后是這樣使用的
@Component public class UserService { @Autowired private UserMapper userMapper; public User getUserById(Integer id) { return userMapper.selectById(id); } }
我們關(guān)注的就是Spring IoC
是怎么將UserMapper
這個接口實例化并添加到容器中的
解決方案:(以UserMapper
為例)使用FactoryBean
為UserMapper
接口創(chuàng)建一個聲明類型是UserMapper
,實際類型是動態(tài)代理的對象
并將對象添加到容器中
但是自定義的XxxMapper
是你自己寫的,是不確定的??蚣懿粫槊總€XxxMapper
創(chuàng)建一個XxxFactoryBean
,所以這個FactoryBean
持有一個成員變量,保存它將要創(chuàng)建的對象的類型。以此做到創(chuàng)建各種Mapper
類的代理對象
在Spring
整合MyBatis
的項目中,這個FactoryBean
就是MapperFactoryBean
現(xiàn)在還有一個問題,每個Mapper
都要有一個MapperFactoryBean
。那MapperFactoryBean
在哪里被創(chuàng)建?
由MapperFactoryBean
和@MapperScan
來實現(xiàn)
@Import(MapperScannerRegistrar.class) public @interface MapperScan { String[] basePackages() default {}; ... }
@MapperScan
的作用是向容器中添加一個MapperScannerRegistrar
對象,并記錄需要被掃描的包
這些包下的XxxMapper
將會被MapperScannerRegistrar
掃描到并為其創(chuàng)建一個MapperFactoryFactoryBean
類型的BeanDefinition
對象)
關(guān)于Spring與MyBatis的示例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。