MyBatis基本使用
MyBatis是一個半自動化的ORM(對象關係映射)框架,她的核心就在於Sql語句和對象的關係映射上面。總的來說,MyBatis的對象關係映射主要有兩種方式:xml配置文件和註解方式。
xml配置文件方式
1.namespace命名空間
MyBatis的映射文件內容都包含在一個namespace中,這個namespace中的名稱必須和Mapper接口名稱一致,並且還包括完整的包名。
比如:
package com.kestiny.mybatis.mapper;
public interface PersonMapper {}
<mapper namespace="com.kestiny.mybatis.mapper.PersonMapper"></mapper>>
2.Sql語句對應標籤
MyBatis對象映射文件的Sql語句對應標籤和sql語句完全一致
<select/>
<delete/>
<insert/>
<update/>
以select爲例,我們看下標籤是怎麼和Sql語句進行映射的。
假設我們有一個實體對象Person及其Mapper接口
public class Person {
private Integer id;
private String name;
private Integer sex;
private String pswd;
private String mobile;
private String nickname;
private Timestamp lastLoginTime;
}
public interface PersonMapper {
public Person selectById(@Param("id") Integer id);
}
我們需要編寫對應的映射select配置如下
<select id="selectById" parameterType="int" resultType="Person">
select * from person where id = #{id}
</select>
其中,
- id:對應的是Mapper中方法的名稱,一定要保持一致;
- parameterType:對應的是方法中傳入的參數類型;
- resultType:對應的方法返回的對象類型;
- @Param(“id”):方法名稱中的@Param註解,表示的是此參數傳到xml後的名稱,可以省略,省略的話名稱等同於方法中形參的名稱;
- @Param: 多個參數時一定要使用此註解,否則只能按照順利獲取參數,非常麻煩;
- 在標籤內寫入我們正常的Sql語句即可
其他的幾種標籤使用方式和select完全一致
<delete id="delete" parameterType="int">
delete from person where nid = #{id}
</delete>
<insert id="save" parameterType="Person">
insert into person
(nid,name,pswd,mobile,nickname,LastLoginTime)
values
(#{id},#{name},#{pswd},#{mobile},#{nickname},#{lastLoginTime})
</insert>
<update id="update" parameterType="Person">
update person
<set>
<if test="name != null">name=#{name},</if>
<if test="pswd != null">pswd=#{pswd},</if>
<if test="mobile != null">mobile=#{mobile},</if>
<if test="nickname != null">nickname=#{nickname},</if>
<if test="lastLoginTime != null">LastLoginTime=#{lastLoginTime},</if>
</set>
where nid=#{id}
</update>
3.數據庫字段名稱和實體類屬性名稱不一致解決
1.數據庫字段和實體屬性使用駝峯方式
這種方式下,比如數據庫字段使用的經典下劃線方式last_login_time,實體屬性使用駝峯方式lastLoginTime,針對這種情況,需要在MyBatis核心配置文件中配置開啓自動駝峯命名轉換即可。
<settings>
<!--MyBatis默認是關閉自動駝峯命名轉換的-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
2.命名完全不一致
當數據庫字段名和Java屬性名稱完全不一致時,就需要使用resultMap進行數據庫字段和Java屬性名稱的映射,具體實現如下:
<resultMap id="BaseResultMap" type="Person">
<id column="nid" jdbcType="INTEGER" property="id" javaType="int"/>
</resultMap>
<select id="selectAll" resultMap="BaseResultMap">
select * from person
</select>
- 標籤名稱叫resultMap,它一般需要設置兩個屬性
- id:resultMap的名稱
- type:resultMap對應的Java實體類,注意這裏的名稱規則,如果沒有使用應該是包的全名,若想省略包名,則需要配置MyBatis的核心xml文件
<typeAliases> <package name="com.kestiny.mybatis.entities"/> </typeAliases>
- resultMap包含多個標籤,每個id標籤都是一個數據庫字段和Java實體屬性的對應關係,其中
- column:數據庫字段名
- property:Java實體類屬性名稱
- jdbcType:MyBatis的據類型,和javaType有對應關係
- javaType:Java類型,和jdbcType有對應關係
註解方式
註解的實現方式,是把sql語句寫在對應的Mapper方法上面,需要寫Mapper.xml文件。按說大多數Java庫的註解方式都比配置方式簡單並且功能一致甚至更強加,但是MyBatis是那個一個例外,註解的方式只對簡單sql有用,比較複雜的語句註解應對起來簡直太難了!
註解的使用十分簡單
@Select("select * from person")
public List<Person> select();
@Delete("delete from person where id=#{id}")
public int delete(String id);
@Update("update person set name=#{name},age=#{age} where id=#{id}")
public int update(Person person);
@Insert("insert into person(id, name,age) values (#{id},#{name},#{age})")
public int add(Person person);
date(Person person);
@Insert("insert into person(id, name,age) values (#{id},#{name},#{age})")
public int add(Person person);