1. 程式人生 > >第一章 初識 MyBatis

第一章 初識 MyBatis

day01 範圍 符號 持久層 cto 存儲 root ace ase

概念:優秀持久層框架:實體類和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"?>

<!DOCTYPE configuration
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="url" value="jdbc:mysql://127.0.0.1:3306/studentwu" />
<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的核心對象有哪些,對象之間的關系?

1SqlSessionFactoryBuilding

這個類可以被實例化、使用和丟棄。一但創建了SqlSessionFactory後,這個類就不需要存在 了,因此sqlsessionfactorybuilder 實例的最佳作用域是方法範圍(即作為方法的變量)

2SqlSessionFactory

SqlSessionFactory,顧名思義就是獲取SqlSession對象的工廠,功能類似於jdbc中加載數據庫驅動。所以sqlsessionfactory對象一但被創建,應該在應用執行期間都存在,因此sqlsessionfactory的最佳作用域是應用範圍,建議定義為靜態變量。

3sqlsession

sqlsession類似於jdbcconnection對象,每個線程都因該有自己的sqlsession 實例。sqlsesion的實例,sqlsession的實例不能共享,他是 線程不安全的,因此最佳作用域是請求或方法範圍,sqlsession對象能夠執行數據庫的增刪改查操作,因此在使用後應該關閉,並保存使用finally快來關閉。

Mybatis#{}${}的區別?

1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sqlorder by "id".

2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那麽解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sqlorder 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的映射文件中,都有哪些常用的標簽?

insertupdatedeleteseletesqlresultMap

Mybatis中配置properties元素的兩種方式及優先級?

1、通過外部指定的方式(database.properties),實現動態配置

2、直接配置為xml子節點,實現動態配置 外部指定的方式優先級高

Mybatis中配置事務管理的類別有幾種?分別是什麽?

兩種 1JDBC 2MANAGED

Mybatis中數據源的配置類型有幾種?分別是什麽?

三種 1POOLED 2UNPOOLED 3JNDI

MybatisautoMappingBehavior的匹配級別有幾種,分別是什麽??

三種 1NONE 2PARTIAL 默認 3FULL

技術分享圖片

技術分享圖片

第一章 初識 MyBatis