什么是mybatis
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射托修。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集挺勿。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息雇毫,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄玄捕。
我們的項目是通過maven管理的話,使用mybatis的時候棚放,需要引入mybatis依賴的包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
mybatis的優(yōu)缺點
優(yōu)點
1枚粘、簡單易學(xué)
mybatis本身就很小且簡單。沒有任何第三方依賴飘蚯,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易于學(xué)習(xí)馍迄,易于使用,通過文檔和源代碼局骤,可以比較完全的掌握它的設(shè)計思路和實現(xiàn)攀圈。
2、靈活
mybatis不會對應(yīng)用程序或者數(shù)據(jù)庫的現(xiàn)有設(shè)計強加任何影響峦甩。 sql寫在xml里赘来,便于統(tǒng)一管理和優(yōu)化。通過sql基本上可以實現(xiàn)我們不使用數(shù)據(jù)訪問框架可以實現(xiàn)的所有功能凯傲,或許更多犬辰。
3、解除sql與程序代碼的耦合
通過提供DAL層冰单,將業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯分離幌缝,使系統(tǒng)的設(shè)計更清晰,更易維護诫欠,更易單元測試涵卵。sql和代碼的分離,提高了可維護性荒叼。
4轿偎、提供映射標(biāo)簽乱投,支持對象與數(shù)據(jù)庫的orm字段關(guān)系映射
5、提供對象關(guān)系映射標(biāo)簽托慨,支持對象關(guān)系組建維護
6尔苦、提供xml標(biāo)簽,支持編寫動態(tài)sql略荡。
7、不用寫dao實現(xiàn)
缺點
1、編寫SQL語句時工作量很大亦渗,尤其是字段多、關(guān)聯(lián)表多時汁尺,更是如此法精。
2、SQL語句依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差搂蜓,不能更換數(shù)據(jù)庫狼荞。
3、框架還是比較簡陋帮碰,功能尚有缺失相味,雖然簡化了數(shù)據(jù)綁定代碼,但是整個底層數(shù)據(jù)庫查詢實際還是要自己寫的殉挽,工作量也比較大丰涉,而且不太容易適應(yīng)快速數(shù)據(jù)庫修改。
4斯碌、二級緩存機制不佳
SqlSessionFactory
每個基于 MyBatis 的應(yīng)用都是以一個 SqlSessionFactory 的實例為中心的一死。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預(yù)先定制的 Configuration 的實例構(gòu)建出 SqlSessionFactory 的實例傻唾。
從 XML 文件中構(gòu)建 SqlSessionFactory 的實例非常簡單投慈,建議使用類路徑下的資源文件進行配置。但是也可以使用任意的輸入流(InputStream)實例策吠,包括字符串形式的文件路徑或者 file:// 的 URL 形式的文件路徑來配置逛裤。MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法猴抹,可使從 classpath 或其他位置加載資源文件更加容易带族。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactorysqlSessionFactory=
newSqlSessionFactoryBuilder().build(inputStream);
創(chuàng)建mybatis-config.xml文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bank?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
創(chuàng)建映射文件UserMapper.xml
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="user">
<select id="selectUser" resultType="com.hemi.mybatis.bean.User">
select * from user where uid=1;
</select>
</mapper>
獲取xml配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
創(chuàng)建SqlSessionFactory
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
獲取SqlSession
SqlSession sqlSession = factory.openSession();
調(diào)用SqlSession的selectOne(命名空間.id名稱);
Object object = sqlSession.selectOne("user.selectUser");
關(guān)閉SqlSession
sqlSession.close();
mybatis-plus
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.0.8</version>
</dependency>
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 自動掃描Mapping.xml文件 -->
<property name="mapperLocations" value="classpath*:/mapper/*.xml"></property>
<!--掃描實體類-->
<property name="typeAliasesPackage" value="com.study.entity"/>
<!--mybatis-plus全局配置-->
<property name="globalConfig" ref="globalConfig"/>
</bean>
<!-- MP 全局配置 -->
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!--主鍵為自增長-->
<property name="idType" value="0"/>
<!--下劃線轉(zhuǎn)駝峰命名-->
<property name="dbColumnUnderline" value="true"/>
</bean>
<!-- MyBatis 動態(tài)實現(xiàn) -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 對Dao 接口動態(tài)實現(xiàn),需要知道接口在哪 -->
<property name="basePackage" value="com.study.mapper"/>
</bean>