Mybatis之學習筆記(二)

上一篇僅僅只是說了導包以及主配置文件的配置以及標籤的介紹,這篇就從實現一個查詢用戶所有數據開始

在上一篇的基礎上我們按照圖片的內容創建一個user類,userDao接口,userDao的配置文件UserDao,並自動給user生成get and set方法以及重寫toString方法

特別強調這個時刻創建user的屬性名要與數據庫的列名一致!!!
在這裏插入圖片描述
在這裏插入圖片描述
接下來開始配置UserDao文件,而這個文件的路徑需要配置在上一篇所說的主配置文件的mapper當中去,下面就是UserDao的配置

<?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.lyl.dao.UserDao">
<!--當實體類屬性名和數據庫列名不一致時的配置,且後面的resultType改成resultMap="userMap(id)"-->
    <resultMap id="userMap" type="com.lyl.entity.User">
        <!--主鍵的配置-->
        <id property="id" column="id"></id>
        <!--非主鍵的配置-->
        <result property="userName" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
    </resultMap>
    <!--id爲對應UserDao對應方法名"-->
    <select id="findAll" resultType="com.lyl.entity.User">
       select * from user;
    </select>
</mapper>

mapper標籤下,因爲我們要做的是查詢功能所以用的是select標籤 ==
id屬性的值對應着userDao接口下的findAll==方法名
resultType也就是返回結果的設置,這裏值填對應實體類的類全名
標籤裏面自然是寫上查詢語句

話說?我們把配置文件都寫好了到底該怎麼使用Mybatis啊?

下面給出整段代碼我們一一分析

@Test
	    public void  testFindAll(){
	    private Reader reader;
	    private SqlSession sqlSession;
	    private UserDao userDao;
 		//1.讀取配置文件
       reader= Resources.getResourceAsReader("SqlMapConfig.xml");
        //2.創建SqlSessionFactory工廠
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
        //3.使用工廠生產SqlSession對象
         sqlSession= sqlSessionFactory.openSession();
        //4.使用SqlSession創建Dao接口的代理對象
         userDao=sqlSession.getMapper(UserDao.class);
        //5.使用代理對象執行方法
        List<User> userList=userDao.findAll();
        for(User user:userList){
            System.out.println(user);
        }
        //需要提交事務
        sqlSession.commit();
        //6.釋放資源
        sqlSession.close();
        reader.close();
    }

1.首先我們創建reader對象解析我們的SqlMapConfig.xml文件

 reader= Resources.getResourceAsReader("SqlMapConfig.xml");

2.其次創建SqlSessionFactory工廠

SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);

3.使用工廠生產SqlSession對象

sqlSession= sqlSessionFactory.openSession();

4.使用SqlSession創建Dao接口的代理對象

userDao=sqlSession.getMapper(UserDao.class);

5.使用代理對象執行方法

List<User> userList=userDao.findAll();

上面五個步驟創建了一個sqlsession對象,並用其創建Dao接口的代理對象

創建完代理對象之後,就能夠用代理對象去調用接口的方法了
需要注意的是
執行的事物需要提交,sqlSession也需要關閉
所以最後一定不要忘了這幾步,否則後面如果執行插入操作的話是沒有效果的

		//需要提交事務
        sqlSession.commit();
        //6.釋放資源
        sqlSession.close();
        reader.close();

最後的結果顯示如下:
在這裏插入圖片描述
有了這一個例子接下來的標籤相信也是容易理解的,在進行直接的代碼轟炸之前,再先介紹一下在select標籤的屬性 parameterType也就是當我們的接口有參數的時候,這個屬性的值就是這個參數的類型

插入

  <insert id="addUser" parameterType="com.lyl.entity.User">
        <!--配置插入操作後,獲取插入數據的id,意思是在執行完這個addUser方法後,給我們之前自己封裝的沒有id的user這個對象查詢並放進這個對象-->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert  into user(username,address,sex,birthday)values(#{userName},#{address},#{sex},#{birthday});
    </insert>

更新

<!--更新用戶-->
    <update id="updateUser" parameterType="com.lyl.entity.User">
        update user set username=#{userName},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
    </update>

刪除

<!--刪除用戶-->
    <!--#{id}的id可以隨便寫,因爲參數只有一個int-->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id};
    </delete>

條件查詢以及模糊查詢

<!--根據id查詢用戶-->
    <select id="findById" parameterType="int" resultType="com.lyl.entity.User">
        select * from user where id=#{id};
    </select>

    <!--模糊查詢-->
    <select id="findByName" parameterType="String" resultType="com.lyl.entity.User">
        select * from user where username like#{name};
    </select>

問題一:但是如果我們想要查詢的條件不止是單單一個屬性的時候我們該怎麼辦呢?

這個時候有一個解決辦法,再創建一個Queryvo的類,在這個類同時聲明需要用到的實體類,並創建get 和 set方法
在這裏插入圖片描述

在這裏插入圖片描述

問題二:前面強調過實體類屬性名應該於數據庫的列名一致但是如果不呢?

解決實體類屬性名和數據庫列名不一致的的問題方法就是在Dao層配置文件中配置
如我們想配置user實體類

<resultMap id="userMap" type="com.lyl.entity.User">
        <!--主鍵的配置-->
        <id property="id" column="id"></id>
        <!--非主鍵的配置-->
        <result property="userName" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
 </resultMap>

當然下面resultType屬性應該改成resultMap且值爲對應的id
例如這句

<select id="findAlls" resultMap="userAccountMap">
        select * from user u left outer join account a on u.id=a.uid
 </select>

僅做學習筆記,如有錯誤,請指教!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章