第一章 初識 MyBatis
概念:優秀持久層框架:實體類和SQL語句之間建立映射關系
與hibernate區別 :自動生成sql語句,並且建立實體類和數據表的映射。
MyBatis基本要素:核心對象 核心配置文件 SQL映射文件
特點:
基於SQL語法
,簡單易學
能了解底層封裝過程 SQL語句封裝在配置文件中,
便於統一管理與維護,降低程序的耦合度
方便程序代碼調試
什麽是ORM? 對象關系映射
ORM(Object Relational Mapping) 編寫程序的時候,
以面向對象的方式處理數據 保存數據的時候,卻以關系型數據庫的方式存儲
ORM解決方案包含下面四個部分
在持久化對象上執行基本的增、刪、改、查操作
對持久化對象提供一種查詢語言或者API 對象關系映射工具
提供與事務對象交互、執行檢查、延遲加載以及其他優化功能
搭建MyBatis 開發環境
1.創建java工程
1.編寫MyBatis核心配置文件(mybatis-cofig.xml)
2.創建實體類—POJO
3.DAO層- SQL映射文件
4.創建測試類
如下圖:
核心配置文件註意事項:
註意編寫頭部聲明以及未聯網狀態下的配置
註意節點的編寫順序
代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="database.properties"><!-- 加載外部資源文件 a.指定外部文件 resource 優先級高 b.直接配置XML property -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="username" value="root" />
<property name="password" value="root" />
</properties>
<!-- 全局的設置 -->
<settings><!-- NONE取消自動映射 PARTIAL 默認自動映射 設置為FULL 都能映射-->
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
<typeAliases><!--設置別名 1.取別名 2.包路徑 默認就是類名 常用的-->
<!-- <typeAlias type="com.bw.pojo.Student" alias="Student"/> -->
<package name="com.bw.pojo" />
</typeAliases>
<environments default="test1"><!-- 配置連接數據庫的信息 -->
<environment id="test1">
<transactionManager type="JDBC" /><!-- 配置事務的管理 兩種 1.JDBC 2.MANAGED -->
<dataSource type="POOLED"><!--配置數據源的信息 三種1.POOLED 2.UNPOOLED 3.JNDI -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${use}" />
<property name="password" value="${pass}" />
</dataSource>
</environment>
</environments>
<mappers><!-- 添加Sql的映射文件 四種方式 -->
<!-- A.使用resource 加載Mapper映射文件-->
<!-- <mapper resource="com/bw/mapper/StudentMapper.xml" /> -->
<!-- B.使用mapper接口的完全限定類名 要求接口和映射文件的名稱要一致-->
<!-- <mapper class="com.bw.mapper.StudentMapper" /> -->
<!-- C.通過url指定-->
<!-- <mapper url="file:///D:\1807A2\6month\day01\src\com\bw\mapper\StudentMapper.xml" /> -->
<!-- D.通過包路徑指定 加載這個包下面的所有映射文件-->
<package name="com.bw.mapper"/>
</mappers>
</configuration>
如圖:
編寫接口 和 SQL配置文件
測試類:
SqlSession sqlSession = null;
// 1.加載mybatis_config配置文件
try {
Reader rs = Resources.getResourceAsReader("mybatis_config.xml");
// 2.創建sqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 3.創建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(rs);
// 4.獲取sqlSession對象
sqlSession = sqlSessionFactory.openSession();
// 5. sqlsession的兩種使用方式:
//a.實例操作 參數:SQL映射文件裏面要調用的ID
//Object count = sqlSession.selectOne("getCount");
//b.基於mapper接口的操作
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//int count = mapper.getCount();
//System.out.println(count);
//獲取屬性的集合
Student student2 = new Student();
student2.setSname("李珊");
List<Student> studentList = mapper.getStudentList(student2);
for (Student student : studentList) {
System.out.println(student.getSname());
}
Student s = mapper.getStudentById(44);
System.out.println(s.getSname());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
// 6.關閉資源
sqlSession.close();
}
}
簡單介紹Mybatis的框架的優缺點?
一、MyBatis框架的優點:
1. 與JDBC相比,減少了50%以上的代碼量
2. MyBatis是最簡單的持久化框架,小巧並且簡單易學。
3. MyBatis相當靈活,不會對應用程序或者數據庫的現有設計強加任何影響,SQL寫在XML裏,從程序代碼中徹底分離,降低耦合度,便於統一管理和優化,並可重用。
4. 提供XML標簽,支持編寫動態SQL語句
5. 提供映射標簽,支持對象與數據庫的ORM字段關系映射。
二、MyBatis框架的缺點:
1. SQL語句的編寫工作量較大,尤其是字段多、關聯表多時,更是如此,對開發人員編寫SQL語句的功底有一定要求。
2. SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。
Mybatis的核心對象有哪些,對象之間的關系?
1、SqlSessionFactoryBuilding
這個類可以被實例化、使用和丟棄。一但創建了SqlSessionFactory後,這個類就不需要存在 了,因此sqlsessionfactorybuilder 實例的最佳作用域是方法範圍(即作為方法的變量)
2、SqlSessionFactory
SqlSessionFactory,顧名思義就是獲取SqlSession對象的工廠,功能類似於jdbc中加載數據庫驅動。所以sqlsessionfactory對象一但被創建,應該在應用執行期間都存在,因此sqlsessionfactory的最佳作用域是應用範圍,建議定義為靜態變量。
3、sqlsession
sqlsession類似於jdbc的connection對象,每個線程都因該有自己的sqlsession 實例。sqlsesion的實例,sqlsession的實例不能共享,他是 線程不安全的,因此最佳作用域是請求或方法範圍,sqlsession對象能夠執行數據庫的增刪改查操作,因此在使用後應該關閉,並保存使用finally快來關閉。
Mybatis中#{}和${}的區別?
1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".
2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那麽解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.
3. #方式能夠很大程度防止sql註入。
4.$方式無法防止Sql註入。
5.$方式一般用於傳入數據庫對象,例如傳入表名.
6.一般能用#的就別用$.
MyBatis排序時使用order by 動態參數時需要註意,用$而不是#
Mybatis當實體類的屬性名和表中的字段名不一樣,怎麽辦?
1、取別名 2、使用resultMap
Mybatis的模糊查詢的實現方式(兩種以上)?
1、在調用的方法中把參數使用%拼接好
2、在SQL映射文件中使用$符號
3、使用concat拼接參數
4、使用bind標簽創建拼接參數變量
Mybatis Mapper代理的開發方式規範?
1.創建接口與映射文件同名,並在相同包下。
2.映射文件的namespace的值必須等於接口的全限定名。
3.<select><delete><insert><update>標簽中的id值必須與接口中方法同名。
4.上述標簽的parameterType屬性值的類型與接口中方法的參數相同。
5.上述標簽的resultType的屬性值得類型與接口方法的返回值類型相同。
Mybatis中如何傳遞多個參數?
一、使用註解@Param 二、使用map集合封裝多個參數 三、使用對象屬性綁定多個參數
Mapper映射器的配置方式有哪些?
一、通過resource指定 二、通過url指定三、通過class指定 四、通過指定包路徑
mybatis中實體類取別名的方式有哪些?
一、通過resource指定 二、通過包路徑指定 三、通過實體類註解@Alises
Mybatis的映射文件中,都有哪些常用的標簽?
insert、update、delete、selete、sql、resultMap
Mybatis中配置properties元素的兩種方式及優先級?
1、通過外部指定的方式(database.properties),實現動態配置
2、直接配置為xml子節點,實現動態配置 外部指定的方式優先級高
Mybatis中配置事務管理的類別有幾種?分別是什麽?
兩種 1、JDBC 2、MANAGED
Mybatis中數據源的配置類型有幾種?分別是什麽?
三種 1、POOLED 2、UNPOOLED 3、JNDI
Mybatis中autoMappingBehavior的匹配級別有幾種,分別是什麽??
三種 1、NONE 2、PARTIAL 默認 3、FULL
第一章 初識 MyBatis