Mybatis核心配置文件、默認(rèn)類(lèi)型別名、Mybatis獲取參數(shù)值的兩種方式(實(shí)例代碼)
一、核心配置文件詳解
核心配置文件中的標(biāo)簽必須按照固定的順序(有的標(biāo)簽可以不寫(xiě),但順序一定不能亂):
properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mappers
<?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文件,此時(shí)就可以${屬性名}的方式訪(fǎng)問(wèn)屬性值--> <properties resource="jdbc.properties"></properties> <settings> <!--將表中字段的下劃線(xiàn)自動(dòng)轉(zhuǎn)換為駝峰--> <setting name="mapUnderscoreToCamelCase" value="true"/> <!--開(kāi)啟延遲加載--> <setting name="lazyLoadingEnabled" value="true"/> </settings> <typeAliases> <!-- typeAlias:設(shè)置某個(gè)具體的類(lèi)型的別名 屬性: type:需要設(shè)置別名的類(lèi)型的全類(lèi)名 alias:設(shè)置此類(lèi)型的別名,且別名不區(qū)分大小寫(xiě)。若不設(shè)置此屬性,該類(lèi)型擁有默認(rèn)的別名,即類(lèi)名 --> <!--<typeAlias type="com.atguigu.mybatis.bean.User"></typeAlias>--> <!--<typeAlias type="com.atguigu.mybatis.bean.User" alias="user"> </typeAlias>--> <!--以包為單位,設(shè)置改包下所有的類(lèi)型都擁有默認(rèn)的別名,即類(lèi)名且不區(qū)分大小寫(xiě)--> <package name="com.atguigu.mybatis.bean"/> </typeAliases> <!-- environments:設(shè)置多個(gè)連接數(shù)據(jù)庫(kù)的環(huán)境 屬性: default:設(shè)置默認(rèn)使用的環(huán)境的id --> <environments default="mysql_test"> <!-- environment:設(shè)置具體的連接數(shù)據(jù)庫(kù)的環(huán)境信息 屬性: id:設(shè)置環(huán)境的唯一標(biāo)識(shí),可通過(guò)environments標(biāo)簽中的default設(shè)置某一個(gè)環(huán)境的id,表示默認(rèn)使用的環(huán)境 --> <environment id="mysql_test"> <!-- transactionManager:設(shè)置事務(wù)管理方式 屬性: type:設(shè)置事務(wù)管理方式,type="JDBC|MANAGED" type="JDBC":設(shè)置當(dāng)前環(huán)境的事務(wù)管理都必須手動(dòng)處理 type="MANAGED":設(shè)置事務(wù)被管理,例如spring中的AOP --> <transactionManager type="JDBC"/> <!-- dataSource:設(shè)置數(shù)據(jù)源 屬性: type:設(shè)置數(shù)據(jù)源的類(lèi)型,type="POOLED|UNPOOLED|JNDI" type="POOLED":使用數(shù)據(jù)庫(kù)連接池,即會(huì)將創(chuàng)建的連接進(jìn)行緩存,下次使用可以從緩存中直接獲取,不需要重新創(chuàng)建 type="UNPOOLED":不使用數(shù)據(jù)庫(kù)連接池,即每次使用連接都需要重新創(chuàng)建 type="JNDI":調(diào)用上下文中的數(shù)據(jù)源 --> <dataSource type="POOLED"> <!--設(shè)置驅(qū)動(dòng)類(lèi)的全類(lèi)名--> <property name="driver" value="${jdbc.driver}"/> <!--設(shè)置連接數(shù)據(jù)庫(kù)的連接地址--> <property name="url" value="${jdbc.url}"/> <!--設(shè)置連接數(shù)據(jù)庫(kù)的用戶(hù)名--> <property name="username" value="${jdbc.username}"/> <!--設(shè)置連接數(shù)據(jù)庫(kù)的密碼--> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <!-- <mapper resource="UserMapper.xml"/> --> <!-- 以包為單位,將包下所有的映射文件引入核心配置文件 注意: 1. 此方式必須保證mapper接口和mapper映射文件必須在相同的包下 2. mapper接口要和mapper映射文件的名字一致 --> <package name="com.atguigu.mybatis.mapper"/> </mappers> </configuration>
二、默認(rèn)的類(lèi)型別名
三、MyBatis的增刪改查
添加
<!--int insertUser();--> <insert id="insertUser"> insert into t_user values(null,'admin','123456',23,'男','12345@qq.com') </insert>
刪除
<!--int deleteUser();--> <delete id="deleteUser"> delete from t_user where id = 6 </delete>
修改
<!--int updateUser();--> <update id="updateUser"> update t_user set username = '張三' where id = 5 </update>
查詢(xún)一個(gè)實(shí)體類(lèi)對(duì)象
<!--User getUserById();--> <select id="getUserById" resultType="com.atguigu.mybatis.bean.User"> select * from t_user where id = 2 </select>
查詢(xún)集合
<!--List<User> getUserList();--> <select id="getUserList" resultType="com.atguigu.mybatis.bean.User"> select * from t_user </select>
注意:
- 查詢(xún)的標(biāo)簽select必須設(shè)置屬性resultType或resultMap,用于設(shè)置實(shí)體類(lèi)和數(shù)據(jù)庫(kù)表的映射關(guān)系
- resultType:自動(dòng)映射,用于屬性名和表中字段名一致的情況
- resultMap:自定義映射,用于一對(duì)多或多對(duì)一或字段名和屬性名不一致的情況
- 當(dāng)查詢(xún)的數(shù)據(jù)為多條時(shí),不能使用實(shí)體類(lèi)作為返回值,只能使用集合,否則會(huì)拋出異常TooManyResultsException;但是若查詢(xún)的數(shù)據(jù)只有一條,可以使用實(shí)體類(lèi)或集合作為返回值
四、MyBatis獲取參數(shù)值的兩種方式
- MyBatis獲取參數(shù)值的兩種方式:${}和#{}
- ${}的本質(zhì)就是字符串拼接,#{}的本質(zhì)就是占位符賦值
- ${}使用字符串拼接的方式拼接sql,若為字符串類(lèi)型或日期類(lèi)型的字段進(jìn)行賦值時(shí),需要手動(dòng)加單引號(hào);但是#{}使用占位符賦值的方式拼接sql,此時(shí)為字符串類(lèi)型或日期類(lèi)型的字段進(jìn)行賦值時(shí),可以自動(dòng)添加單引號(hào)
1、單個(gè)字面量類(lèi)型的參數(shù)
若mapper接口中的方法參數(shù)為單個(gè)的字面量類(lèi)型,此時(shí)可以使用${}和#{}以任意的名稱(chēng)(最好見(jiàn)名識(shí)意)獲取參數(shù)的值,注意${}需要手動(dòng)加單引號(hào)
<!--User getUserByUsername(String username);--> <select id="getUserByUsername" resultType="User"> select * from t_user where username = #{username} </select>
<!--User getUserByUsername(String username);--> <select id="getUserByUsername" resultType="User"> select * from t_user where username = '${username}' </select>
2、多個(gè)字面量類(lèi)型的參數(shù)
- 若mapper接口中的方法參數(shù)為多個(gè)時(shí),此時(shí)MyBatis會(huì)自動(dòng)將這些參數(shù)放在一個(gè)map集合中
以arg0,arg1…為鍵,以參數(shù)為值;
以param1,param2…為鍵,以參數(shù)為值;
- 因此只需要通過(guò)${}和#{}訪(fǎng)問(wèn)map集合的鍵就可以獲取相對(duì)應(yīng)的值,注意${}需要手動(dòng)加單引號(hào)。
- 使用arg或者param都行,要注意的是,arg是從arg0開(kāi)始的,param是從param1開(kāi)始的
<!--User checkLogin(String username,String password);--> <select id="checkLogin" resultType="User"> select * from t_user where username = #{arg0} and password = #{arg1} </select>
<!--User checkLogin(String username,String password);--> <select id="checkLogin" resultType="User"> select * from t_user where username = '${param1}' and password = '${param2}' </select>
3、map集合類(lèi)型的參數(shù)
若mapper接口中的方法需要的參數(shù)為多個(gè)時(shí),此時(shí)可以手動(dòng)創(chuàng)建map集合,將這些數(shù)據(jù)放在map中只需要通過(guò)${}和#{}訪(fǎng)問(wèn)map集合的鍵就可以獲取相對(duì)應(yīng)的值,注意${}需要手動(dòng)加單引號(hào)
<!--User checkLoginByMap(Map<String,Object> map);--> <select id="checkLoginByMap" resultType="User"> select * from t_user where username = #{username} and password = #{password} </select>
@Test public void checkLoginByMap() { SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); Map<String,Object> map = new HashMap<>(); map.put("usermane","admin"); map.put("password","123456"); User user = mapper.checkLoginByMap(map); System.out.println(user); }
4、實(shí)體類(lèi)類(lèi)型的參數(shù)
若mapper接口中的方法參數(shù)為實(shí)體類(lèi)對(duì)象時(shí)此時(shí)可以使用${}和#{},通過(guò)訪(fǎng)問(wèn)實(shí)體類(lèi)對(duì)象中的屬性名獲取屬性值,注意${}需要手動(dòng)加單引號(hào)
<!--int insertUser(User user);--> <insert id="insertUser"> insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email}) </insert>
@Test public void insertUser() { SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = new User(null,"Tom","123456",12,"男","123@321.com"); mapper.insertUser(user); }
5、使用@Param標(biāo)識(shí)參數(shù)
- 可以通過(guò)@Param注解標(biāo)識(shí)mapper接口中的方法參數(shù),此時(shí),會(huì)將這些參數(shù)放在map集合中
- 以@Param注解的value屬性值為鍵,以參數(shù)為值;
- 以param1,param2…為鍵,以參數(shù)為值;
- 只需要通過(guò)${}和#{}訪(fǎng)問(wèn)map集合的鍵就可以獲取相對(duì)應(yīng)的值,注意${}需要手動(dòng)加單引號(hào)
<!--User CheckLoginByParam(@Param("username") String username, @Param("password") String password);--> <select id="CheckLoginByParam" resultType="User"> select * from t_user where username = #{username} and password = #{password} </select>
@Test public void checkLoginByParam() { SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); mapper.CheckLoginByParam("admin","123456"); }
建議分成兩種情況進(jìn)行處理
- 實(shí)體類(lèi)類(lèi)型的參數(shù)
- 使用@Param標(biāo)識(shí)參數(shù)
總結(jié)
以上就是Mybatis之核心配置文件詳解、默認(rèn)類(lèi)型別名、Mybatis獲取參數(shù)值的兩種方式的相關(guān)知識(shí)點(diǎn),希望對(duì)你有所幫助。
到此這篇關(guān)于Mybatis核心配置文件、默認(rèn)類(lèi)型別名、Mybatis獲取參數(shù)值的兩種方式的文章就介紹到這了,更多相關(guān)Mybatis獲取參數(shù)值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Hadoop源碼分析六啟動(dòng)文件namenode原理詳解
本篇是Hadoop源碼分析系列文章第六篇,主要介紹Hadoop中的啟動(dòng)文件namenode,后續(xù)本系列文章會(huì)持續(xù)更新,有需要的朋友可以借鑒參考下2021-09-09java基于jdbc連接mysql數(shù)據(jù)庫(kù)功能實(shí)例詳解
這篇文章主要介紹了java基于jdbc連接mysql數(shù)據(jù)庫(kù)功能,結(jié)合實(shí)例形式詳細(xì)分析了jdbc連接mysql數(shù)據(jù)庫(kù)的原理、步驟、實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Java實(shí)現(xiàn)的簡(jiǎn)單音樂(lè)播放器功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)單音樂(lè)播放器功能,涉及java針對(duì)多媒體文件相關(guān)載入、播放相關(guān)操作技巧,需要的朋友可以參考下2019-02-02java中獲取當(dāng)前服務(wù)器的Ip地址的方法
本篇文章主要介紹了java中獲取當(dāng)前服務(wù)器的Ip地址的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02IDEA創(chuàng)建Servlet并配置web.xml的實(shí)現(xiàn)
這篇文章主要介紹了IDEA創(chuàng)建Servlet并配置web.xml的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java數(shù)據(jù)結(jié)構(gòu)與算法之雙向鏈表、環(huán)形鏈表及約瑟夫問(wèn)題深入理解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之雙向鏈表、環(huán)形鏈表及約瑟夫問(wèn)題深入理解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09java ArrayList集合中的某個(gè)對(duì)象屬性進(jìn)行排序的實(shí)現(xiàn)代碼
這篇文章主要介紹了java ArrayList集合中的某個(gè)對(duì)象屬性進(jìn)行排序的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-07-07Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解
橋接,顧名思義,就是用來(lái)連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過(guò)示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下2022-09-09Java構(gòu)建JDBC應(yīng)用程序的實(shí)例操作
在本篇文章里小編給大家整理了一篇關(guān)于Java構(gòu)建JDBC應(yīng)用程序的實(shí)例操作,有興趣的朋友們可以學(xué)習(xí)參考下。2021-03-03