日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis映射文件(一)

發(fā)布時(shí)間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis映射文件(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一.MyBatis映射文件

1.insert、update、delete元素

2.主鍵生成方式

3.參數(shù)(Parameters)傳遞

(1)單個(gè)參數(shù)

(2)多個(gè)參數(shù)

(3)命名參數(shù)

(4)POJO

(5)Map

(6)注意

4.參數(shù)(Parameters)處理

(1)#{}和${}的區(qū)別

(2)null值的處理


一.MyBatis映射文件

1.insert、update、delete元素

<mapper namespace="com.itheima.dao.EmployeeDao"> <!--插入 --><insert id="addEmp">INSERT INTO tb1_employee(name,email,gender) VALUES (#{name},#{email},#{gender})</insert><!--更新 --><update id="updateEmp">UPDATE tb1_employee set name= #{name},email=#{email},gender=#{gender} WHERE id=#{id}</update><!--刪除 --><delete id="deleteEmp">delete from tb1_employee where id=#{id}</delete> </mapper> public interface EmployeeDao {Employee getEmpById(Integer id); ?void addEmp(Employee employee); ?void deleteEmp(Integer id); ?void updateEmp(Employee employee); }

2.主鍵生成方式

  • 若數(shù)據(jù)庫(kù)支持自動(dòng)生成主鍵的字段,則可以設(shè)置useGeneratedKeys="true",然后把keyProperty設(shè)置到目標(biāo)屬性上

<insert id="addEmp" parameterType="com.itheima.bean.Employee"useGeneratedKeys="true" keyProperty="id" databaseId="mysql">insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})</insert>
  • 對(duì)于不支持自增性主鍵的數(shù)據(jù)庫(kù)(例如Oracle),可以使用selectKey子元素,selectKey元素將會(huì)首先運(yùn)行,id會(huì)被設(shè)置,然后插入語(yǔ)句會(huì)被調(diào)用

<insert id="addEmp" databaseId="oracle"><!-- keyProperty:查出的主鍵值封裝給javaBean的哪個(gè)屬性order="BEFORE":當(dāng)前sql在插入sql之前運(yùn)行AFTER:當(dāng)前sql在插入sql之后運(yùn)行resultType:查出的數(shù)據(jù)的返回值類型BEFORE運(yùn)行順序:先運(yùn)行selectKey查詢id的sql;查出id值封裝給javaBean的id屬性在運(yùn)行插入的sql;就可以取出id屬性對(duì)應(yīng)的值A(chǔ)FTER運(yùn)行順序:先運(yùn)行插入的sql(從序列中取出新值作為id);再運(yùn)行selectKey查詢id的sql;--><selectKey keyProperty="id" order="BEFORE" resultType="Integer"><!-- 編寫(xiě)查詢主鍵的sql語(yǔ)句 --><!-- BEFORE-->select EMPLOYEES_SEQ.nextval from dual <!-- AFTER:select EMPLOYEES_SEQ.currval from dual --></selectKey><!-- 插入時(shí)的主鍵是從序列中拿到的 --><!-- BEFORE:-->insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) values(#{id},#{lastName},#{email<!-- ,jdbcType=NULL -->}) <!-- AFTER:insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) values(employees_seq.nextval,#{lastName},#{email}) --></insert>

3.參數(shù)(Parameters)傳遞

(1)單個(gè)參數(shù)

可以接受基本類型,對(duì)象類型,集合類型的值

<select id="selectUsers" resultType="User">select id, username, passwordfrom userswhere id = #{id} </select>

一個(gè)非常簡(jiǎn)單的命名參數(shù)映射。參數(shù)類型被設(shè)置為 int,這樣這個(gè)參數(shù)就可以被設(shè)置成任何內(nèi)容。原生的類型或簡(jiǎn)單數(shù)據(jù)類型(比如整型和字符串)因?yàn)闆](méi)有相關(guān)屬性,它會(huì)完全用參數(shù)值來(lái)替代。

(2)多個(gè)參數(shù)

任意多個(gè)參數(shù),都會(huì)被MyBatis重新包裝成一個(gè)Map傳入,Map的key是param1,param2...

<select id="selectUsers" resultType="User">select id, username, passwordfrom userswhere id = #{param1}and username = #{param2} </select>

?

(3)命名參數(shù)

為參數(shù)使用@Param起一個(gè)名字,MyBatis會(huì)將這些參數(shù)封裝到map中,key就是@Param的value值

User selectUsers(@Param("id") Integer id, @Param("name") String name); <select id="selectUsers" resultType="User">select id, username, passwordfrom userswhere id = #{id}and username = #{name} </select>

(4)POJO

當(dāng)這些參數(shù)屬于我們的業(yè)務(wù)POJO時(shí),直接傳遞POJO

void addEmp(Employee employee); <insert id="addEmp">INSERT INTO tb1_employee(name,email,gender) VALUES (#{name},#{email},#{gender}) </insert>

(5)Map

也可以封裝多個(gè)參數(shù)為map,直接傳遞,#{map中的key}取出map中對(duì)應(yīng)的值

(6)注意

如果是Collection(List、Set)類型或者是數(shù)組,也會(huì)特殊處理。也是把傳入的list或者數(shù)組封裝在map中。

Collection(collection)

List(list)

數(shù)組(array)

public Employee getEmpById(List<Integer> ids); <!--取值:取出第一個(gè)id的值 -->#{list[0]}

4.參數(shù)(Parameters)處理

(1)#{}和${}的區(qū)別

  • #{}:是以預(yù)編譯的形式,將參數(shù)設(shè)置到sql語(yǔ)句中,可以防止sql注入

  • ${}:取出的值直接拼接在sql語(yǔ)句中,會(huì)有安全問(wèn)題

select * from tbl_employee where id=${id} and last_name=#{lastName} Preparing: select * from tbl_employee where id=2 and last_name=?
  • 大多情況下,我們?nèi)?shù)的值都應(yīng)該去使用#{}

  • 在原生jdbc不支持占位符的地方我們可以使用${}進(jìn)行取值

    比如分表、排序等

<!-- 按照年份分表查詢--> select * from ${year}_salary where xxx; <!--按照姓名進(jìn)行排序 --> select * from tbl_employee order by ${f_name}

(2)null值的處理

  • 參數(shù)位置支持的屬性:

javaType、jdbcType、mode、numericScale、

resultMap、typeHandler、jdbcTypeName、expression

  • jdbcType通常需要被設(shè)置

    在我們數(shù)據(jù)為null的時(shí)候,有些數(shù)據(jù)庫(kù)(Oracle)可能不能識(shí)別mybatis對(duì)null的默認(rèn)處理,會(huì)報(bào)錯(cuò)。

    JdbcType OTHER:無(wú)效的類型 。因?yàn)閙ybatis對(duì)所有的null都映射的是原生Jdbc的OTHER類型,oracle不能正確處理。

  • 解決方法

①參數(shù)后面直接指定

#{email,jdbcType=OTHER}

②全局配置中Setting配置

<setting><setting name="jdbcTypeForNull" value="NULL"/> </setting>

?

總結(jié)

以上是生活随笔為你收集整理的MyBatis映射文件(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。