日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

MyBatis 提供了XML配置和注解配置兩種方式。今天就來搞搞這兩種方式是如何實現的。

MyBatis 的真正強大在于它的語句映射,這是它的魔力所在。由于它的異常強大,映射器的 XML 文件就顯得相對簡單。如果拿它跟具有相同功能的JDBC 代碼進行對比,你會立即發現省掉了將近 95% 的代碼。MyBatis 致力于減少使用成本,讓用戶能更專注于 SQL 代碼。

來自官網。

Mybatis映射九個頂級元素:

Mybatis 中xml和注解映射,分分鐘搞定

 

  • mApper:映射文件的根節點,只有一個屬性namespace(命名空間),作用如下:
  • 用于區分不同的mapper,全局唯一。
  • 綁定DAO接口,即面向接口編程,當綁定一個接口,就不用寫此接口的實現類,會通過接口的完全限定名找到對應的mapper配置來執行SQL語句,所以,namespace的命名必須要寫接口的完全限定名。
  • cache:配置給定命名空間的緩存。
  • cache-ref:從其他命名空間引用緩存配置。
  • resultMap:用來描述數據庫結果集和對象的對應關系。
  • sql:可以重用的SQL塊,也可以被其他語句引用。通常是存放一些公用性的SQL。
  • insert:映射插入語句。
  • update:更新映射語句。
  • delete:刪除映射語句。
  • select:映射查詢語句。

 

Mybatis 中xml和注解映射,分分鐘搞定

 

xml方式

九個頂級映射元素對應標簽:

<mapper namespace="com.tian.mybatis.mapper.UserMapper">
    <resultMap id="" type=""></resultMap>
    <sql id=""></sql>
    <cache blocking="" ></cache>
    <cache-ref namespace=""></cache-ref>
    <select id="selectUserById"></select>
    <insert id="insert" ></insert>
    <update id=""></update>
    <delete id=""></delete>
</mapper>

select詳解

 

Mybatis 中xml和注解映射,分分鐘搞定

 

可以看得出,后面可選項還是蠻多的。下面是官網對每項的解釋。

Mybatis 中xml和注解映射,分分鐘搞定

 

select使用案例

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tian.mybatis.mapper.UserMapper">
    <select id="selectUserById"  resultType="com.tian.mybatis.entity.User" parameterType="int" >
        select * from m_user where id = #{id}
    </select>
</mapper>
  • id必須在這個Mapper中是唯一的,可以被用來引用這條語句 ,這個id必須與之對應的是XxxMapper.JAVA中的方法,必須是一一對應。
  • 返回類型:User類型,resultType:查詢語句返回結果類型的完全限定名或別名。別名使用方式和parameterType是一樣的。
  • 參數:整形,表示查詢語句傳入參數的類型和完全限定名或別名。支持基礎數據類型和復雜數據類型。

#{參數名}:告訴MyBatis生成的PreparedStatement參數,相對于JDBC中,該參數被標識為‘?’。

別名與參數映射類型如下:

Mybatis 中xml和注解映射,分分鐘搞定

 

返回類型中別名的使用,注意:

如果是我們的entity類,那么resultType是無法使用別名的,只能使用resultMap才可以使用別名。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tian.mybatis.mapper.UserMapper">
    <resultMap id="User" type="com.tian.mybatis.entity.User"/>
    <select id="selectUserById"  resultMap="User" parameterType="int" >
        select * from m_user where id = #{id}
    </select>
</mapper>

但是如果使用的上面映射表里,也可以直接使用別名。

數據庫里有兩條數據:

Mybatis 中xml和注解映射,分分鐘搞定

 

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tian.mybatis.mapper.UserMapper">
    <select id="countUser" resultType="int">
        select count(1) from m_user
    </select>
</mapper>

UserMapper.java

import com.tian.mybatis.entity.User;
public interface UserMapper {
    int countUser();
}

測試類:

public class MybatisApplication {
    public static final String URL = "jdbc:MySQL://localhost.com:3306/mblog?useUnicode=true";
    public static final String USER = "root";
    public static final String PASSword = "123456";
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        SqlSession sqlSession = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            //工廠模式
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //獲取sql操作會話
            sqlSession = sqlSessionFactory.openSession();
            //構造對象(這里比較特殊,這里構造對象的方式后面會專門分享)
            UserMapper userMapper =  sqlSession.getMapper(UserMapper.class);
            //查詢統計
            System.out.println(userMapper.countUser());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            sqlSession.close();
        }
    }
}

輸出:2

當數據庫表中的字段名和我們entity中的字段名不一致,怎么處理?

在實際開發中,這種常見是在所難免。我們可以使用下面的這種方式解決。

實體類User

public class User {
    private Integer id;
    private String userName;
    private Integer age; 
    //set get toString方法這里就不貼了
}

UserMapper.xml文件內容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tian.mybatis.mapper.UserMapper">
    <resultMap id="User" type="com.tian.mybatis.entity.User">
        <id column="id" property="id"/>
        <result column="name" property="userName"/>
    </resultMap>
    <select id="selectUserById"  resultMap="User" parameterType="int" >
        select * from m_user where id = #{id}
    </select>
</mapper>

 

Mybatis 中xml和注解映射,分分鐘搞定

 

  • type:對應的是我們的實體類,全路徑名。
  • id:可以理解為別名。

 

Mybatis 中xml和注解映射,分分鐘搞定

 

  • id:唯一標識,此id值用于select元素resultMap屬性的引用。
  • column:對應我們數據庫表中的字段名稱。
  • property:對應我們的實體類的屬性,比如:User中的屬性userName,要和數據庫表m_user中的name對應。
  • result:標識一些簡單屬性,其中column屬性代表數據庫的字段名,property代表查詢出來的字段名映射到實體類的某個屬性。

繼續使用我們前面的測試類進行測試:

UserMapper userMapper =  sqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.selectUserById(1));

輸出:User{id=1, userName='tian', age=22}

注意:實體類的get set 和toString()方法這里給省略, 希望大家在使用的使用,使用快捷鍵很簡單的就搞定了。

上面提到過resultType和resultMap,那么他們兩到底有什么區別呢?

resultType和resultMap 有什么區別?

  • resultType:直接表示返回類型, 包括基本數據類型和復雜數據類型。
  • resultMap:外部resultMap定義的引用,通過對應的外部resultMap的id,表示結果映射到哪個resultMap上,一般用于字段名和屬性名不一致的情況,或者需要做復雜的聯合查詢以便自由控制映射結果。

兩者的關聯

當進行查詢時,查詢出來的每個字段都會放在一個Map里,當查詢元素返回屬性是resultType的時候,會將鍵值對取出賦所指定的屬性。其實MyBatis的每個查詢映射的返回類型都是resultMap,只是當我們使用resultType的時候,會自動把對應的值賦給所指定的對象屬性,當使用resultMap時候,因為map不是很好的表示領域,我們就進一步的轉化為對應的實體對象。resultMap主要作用于復雜的聯合查詢上。

resultMap的自動映射級別:默認級別為PARTIAL,也可以在settings更改值。

注意:resultType和resultMap本質是一樣的,都是Map數據結構,但是二者不能同時存在。

增刪改案例

insert

Mybatis 中xml和注解映射,分分鐘搞定

 

從這里可以知道,關于增加insert是沒有返回值類型可以讓我們指定的。默認返回int類型。

<insert id="insert" parameterType="com.tian.mybatis.entity.User">
        INSERT INTO m_user(`name`,age) VALUES ( #{userName},#{age})
</insert>

對應Mapper中的方法

int insert(User user);

另外的update和delete類似,這里就沒有必要逐一演示了。

注解方式

九個頂級映射元素對應注解:

Mybatis 中xml和注解映射,分分鐘搞定

 

其他部分注解是配合九個注解進行使用的。

select注解

把本地的UserMapper.xml刪掉,然后改一下mybatis-config.xml,把其中的UserMapper.xml給注釋掉。添加

<mapper class="com.tian.mybatis.mapper.UserMapper"/>

UserMapper.java添加注解

public interface UserMapper {
    @Select("select * from m_user where id = #{id}")
    User selectUserById(Integer id);
}

再次測試

User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById", 1);
System.out.println(user);

輸出:

User{id=1, userName='null', age=22}

從輸出內容看到,userName為null,這也是因為和數據庫表格中的字段name不一致導致的,那么如何處理呢?

這么搞,再添加一個注解:

public interface UserMapper {
   @Select("select * from m_user where id = #{id}")
   @Results( @Result(column = "name",property = "userName"))
   User selectUserById(Integer id);
}

輸出:

User{id=1, userName='tian', age=22}

這樣也就是在使用注解的時候,處理實體屬性名和數據庫表字段名不一樣的問題的辦法。

insert、update、delete同樣也可以使用注解來搞定了。

@Insert、@Update、@Delete配上相應的SQL語句。

注解和xml是否可以共存?

    <update id="updateAuthorIfNecessary">
        update m_user
        <trim prefix="SET" suffixOverrides=",">
            <if test="userName != null and userName != ''">
                `name` = #{userName},
            </if>
            <if test="gender != null and gender != 0">
                gender = #{gender},
            </if>
            <if test="age != null and age != 0">
                age = #{age},
            </if>
        </trim>
        where id=#{id}
    </update>

同時在UserMapper.java中的方法上添加注解

@Update("update m_user set  `name` = #{userName},gender = #{gender},age = #{age} where id=#{id}")
int updateAuthorIfNecessary(User user);

再次中子星的時候回報異常的:

nested exception is java.lang.IllegalArgumentException:
Mapped Statements collection already contains value for com.tian.mybatis.mapper.UserMapper.updateAuthorIfNecessary. 
please check file [D:workspacemy_codemybatistargetclassesmapperUserMapper.xml] and com/tian/mybatis/mapper/UserMapper.java (best guess)

大致意思就是說,已經存在了,即就是不能同時使用xml和注解。二者選其一。

xml可以和注解結合使用,但是得保證同一個方法不能同時存在xml和注解。

建議

簡單的sql處理可以使用注解,復雜的sql使用xml。但是實際工作還得看你待的項目中有沒有對這個進行規范化。

在項目中無非就三種:

1.全部必須使用xml方式。

2.全部必須使用注解方式。

3.可以同時使用xml和注解。

高級映射

association

映射到JavaBean的某個復雜的”數據類型”屬性,僅處理一對一的關聯關系。

<resultMap type="com.tian.mybatis.entity.User" id="userMapRole">
        <id column="id" property="id" />
        <result column="name" property="userName" />
        <result column="age" property="age" />
        <association property="role" javaType="UserRole">
            <id column="id" property="id" />
            <result column="roleName" property="roleName" />
        </association>
</resultMap>

association的屬性節點:

  • property:映射數據庫列的實體對象屬性名。
  • javaType:完整的java類名和限定名。propert所映射的屬性的類型。

子元素

  • id:一般為映射主鍵,可以提高性能。
  • result:
  • column:映射的數據庫的字段名。
  • property:映射的數據列對應的實體對象屬性。

collection

映射到JavaBean的某個復雜的”數據類型”屬性,這個屬性是一個集合列表,處理一對多的關聯關系。

<resultMap type="com.tian.mybatis.entity.User" id="userMapAddress">
        <id column="id" property="id"/>
        <result column="name" property="userName"/>
        <collection property="lists" ofType="UserAddress">       
            <id column = "id" property = "id">
            <result column="addressDesc" property="addressDesc"/>
        </collection>
    </resultMap>

ofType:完整的Java類名和限定名。propert所映射的屬性的類型。

其余和association基本一致。

association和collection都具備延遲加載功能。

延遲加載:先從單表查詢,需要時再查關聯表,大大的提高了數據庫性能,因為相對來說單表查詢比多表查詢要快。

xml和注解的關系

上面我們已經講了兩種方式的實現,下面來對比一下,兩種方式的關系:

xml方式

必須有個一個XxxMapper.xml與之對應,方法名對應xml中的id,方法入參和方法出參都必須對應起來,很容易出問題。我們在開發的時候有的是可以使用代碼生成器生成,但是有的是必須自己手寫,有的公司也是要求必須手寫,所以這里需要注意。

注解方式

不需要XxxMapper.xml文件,只需要在對應XxxMapper.java中的方法上加上注解就搞定了,但是這里是有坑的。畢竟把sql放到了我們的Java代碼里了。

優缺點

xml方式: 增加了xml文件,修改麻煩,條件不確定(ifelse判斷),容易出錯,特殊轉義字符比如大于小于 。

注解方式:復雜sql不好用,搜集sql不方便,管理不方便,修改需重新編譯

總結

本文講述了Mybatis的兩種映射方式,以及一些注意點,一些關系和區別。

實體屬性名和數據庫表字段名不一樣的情況下,xml和注解分別是如何處理的。resultType和resultMap的區別。

分享到:
標簽:Mybatis
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定