天天看点

【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层的实现