02-MyBatis基本使用

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章