MyBatis知識點學習
MyBatis中文官方文件:http://www.mybatis.org/mybatis-3/zh/getting-started.html(這大概是最好的學習材料了)
什麼是 MyBatis ?
官方解釋:MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
MyBatis結構圖:
MyBatis通過配置和註解簡化JDBC的操作,瞭解MyBatis,首先要了解他的配置資訊,XML配置對映檔案中,最重要的是設定(settings)和屬性(properties)資訊。
properties
設定屬性資訊,設定連線資料庫:
<properties resource="org/mybatis/example/config.properties">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/wendao?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
配置資料庫的連線有多種方法:
1,在config.properties的屬性檔案中配置
2,如上,在XML配置檔案中配置
3,在Java類中配置,通過方法引數傳遞屬性
同時,也可以靈活的結合這三種配置方法進行資料庫的配置,重複配置資訊時有些配置資訊就會被覆蓋掉,這三種方法有個優先順序的問題,高優先順序的會覆蓋掉低優先順序的。
如果屬性在不只一個地方進行了配置,那麼 MyBatis 將按照下面的順序來載入:
1,在 properties 元素體內指定的屬性首先被讀取。
2,然後根據 properties 元素中的 resource 屬性讀取類路徑下屬性檔案或根據 url 屬性指定的路徑讀取屬性檔案,並覆蓋已讀取的同名屬性。
3,最後讀取作為方法引數傳遞的屬性,並覆蓋已讀取的同名屬性。
也就是說:方法引數傳遞的屬性>resource/url中配置的屬性> properties 中設定的屬性
settings
設定屬性引數,這些引數會改變 MyBatis 的執行時行為。
一個配置完整的 settings 元素的示例如下:
<!– 配置設定 –>
<settings>
<!– 配置全域性性 cache 的 ( 開 / 關) default:true –>
<setting name=“cacheEnabled” value=“true”/>
<!– 是否使用 懶載入 關聯物件 同 hibernate中的延遲載入 一樣 default:true ,當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定fetchType屬性來覆蓋該項的開關狀態–>
<setting name=“lazyLoadingEnabled” value=“true”/>
<!– [當物件使用延遲載入時 屬性的載入取決於能被引用到的那些延遲屬性,否則,按需載入(需要的是時候才去載入)] –>
<setting name=“aggressiveLazyLoading” value=“true”/>
<!– 是否允許單條sql 返回多個資料集 (取決於驅動的相容性) default:true –>
<setting name=“multipleResultSetsEnabled” value=“true”/>
<!– 是否可以使用列的別名 (取決於驅動的相容性) default:true–>
<setting name=“useColumnLabel” value=“true”/>
<!–允許JDBC 生成主鍵。需要驅動器支援。如果設為了true,這個設定將強制使用被生成的主鍵,有一些驅動器不相容不過仍然可以執行。 default:false–>
<setting name=“useGeneratedKeys” value=“false”/>
<!–指定 MyBatis 如何自動對映 資料基表的列
NONE:不隱射 PARTIAL:部分 FULL:全部–>
<setting name=“autoMappingBehavior” value=“PARTIAL”/>
<!– 這是預設的執行型別
SIMPLE :簡單
REUSE:執行器可能重複使用prepared statements 語句
BATCH:執行器可以重複執行語句和批量更新 –>
<setting name=“defaultExecutorType” value=“SIMPLE”/>
<!– 設定驅動等待資料響應的超時數 預設沒有設定–>
<setting name=“defaultStatementTimeout” value=“25000″/>
<!– [是否啟用 行內巢狀語句 defaut:false] –>
<setting name=“safeRowBoundsEnabled” value=“false”/>
<!– [是否 啟用 資料中 A_column 自動對映 到 Java類中駝峰命名的屬性 default:fasle] –>
<setting name=“mapUnderscoreToCamelCase” value=“false”/>
<!– 設定本地快取範圍 session:就會有資料的共享 statement:語句範圍 (這樣就不會有資料的共享 ) defalut:session –>
<setting name=“localCacheScope” value=“SESSION”/>
<!– 設定但JDBC型別為空時,某些驅動程式 要指定值,default:OTHER –>
<setting name=“jdbcTypeForNull” value=“DEFAULT”/>
<!– 設定觸發延遲載入的方法 –>
<setting name=“lazyLoadTriggerMethods” value=“equals,clone,hashCode,toString”/>
</settings>
大概瞭解了MyBatis的配置資訊,接下來通過一個增刪改查的Demo來系統的瞭解一下MyBatis的流程吧。工程只為測試,建一個Java工程就行。
新建一個Java工程,上圖是大體結構以及所使用到的包(沒有包是執行不了的):
db.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=1011
log4j.properties:
## Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
sqlMapConfig.xml配置資訊:
<?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="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 資料庫連線池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/pojo/UserInfo.xml"></mapper>
</mappers>
</configuration>
POJO類:
package org.mybatis.pojo;
public class UserInfo {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public UserInfo() {
super();
// TODO Auto-generated constructor stub
}
public UserInfo(Integer id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
}
POJO對映檔案:
<?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">
<mapper namespace="mybatis_example">
<select id="findUserInfo" parameterType="int" resultType="org.mybatis.pojo.UserInfo">
select * from user_info where id = #{id}
</select>
<insert id="addUser" parameterType="org.mybatis.pojo.UserInfo">
insert into user_info(username,password) value (#{username},#{password})
</insert>
<delete id="delUser" parameterType="org.mybatis.pojo.UserInfo">
delete from user_info where id = #{value}
</delete>
<update id="updUser" parameterType="org.mybatis.pojo.UserInfo">
update user_info set username=#{username},password=#{password} where id=#{id}
</update>
</mapper>
接下來是測試類,使用單元測試:
package org.mybatis.example;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.mybatis.pojo.UserInfo;
public class MyBatisExample {
// 查詢
@Test
public void findUserInfo() throws IOException{
String resource = "sqlMapConfig.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
SqlSession sqlsession = sqlSessionFactory.openSession();
//第一個引數:對映檔案的id,
//第二個引數:指定和對映檔案parameterType所匹配的引數
UserInfo user = sqlsession.selectOne("mybatis_example.findUserInfo",1);
System.out.println("使用者名稱是:"+user.getUsername());
}
// 新增
@Test
public void addUser() throws IOException{
String resource = "sqlMapConfig.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
SqlSession sqlsession = sqlSessionFactory.openSession();
String name = "趙敏";
String pass = "123";
UserInfo ui = new UserInfo();
ui.setUsername(name);
ui.setPassword(pass);
sqlsession.insert("mybatis_example.addUser",ui);
sqlsession.commit();
sqlsession.close();
}
// 刪除
@Test
public void delUser() throws IOException{
String resource = "sqlMapConfig.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
SqlSession sqlsession = sqlSessionFactory.openSession();
sqlsession.delete("mybatis_example.delUser",1);
sqlsession.commit();
sqlsession.close();
}
// 修改
@Test
public void updUser() throws IOException{
String resource = "sqlMapConfig.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
SqlSession sqlsession = sqlSessionFactory.openSession();
String name = "張無忌";
String pass = "123";
UserInfo ui = new UserInfo();
ui.setId(2);
ui.setUsername(name);
ui.setPassword(pass);
sqlsession.update("mybatis_example.updUser",ui);
sqlsession.commit();
sqlsession.close();
}
}
程式碼中的名詞解釋:
parameterType:MyBatis中通過parameterType指定輸入的引數型別
resultType:MyBatis中通過resultType指定輸出的結果
#{}:表示的是佔位符,#{}接收的引數是輸入的引數,型別可以是簡單型別、pojo、hashmap
#{}如果接收的是簡單型別的話,裡面的值可以value或者其他名稱
#{}接收pojo物件,通過OGNL讀取物件中的屬性值,通過屬性.屬性的方式獲取。
selectOne:表示查詢出一條記錄,如果是使用selectone是可以實現的結果,selectList也是可以實現了(list中只有一個物件)
selectList:表示查詢出一個列表(多條記錄)進行對映的。如果是使用selectOne是不可以實現的。
相關文章
- mybatis知識點MyBatis
- Java知識點學習Java
- Bootstrap 個人學習知識點boot
- jQuery 個人學習知識點jQuery
- 學習記錄 -- 知識點
- java知識點學習圖Java
- JS 學習個人知識盲點JS
- Vue學習知識點總結Vue
- jquery學習之重要知識點jQuery
- PG知識點學習總結圖
- 【java學習】java知識點總結Java
- React學習筆記知識點整理React筆記
- 機器學習vs深度學習及其知識點機器學習深度學習
- R學習-知識點記錄(Temp)
- JVM重要知識點整理和學習JVM
- 大資料學習,涉及的知識點大資料
- ES6新手學習知識點整理
- 學習 Laravel 必須理解的知識點Laravel
- 【Go學習】Go(Golang)知識點總結Golang
- Python高階知識點學習(五)Python
- Html標籤知識點學習筆記HTML筆記
- python學習-知識點記錄(Temp)Python
- 學習android所需Java知識點列表AndroidJava
- Mybatis【逆向工程,快取,代理】知識要點MyBatis快取
- HTML5學習重點知識:JavaScript概述HTMLJavaScript
- Promise學習筆記(知識點 + 手寫Promise)Promise筆記
- OpenGL ES 2.0學習(一)入門知識點
- JAVA學習-------第二週知識點總結Java
- 【學習】MySQL基礎知識要點-001MySql
- 有關自定義View的學習知識點View
- EXTJs學習筆記(知識點總結)JS筆記
- Node基礎知識點--學習筆記(一)筆記
- web知識學習Web
- 知識學習綜合
- Mybatis學習-初步認知與使用MyBatis
- 阿里雲ACE認證學習知識點梳理阿里
- <react學習筆記(5)>知識點回顧(1)React筆記
- Python全棧學習_day003知識點Python全棧