天天看點

【MyBatis】Dao層的實作

文章目錄

  • ​​一、 查詢所有​​
  • ​​1.Dao層接口​​
  • ​​2.Dao層實作類​​
  • ​​3.測試​​
  • ​​二、 插入使用者​​
  • ​​1.Dao層接口​​
  • ​​2.Dao層實作類​​
  • ​​3.測試​​
  • ​​三、 刪除使用者​​
  • ​​1.Dao層接口​​
  • ​​2.Dao層實作類​​
  • ​​3.測試​​
  • ​​四、 更新使用者​​
  • ​​1.Dao層接口​​
  • ​​2.Dao層實作類​​
  • ​​3.測試​​
  • ​​五、 查詢一個使用者​​
  • ​​1.Dao層接口​​
  • ​​2.Dao層實作類​​
  • ​​3.測試​​
  • ​​六、 根據名稱模糊查詢​​
  • ​​1.Dao層接口​​
  • ​​2.Dao層實作類​​
  • ​​3.測試​​
  • ​​七、 聚合函數查詢總數​​
  • ​​1.Dao層接口​​
  • ​​2.Dao層實作類​​
  • ​​3.測試​​
  • ​​八、流程分析​​

一、 查詢所有

1.Dao層接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
 * 使用者持久層接口
 */
public interface IUserDao {
    /**
     * 查詢所有使用者資訊
     *
     * @return
     */
    List<User> findAll();
}      

2.Dao層實作類

package com.zyx.core.Impl;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class IUserDaoImpl implements IUserDao {

    private SqlSessionFactory factory ;
    public IUserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

    public List<User> findAll() {
        // 1.根據factory擷取SqlSession對象
        SqlSession sqlSession = factory.openSession();
        // 2.調用sqlSession中的方法實作查詢清單
        //   sqlSession.selectList()
        //   參數就是擷取映射配置的key --- 定位sql語句資訊 => namespace + id
        List<User> userList = sqlSession.selectList("com.zyx.core.dao.IUserDao.findAll");
        // 3.釋放資源
        sqlSession.close();
        return userList;
    }
}      

3.測試

package com.zyx.core.test;

import com.zyx.core.Impl.IUserDaoImpl;
import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.io.Resources;
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.List;

public class MyBatisImplTest {
    InputStream in = null;
    IUserDao userDao;

    /**
     * 初始化方法
     */
    @Before  // 用于在測試方法執行之前執行
    public void init() {
        try {
            // 1.讀取配置檔案
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2.擷取工廠
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            // 3.利用工廠擷取dao對象
            userDao = new IUserDaoImpl(factory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @After  // 用于在測試方法指定之後執行
    public void destroy() {
        try {
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test_findAll() {
        try {
            // 1.執行查詢所有方法
            List<User> list = userDao.findAll();
            for (User u : list) {
                System.out.println(u);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}      
【MyBatis】Dao層的實作

差別:

  • 使用實作類的方式實作Mybaits操作,相對于利用代理對象方式代碼量較大,隻需要注意下面的變化即可~
【MyBatis】Dao層的實作

注意點:

sqlSession.selectList("com.zyx.core.dao.IUserDao.findAll");      

在利用sqlSession進行操作的時候,參數就是擷取映射配置的key — 即用于定位sql語句資訊 => namespace + id

【MyBatis】Dao層的實作

​​傳回頂部​​

二、 插入使用者

1.Dao層接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
 * 使用者持久層接口
 */
public interface IUserDao {
   /**
     * 儲存使用者
     *
     * @param user
     */
    void saveUser(User user);
}      

2.Dao層實作類

package com.zyx.core.Impl;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class IUserDaoImpl implements IUserDao {

    private SqlSessionFactory factory ;
    public IUserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

     public void saveUser(User user) {
        // 1.根據factory擷取SqlSession對象
        SqlSession sqlSession = factory.openSession();
        // 2.調用sqlSession中的方法實作查詢清單
        //   參數就是擷取映射配置的key --- 定位sql語句資訊 => namespace + id,指定插入目标對象user
        sqlSession.insert("com.zyx.core.dao.IUserDao.saveUser",user);
        // 3.送出事務
        sqlSession.commit();
        // 4.釋放資源
        sqlSession.close();
    }
}      

3.測試

package com.zyx.core.test;

import com.zyx.core.Impl.IUserDaoImpl;
import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.io.Resources;
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.List;

public class MyBatisImplTest {
    InputStream in = null;
    IUserDao userDao;

    /**
     * 初始化方法
     */
    @Before  // 用于在測試方法執行之前執行
    public void init() {
        try {
            // 1.讀取配置檔案
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2.擷取工廠
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            // 3.利用工廠擷取dao對象
            userDao = new IUserDaoImpl(factory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @After  // 用于在測試方法指定之後執行
    public void destroy() {
        try {
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test_saveUser() {
        try {
            // 1.執行查詢所有方法
            String str = "2018-03-11 12:45:00";
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            User user = new User();
            user.setUsername("Mary2");
            user.setAddress("北京");
            user.setSex("女");
            user.setBirthday(simpleDateFormat.parse(str));
            System.out.println("插入之前:"+user);
            userDao.saveUser(user);
            System.out.println("插入之後:"+user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}      
【MyBatis】Dao層的實作

​​傳回頂部​​

三、 刪除使用者

1.Dao層接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
 * 使用者持久層接口
 */
public interface IUserDao {
  /**
     * 删除使用者資訊
     * @param id
     */
    void deleteUser(Integer id);
}      

2.Dao層實作類

package com.zyx.core.Impl;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class IUserDaoImpl implements IUserDao {

    private SqlSessionFactory factory ;
    public IUserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

     public void deleteUser(Integer id) {
        // 1.根據factory擷取SqlSession對象
        SqlSession sqlSession = factory.openSession();
        // 2.調用sqlSession中的方法實作查詢清單
        //   參數就是擷取映射配置的key --- 定位sql語句資訊 => namespace + id,指定刪除目标id
        sqlSession.delete("com.zyx.core.dao.IUserDao.deleteUser",id);
        // 3.送出事務
        sqlSession.commit();
        // 4.釋放資源
        sqlSession.close();
    }

}      

3.測試

package com.zyx.core.test;

import com.zyx.core.Impl.IUserDaoImpl;
import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.io.Resources;
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.List;

public class MyBatisImplTest {
    InputStream in = null;
    IUserDao userDao;

    /**
     * 初始化方法
     */
    @Before  // 用于在測試方法執行之前執行
    public void init() {
        try {
            // 1.讀取配置檔案
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2.擷取工廠
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            // 3.利用工廠擷取dao對象
            userDao = new IUserDaoImpl(factory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @After  // 用于在測試方法指定之後執行
    public void destroy() {
        try {
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test_deleteUser() {
        try {
            // 删除使用者
            userDao.deleteUser(43);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}      
【MyBatis】Dao層的實作

​​傳回頂部​​

四、 更新使用者

1.Dao層接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
 * 使用者持久層接口
 */
public interface IUserDao {
     /**
     * 更新使用者資訊
     *
     * @param user
     */
    void updateUser(User user);
}      

2.Dao層實作類

package com.zyx.core.Impl;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class IUserDaoImpl implements IUserDao {

    private SqlSessionFactory factory ;
    public IUserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

    public void updateUser(User user) {
        // 1.根據factory擷取SqlSession對象
        SqlSession sqlSession = factory.openSession();
        // 2.調用sqlSession中的方法實作查詢清單
        //   參數就是擷取映射配置的key --- 定位sql語句資訊 => namespace + id,指定更新的使用者對象user
        sqlSession.update("com.zyx.core.dao.IUserDao.updateUser",user);
        // 3.送出事務
        sqlSession.commit();
        // 4.釋放資源
        sqlSession.close();
    }

}      

3.測試

package com.zyx.core.test;

import com.zyx.core.Impl.IUserDaoImpl;
import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.io.Resources;
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.List;

public class MyBatisImplTest {
    InputStream in = null;
    IUserDao userDao;

    /**
     * 初始化方法
     */
    @Before  // 用于在測試方法執行之前執行
    public void init() {
        try {
            // 1.讀取配置檔案
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2.擷取工廠
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            // 3.利用工廠擷取dao對象
            userDao = new IUserDaoImpl(factory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @After  // 用于在測試方法指定之後執行
    public void destroy() {
        try {
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test_updateUser() {
        try {
            // 1.執行查詢所有方法
            String str = "2018-03-11 12:45:00";
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            User user = new User();
            user.setId(42);
            user.setUsername("Jack Z");
            user.setAddress("南京江甯");
            user.setSex("男");
            user.setBirthday(simpleDateFormat.parse(str));
            iUserDao.updateUser(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}      
【MyBatis】Dao層的實作

​​傳回頂部​​

五、 查詢一個使用者

1.Dao層接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
 * 使用者持久層接口
 */
public interface IUserDao {
    /**
     * 查詢一個使用者資訊
     * @param id
     * @return
     */
    User findById(Integer id);
}      

2.Dao層實作類

package com.zyx.core.Impl;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class IUserDaoImpl implements IUserDao {

    private SqlSessionFactory factory ;
    public IUserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

    public User findById(Integer id) {
        // 1.根據factory擷取SqlSession對象
        SqlSession sqlSession = factory.openSession();
        // 2.調用sqlSession中的方法實作查詢清單
        //   參數就是擷取映射配置的key --- 定位sql語句資訊 => namespace + id,指定查詢單個使用者的id
        User user = sqlSession.selectOne("com.zyx.core.dao.IUserDao.findById",id);
        // 3.送出事務
        sqlSession.commit();
        // 4.釋放資源
        sqlSession.close();
        return user;
    }
}      

3.測試

package com.zyx.core.test;

import com.zyx.core.Impl.IUserDaoImpl;
import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.io.Resources;
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.List;

public class MyBatisImplTest {
    InputStream in = null;
    IUserDao userDao;

    /**
     * 初始化方法
     */
    @Before  // 用于在測試方法執行之前執行
    public void init() {
        try {
            // 1.讀取配置檔案
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2.擷取工廠
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            // 3.利用工廠擷取dao對象
            userDao = new IUserDaoImpl(factory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @After  // 用于在測試方法指定之後執行
    public void destroy() {
        try {
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test_findById() {
        try {
            // 查詢單個使用者
            User user = userDao.findById(48);
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}      
【MyBatis】Dao層的實作

​​傳回頂部​​

六、 根據名稱模糊查詢

1.Dao層接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
 * 使用者持久層接口
 */
public interface IUserDao {
     /**
     * 根據名稱模糊查詢
     * @param name
     * @return
     */
    List<User> findByName(String name);
}      

2.Dao層實作類

package com.zyx.core.Impl;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class IUserDaoImpl implements IUserDao {

    private SqlSessionFactory factory ;
    public IUserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

     public List<User> findByName(String name) {
        // 1.根據factory擷取SqlSession對象
        SqlSession sqlSession = factory.openSession();
        // 2.調用sqlSession中的方法實作查詢清單
        //   參數就是擷取映射配置的key --- 定位sql語句資訊 => namespace + id;指定模糊查詢的條件name
        List<User> userList = sqlSession.selectList("com.zyx.core.dao.IUserDao.findByName",name);
        // 3.釋放資源
        sqlSession.close();
        return userList;
    }

}      

3.測試

package com.zyx.core.test;

import com.zyx.core.Impl.IUserDaoImpl;
import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.io.Resources;
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.List;

public class MyBatisImplTest {
    InputStream in = null;
    IUserDao userDao;

    /**
     * 初始化方法
     */
    @Before  // 用于在測試方法執行之前執行
    public void init() {
        try {
            // 1.讀取配置檔案
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2.擷取工廠
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            // 3.利用工廠擷取dao對象
            userDao = new IUserDaoImpl(factory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @After  // 用于在測試方法指定之後執行
    public void destroy() {
        try {
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test_findByName() {
        try {
            // 模糊查詢
            List<User> userList = userDao.findByName("M%");
            for (User user:userList){
                System.out.println(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}      
【MyBatis】Dao層的實作

​​傳回頂部​​

七、 聚合函數查詢總數

1.Dao層接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
 * 使用者持久層接口
 */
public interface IUserDao {
     /**
     * 聚合函數查詢總數
     * @return
     */
    int findTotal();
}      

2.Dao層實作類

package com.zyx.core.Impl;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class IUserDaoImpl implements IUserDao {

    private SqlSessionFactory factory ;
    public IUserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

    public int findTotal() {
        // 1.根據factory擷取SqlSession對象
        SqlSession sqlSession = factory.openSession();
        // 2.調用sqlSession中的方法實作查詢清單
        //   參數就是擷取映射配置的key --- 定位sql語句資訊 => namespace + id;指定模糊查詢的條件name
        Integer count = sqlSession.selectOne("com.zyx.core.dao.IUserDao.findTotal");
        // 3.釋放資源
        sqlSession.close();
        return count;
    }
}      

3.測試

package com.zyx.core.test;

import com.zyx.core.Impl.IUserDaoImpl;
import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
import org.apache.ibatis.io.Resources;
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.List;

public class MyBatisImplTest {
    InputStream in = null;
    IUserDao userDao;

    /**
     * 初始化方法
     */
    @Before  // 用于在測試方法執行之前執行
    public void init() {
        try {
            // 1.讀取配置檔案
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            // 2.擷取工廠
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            // 3.利用工廠擷取dao對象
            userDao = new IUserDaoImpl(factory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 釋放資源
     */
    @After  // 用于在測試方法指定之後執行
    public void destroy() {
        try {
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test_findTotal() {
        try {
            // 統計總條數
            Integer count = userDao.findTotal();
            System.out.println("共有記錄"+count+"條!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}      
【MyBatis】Dao層的實作

​​傳回頂部​​

八、流程分析

【MyBatis】Dao層的實作