1. 程式人生 > >Mybatis基於代理Dao實現CRUD操作 及 Mybatis的參數深入

Mybatis基於代理Dao實現CRUD操作 及 Mybatis的參數深入

utf XML 方法 creat 它的 執行方法 字符串 pro ssi

Mybatis基於代理Dao實現CRUD操作

使用要求:

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

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

3、SQL語句的配置標簽<select>,<insert>,<delete>,<update>的id屬性必須和持久層接口的方法名相同。

持久層接口

/**
 *
 * 用戶的持久層接口
 */
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(); }

持久層接口對應的映射配置文件

<?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.itheima.dao.IUserDao">
    <!--配置查詢所有-->
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user
    </select>

    <!--保存用戶-->
    <insert id="saveUser" parameterType="com.itheima.domain.User">
        insert into user(username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday});
    </insert>

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

    <!--刪除用戶-->
    <!--此處dao方法中只有一個integer類型參數,只需要寫清楚一個占位符就可以,占位符叫什麽無所謂-->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id};
    </delete>

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

    <!--根據名稱模糊查詢用戶信息-->
    <select id="findByName" parameterType="String" resultType="com.itheima.domain.User">
       select * from user where username like #{username};
      /*select * from user where username like ‘%${value}%‘;*/
    </select>

    <!--使用聚合函數查詢總用戶數-->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>
</mapper>

測試類

package com.itheima.test;

import com.itheima.dao.IUserDao;
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;

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 testSaveUser(){
        User user =new User ();
        user.setAddress ("QingDao");
        user.setBirthday (new Date ());
        user.setSex ("m");
        user.setUsername ("MKL");
        userDao.saveUser (user);
    }
    /**
     * 測試更新操作
     */
    @Test
    public void testUpdateUser(){
        User user =new User ();
        user.setId (59);
        user.setAddress ("HuangDao");
        user.setBirthday (new Date ());
        user.setSex ("男");
        user.setUsername ("MKL");
        userDao.updateUser (user);
    }

    /**
     * 測試根據ID進行刪除
     */
    @Test
    public void testDeleteUser(){
        userDao.deleteUser (43);
    }

    /**
     * 測試根據ID查詢用戶
     */
    @Test
    public void testFindById(){
            User user=userDao.findById (59);
            System.out.println (user);
    }

    /**
     * 測試根據名稱模糊查詢用戶信息
     */
    @Test
    public void testFindByName(){
        List<User> users = userDao.findByName ("%王%");
        //List<User> users = userDao.findByName ("王");
        System.out.println (users);
    }

    /**
     *使用聚合函數查詢總用戶數
     */
    @Test
    public void testFindTotal(){
        System.out.println (userDao.findTotal ());
    }
}

問題擴展:進行模糊查詢時兩種方式的區別

第一種方式 PreparedStatement的參數占位符

技術分享圖片

技術分享圖片

技術分享圖片

第二種方式: Statement對象的字符串拼接SQL

技術分享圖片

技術分享圖片

技術分享圖片

問題擴展:新增用戶id的返回值

Mybatis 示例之 SelectKey

新增用戶後,同時還要返回當前新增用戶的id值,因為id是由數據庫的自動增長來實現的,所以就相當於我們要在新增後將自動增長auto_increment的值返回。

keyProperty 對應的屬性名稱

<insert id="saveUser" parameterType="USER"> 
  <!-- 配置保存時獲取插入的id --> 
  <selectKey keyColumn="id" keyProperty="id" resultType="int"> 
    select last_insert_id();   
</selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>

Mybatis的參數深入 傳遞pojo包裝對象

開發中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作為查詢條件),這時可以使用包裝對象傳遞輸入參數。 Pojo類中包含pojo。

需求:根據用戶名查詢用戶信息,查詢條件放到QueryVo的user屬性中。

編寫QueryVo

package com.itheima.domain;

import java.io.Serializable;

/**
 * Created by IDEA
 * User:MKL7
 * Date:2019/4/20
 * Time:15:45
 */

/**
 * 查詢條件對象對象
 */
public class QueryVo implements Serializable {
    private User user;

    public User getUser () {
        return user;
    }

    public void setUser (User user) {
        this.user = user;
    }
}

編寫持久層接口

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

持久層接口的映射文件

<!--根據QueryVo中的條件查詢用戶信息-->
    <select id="findByVo" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.QueryVo">
        select * from user where username like #{user.username};
    </select>

測試包裝類作為參數

/**
     * 測試根據QueryVo 查詢用戶信息
     */
    @Test
    public void testFindByVo () {
        User user = new User ();
        user.setUsername ("%王%");

        QueryVo queryVo = new QueryVo ();
        queryVo.setUser (user);

        List<User> users=userDao.findByVo (queryVo);
        System.out.println (users);
    }

Mybatis基於代理Dao實現CRUD操作 及 Mybatis的參數深入