實現MyBatis的CURD

二、基於代理Dao實現CURD操作

使用要求:

1、持久層接口和持久層接口的映射配置必須在相同的包下

2、持久層映射配置中 mapper 標籤的 namespace 屬性取值必須是持久層接口的全限定類名

3、SQL 語句的配置標籤<select>,<insert>,<delete>,<update>的 id 屬性必須和持久層接口的

方法名相同。

1.首先在持久層(dao)接口添加新增方法

import com.itheima.domain.QueryVo;
import com.itheima.domain.User;

import java.util.List;

/**
 *
 * 用戶的持久層接口
 */
public interface IUserDao {

    /**
     * 查詢所有用戶
     * @return
     */
    List<User> findAll();

    /**
     * 保存用戶
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新用戶
     * @param user
     */
    void updateUser(User user);

    /**
     * 根據Id刪除用戶
     * @param userId
     */
    void deleteUser(Integer userId);

    /**
     * 根據id查詢用戶信息
     * @param userId
     * @return
     */
    User findById(Integer userId);

    /**
     * 根據名稱模糊查詢用戶信息
     * @param username
     * @return
     */
    List<User> findByName(String username);

    /**
     * 查詢總用戶數
     * @return
     */
    int findTotal();

    /**
     * 根據queryVo中的條件查詢用戶
     * @param vo
     * @return
     */
    List<User> findUserByVo(QueryVo vo);
}

2.在用戶的映射配置文件mapper.xml中配置

MyBatis中resultType resultMap 區別

基本映射 :(resultType)使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列纔可以映射成功。(數據庫,實體,查詢字段,這些全部都得一一對應)高級映射 :(resultMap) 如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關係。(高級映射,字段名稱可以不一致,通過映射來實現

resultType和resultMap功能類似 ,都是返回對象信息 ,但是resultMap要更強大一些 ,可自定義。因爲resultMap要配置一下,表和類的一一對應關係,所以說就算你的字段名和你的實體類的屬性名不一樣也沒關係,都會給你映射出來,

ResultType相對與ResultMap而言更簡單一點。只有滿足ORM(Object Relational Mapping,對象關係映射)時,即數據庫表中的字段名和實體類中的屬性完全一致時,才能使用,否則會出現數據不顯示的情況。

resultType:

<select id="selectUser" parameterType="int" resultType="User">
	select * from user where id = #{id}
</select>

resultMap:

<!-- column:數據庫中列名稱,property:類中屬性名稱 -->
<resultMap type="User" id="userMap">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
</resultMap>

<select id="selectUserList" resultMap="userMap" > 
	select * from user
</select>

配置細節:

parameterType 屬性:代表傳入參數的類型,因爲我們要傳入的是一個類的對象,所以類型就寫類的全名稱。

resultType 屬性:用於指定結果集的類型。

sql 語句中使用#{}字符:它代表佔位符,相當於原來 jdbc 部分所學的?,都是用於執行語句時替換實際的數據。

具體的數據是由#{}裏面的內容決定的。

#{}中內容的寫法

由於我們保存方法的參數是 一個 User 對象,此處要寫 User 對象中的屬性名稱。它用的是 ognl 表達式。

ognl 表達式

它是 apache 提供的一種表達式語言,全稱是:Object Graphic Navigation Language 對象圖導航語言

它是按照一定的語法格式來獲取數據的。語法格式就是使用 #{對象.對象}的方式

在用戶的映射配置文件mapper.xml中配置,namespace和id共同組成一個固定位置的方法,方便使用查詢

<mapper namespace="com.itheima.dao.IUserDao"> 
<!-- 配置 查詢結果的列名和實體類的屬性名的對應關係 -->
    <resultMap id="userMap" type="uSeR">
        <!-- 主鍵字段的對應 -->
        <id property="userId" column="id"></id>
        <!--非主鍵字段的對應-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>


    <!-- 查詢所有 -->//注意這裏的dao層
    <select id="findAll" resultMap="userMap">
        <!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
        select * from user;
    </select>

    <!-- 保存用戶 -->
    <insert id="saveUser" parameterType="user">
        <!-- 配置插入操作後,獲取插入數據的id -->
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    </insert>

    <!-- 更新用戶 -->
    <update id="updateUser" parameterType="USER">
        update user set username=#{userName},address=#{userAddress},sex=#{userAex},birthday=#{userBirthday} where id=#{userId}
    </update>

    <!-- 刪除用戶-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{uid}
    </delete>
    
    <!-- 根據id查詢用戶 -->
    <select id="findById" parameterType="INT" resultMap="userMap">
        select * from user where id = #{uid}
    </select>

    <!-- 根據名稱模糊查詢 -->
    <select id="findByName" parameterType="string" resultMap="userMap">
          select * from user where username like #{name}
        <!-- select * from user where username like '%${value}%'-->
   </select>

    <!-- 獲取用戶的總記錄條數 -->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>

    <!-- 根據queryVo的條件查詢用戶 -->
    <select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.username}
    </select>
</mapper>

3.添加測試類中的測試方法

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.domain.QueryVo;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * 測試mybatis的crud操作
 */
public class MybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before//用於在測試方法執行之前執行
    public void init()throws Exception{
        //1.讀取配置文件,生成字節輸入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.獲取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.獲取SqlSession對象
        sqlSession = factory.openSession();
        //4.獲取dao的代理對象
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After//用於在測試方法執行之後執行
    public void destroy()throws Exception{
        //提交事務
        sqlSession.commit();
        //6.釋放資源
        sqlSession.close();
        in.close();
    }

    /**
     * 測試查詢所有
     */
    @Test
    public void testFindAll(){
        //5.執行查詢所有方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }

    }

    /**
     * 測試保存操作
     */
    @Test
    public void testSave(){
        User user = new User();
        user.setUserName("modify User property");
        user.setUserAddress("北京市順義區");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        System.out.println("保存操作之前:"+user);
        //5.執行保存方法
        userDao.saveUser(user);

        System.out.println("保存操作之後:"+user);
    }

    /**
     * 測試更新操作
     */
    @Test
    public void testUpdate(){
        User user = new User();
        user.setUserId(50);
        user.setUserName("mybastis update user");
        user.setUserAddress("北京市順義區");
        user.setUserSex("女");
        user.setUserBirthday(new Date());

        //5.執行保存方法
        userDao.updateUser(user);
    }

    /**
     * 測試刪除操作
     */
    @Test
    public void testDelete(){
        //5.執行刪除方法
        userDao.deleteUser(48);
    }

    /**
     * 測試刪除操作
     */
    @Test
    public void testFindOne(){
        //5.執行查詢一個方法
        User  user = userDao.findById(50);
        System.out.println(user);
    }

    /**
     * 測試模糊查詢操作
     */
    @Test
    public void testFindByName(){
        //5.執行查詢一個方法
        List<User> users = userDao.findByName("%王%");
//        List<User> users = userDao.findByName("王");
        for(User user : users){
            System.out.println(user);
        }
    }

    /**
     * 測試查詢總記錄條數
     */
    @Test
    public void testFindTotal(){
        //5.執行查詢一個方法
        int count = userDao.findTotal();
        System.out.println(count);
    }


    /**
     * 測試使用QueryVo作爲查詢條件
     */
    @Test
    public void testFindByVo(){
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUserName("%王%");
        vo.setUser(user);
        //5.執行查詢一個方法
        List<User> users = userDao.findUserByVo(vo);
        for(User u : users){
            System.out.println(u);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章