Mybatis映射文件規(guī)則實例詳解
在說明映射文件規(guī)則之前,先來回顧一下ORM相關(guān)概念。
1.ORM概念
ORM(Object Relationship Mapping)對象關(guān)系映射
對象:Java的實體類對象
關(guān)系:關(guān)系型數(shù)據(jù)庫
映射:二者之間的對應(yīng)關(guān)系
字段名和屬性名要一一對應(yīng)才可以,它們的名字要相同,底層調(diào)用的是反射機制
| Java概念 | 數(shù)據(jù)庫概念 |
|---|---|
| 屬性 | 列,字段 |
| 類 | 表 |
| 對象 | 記錄 |
2.映射文件命名規(guī)則
表對應(yīng)的實體類的類名+Mapper.xml
舉例:假如數(shù)據(jù)庫的表的名字是t_user,它對應(yīng)的實體類是User,那么對應(yīng)的映射文件為UserMapper.xml
一個映射文件對應(yīng)一個實體類,對應(yīng)一張表的操作,調(diào)用Mapper中的方法就是來執(zhí)行SQL
Mybatis映射文件用來寫SQL語句,訪問和操作表的數(shù)據(jù)
Mybatis映射文件存放位置是src/main/resources/mappers目錄下面
3.Mybatis的兩個一致
Mybatis可以面向接口操作數(shù)據(jù),如果我們以包為單位引入映射文件,需要有兩個一致
① 映射文件的namespace要和mapper接口的全類名一致
當(dāng)調(diào)用Mapper接口中的方法,它會先根據(jù)Mapper接口的全類名去找到映射文件,然后根據(jù)方法名去找到對應(yīng)的SQL語句
②映射文件中SQL語句的id要和mapper接口中的方法名一致

4.總結(jié)創(chuàng)建mybatis的步驟
- 創(chuàng)建maven工程
- 在pom.xml中引入相關(guān)依賴,比如數(shù)據(jù)庫驅(qū)動,mybatis,junit單元測試,log4j日志
- 在src/main/java建包
- 3.1 在pojo包下面創(chuàng)建對應(yīng)的實體類
注:實體類對應(yīng)數(shù)據(jù)庫表的記錄
也就是說數(shù)據(jù)庫查詢出來的結(jié)果要以什么方式返回 - 3.2 在mapper包下面創(chuàng)建mapper接口,里面定義操作數(shù)據(jù)庫中表的相關(guān)方法
- 3.1 在pojo包下面創(chuàng)建對應(yīng)的實體類
- 在resources目錄下面建mybatis的核心配置文件
<?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代表核心配置文件-->
<configuration>
<!-- The content of element type "configuration" must match "
(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,
objectWrapperFactory?,reflectorFactory?,plugins?,environments?,
databaseIdProvider?,mappers?)".-->
<!-- <typeAliases></typeAliases>-->
<!-- 因為后面要查詢的語句很多,每一個查詢語句要對應(yīng)一個實體類,那么我們在指定返回類型的時候-->
<!-- 要寫類的全路徑,路徑可能很長,這樣就很麻煩,我們就可以使用標簽-->
<properties resource="jdbc.properties"/>
<!-- 設(shè)置類型別名-->
<typeAliases>
<!-- typeAlias:設(shè)置某個類型的別名
屬性:
type:設(shè)置需要設(shè)置別名的類型
alias:設(shè)置某個類型的別名,如果不設(shè)置該屬性,則這個類型有默認的別名,而且類名不區(qū)分大小寫
-->
<typeAlias type="com.atguigu.mybatis.mybatis.pojo.User" alias="User"></typeAlias>
<!-- 以包為單位,把包下面的所有類型設(shè)置成為默認的類型別名,——類名不區(qū)分大小寫-->
<package name="com.atguigu.mybatis.pojo"/>
</typeAliases>
<!-- 環(huán)境可以有多個,我們用默認的環(huán)境-->
<!-- enviments:配置連接數(shù)據(jù)庫的環(huán)境
id:表示連接數(shù)據(jù)庫環(huán)境的唯一標識,不能重復(fù)-->
<environments default="development">
<environment id="development">
<!-- transactionManager設(shè)置事務(wù)管理方式
type=DBC|MANAGED
JDBC:表示在當(dāng)前環(huán)境中,執(zhí)行SQL時,使用的是JDBC中原生的事務(wù)管理方式,事務(wù)的提交或回滾需要手動處理
MANAGED:表示被誰管理,例如Spring-->
<transactionManager type="JDBC"/>
<!-- type用來設(shè)置數(shù)據(jù)源的類型
type=POOLED|UNPOOLED|JNDI
POOLED:表示使用的是數(shù)據(jù)庫連接池緩存數(shù)據(jù)庫連接
UNPOOLED:表示不使用數(shù)據(jù)庫連接池
JNDI:表示使用的是上下文中的數(shù)據(jù)源-->
<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}"/>
<!-- 數(shù)據(jù)源就是連接是連接數(shù)據(jù)庫的信息-->
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<!-- type=POOLED表示使用數(shù)據(jù)庫連接池-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入映射文件-->
<!-- 每一個Mapper.xml都需要在Mybatis的核心配置文件中注冊-->
<!-- mapper文件的位置是為了找到要執(zhí)行的sql語句
resources屬性指定的是mapper文件的路徑
這個路徑是從target/classes路徑開始的
用/作為分隔符-->
<mappers>
<!-- <mapper resource="mappers/UserMapper.xml"/>-->
<!-- 這個時候,這個包里面的所有配置文件都會被引入-->
<!-- 以包為單位引入映射文件
要求:
1.mapper接口所在的包要和映射文件所在的包一致
2.mapper接口要和映射文件的名字一致
-->
<package name="com.atguigu.mybatis.mapper"/>
</mappers>
</configuration>
4.在resources目錄下面建立mapper映射文件

5.測試
//加載核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//獲取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//獲取SqlSessionFactory 工廠模式
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//獲取mybatis操作的會話對象
//sqlSession默認是不自動提交事務(wù)的,如果我們寫上參數(shù)true,就代表自動提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//獲取mapper接口的對象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.insertUser();
//提交事務(wù)
// sqlSession.commit();
System.out.println("結(jié)果:"+i);補充:MyBatis_自定義結(jié)果映射規(guī)則
自定義resultMap,實現(xiàn)高級結(jié)果集映射
在EmployeeMapperPlus.xml中有:
package com.atguigu.mybatis.dao;
import java.util.List;
import com.atguigu.mybatis.bean.Employee;
public interface EmployeeMapperPlus {
? ? public Employee getEmpById(Integer id);
}在EmployeeMapperPlus.xml中實現(xiàn)方法:
? ? <!--自定義某個javaBean的封裝規(guī)則
? ? type:自定義規(guī)則的Java類型
? ? id:唯一id方便引用
? ? ? -->
? ? <resultMap type="com.atguigu.mybatis.bean.Employee" id="MySimpleEmp">
? ? ? ? <!--指定主鍵列的封裝規(guī)則
? ? ? ? id用來定義主鍵,會底層有優(yōu)化;
? ? ? ? column:指定哪一列
? ? ? ? property:指定對應(yīng)的javaBean屬性
? ? ? ? ? -->
? ? ? ? <id column="id" property="id"/>
? ? ? ? <!-- result定義普通列封裝規(guī)則 -->
? ? ? ? <result column="last_name" property="lastName"/>
? ? ? ? <!-- 其他不指定的列會自動封裝:我們只要寫resultMap就把全部的映射規(guī)則都寫上。 -->
? ? ? ? <result column="email" property="email"/>
? ? ? ? <result column="gender" property="gender"/>
? ? </resultMap>
? ? <!-- resultMap:自定義結(jié)果集映射規(guī)則; ?-->
? ? <!-- resultMap與resultType只能二選一 ?-->
? ? <!-- public Employee getEmpById(Integer id); -->
? ? <select id="getEmpById" ?resultMap="MySimpleEmp">
? ? ? ? select * from tbl_employee where id=#{id}
? ? </select>測試:
先把駝峰命名法關(guān)了<setting name="mapUnderscoreToCamelCase" value="false"/>,或者注釋掉也可以
@Test
public void test05() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
Employee empById = mapper.getEmpById(1);
System.out.println(empById);
}finally{
openSession.close();
}
}
即使把駝峰命名關(guān)了還是可以按照我們自定義的規(guī)則封裝成功的

總結(jié)
到此這篇關(guān)于Mybatis映射文件規(guī)則的文章就介紹到這了,更多相關(guān)Mybatis映射文件規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在SpringBoot 中使用 Druid 數(shù)據(jù)庫連接池
這篇文章主要介紹了SpringBoot 中使用 Druid 數(shù)據(jù)庫連接池的實現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下2021-03-03
SpringSecurity框架下實現(xiàn)CSRF跨站攻擊防御的方法
CSRF是一種網(wǎng)絡(luò)攻擊方式,也可以說是一種安全漏洞,這種安全漏洞在web開發(fā)中廣泛存在。這篇文章主要介紹了SpringSecurity框架下實現(xiàn)CSRF跨站攻擊防御,需要的朋友可以參考下2019-12-12
詳解Mybatis是如何把數(shù)據(jù)庫數(shù)據(jù)封裝到對象中的
這篇文章主要介紹了Mybatis是如何把數(shù)據(jù)庫數(shù)據(jù)封裝到對象中的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java實現(xiàn)基于JDBC操作mysql數(shù)據(jù)庫的方法
這篇文章主要介紹了Java實現(xiàn)基于JDBC操作mysql數(shù)據(jù)庫的方法,結(jié)合實例形式分析了java使用JDBC實現(xiàn)針對mysql數(shù)據(jù)庫的連接、查詢、輸出等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
springboot ApplicationContextInitializer的三種使用方法小結(jié)
這篇文章主要介紹了關(guān)于ApplicationContextInitializer的三種使用方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

