Java之MyBatis的Dao方式以及Dao动态代理详解

MyBatis简介以及入门参见以下文章

MyBatis简介及入门

1、新建一个数据库,以及一张表user

CREATE TABLE `user` (
  `user_id` int(10) NOT NULL COMMENT '用户名ID',
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `email` varchar(80) DEFAULT NULL COMMENT '用户邮箱',
  `age` int(5) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、创建maven的普通Java工程,加入maven的mybatis坐标,mysql驱动坐标

其中,pom.xml文件如下


 

  4.0.0
 
  com.mycompany
  mybatis-1
  1.0.0
 
  
    
    UTF-8
    
    1.8
    
    1.8
  
 
  
    
    
      junit
      junit
      4.11
      test
    
 
    
    
      org.mybatis
      mybatis
      3.5.1
    
 
    
    
      mysql
      mysql-connector-java
      5.1.9
    
 
  
 
  
    
      
        src/main/java
        
          **/*.properties
          **/*.xml
        
        
        false
      
    
  
 

3、创建Java实体类User--保存表中的一行数据

package com.mycompany.domain;
 
public class User {
    private int userId;
    private String userName;
    private String email;
    private int age;
 
    public int getUserId() {
        return userId;
    }
 
    public void setUserId(int userId) {
        this.userId = userId;
    }
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}

4、创建持久层的dao接口,定义操作数据库的方法

package com.mycompany.dao;
 
import com.mycompany.domain.User;
 
import java.util.List;
 
public interface UserDao {
    /**
     * 查询user列表
     * @param user 单个user用户
     * @return user的list
     */
    List selectUserList(User user);
 
    /**
     * 插入user
     * @param user
     * @return
     */
    int insertUser(User user);
}

5、创建一个mybatis使用的配置文件 SQL映射文件

编写SQL语句,一般一个表对应一个SQL映射文件,这个文件就是xml文件

sql映射文件(sql mapper):编写SQL语句,mybatis负责执行这些SQL语句



 

 

 
    
    
 
    
    
        insert into user values(#{userId},#{userName},#{email},#{age})
    
 

6、创建mybatis的主配置文件 ,一个项目一个主配置文件

主配置文件提供了数据库的连接信息和SQL映射文件的位置信息



 


 
    
    
        
        
    
 
    
    
 
        
        
            
            
            
            
                
                
                
                
                
                
                
                
                
            
        
 
        
        
            
            
                
                
                
                
            
        
 
    
 
    
    
        
        
    

将SqlSession提取为工具类MyBatisUtil

public class MyBatisUtil {
    public MyBatisUtil() {
    }
 
    public static SqlSession getSqlSession() throws IOException {
        String config = "mybatis-config.xml";
        InputStream ins = Resources.getResourceAsStream(config);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(ins);
        SqlSession sqlSession = factory.openSession();
        return sqlSession;
    }
}

MyBatis传统Dao方式以及Dao动态代理

创建user表以及maven的Java普通工程,Java实体类,dao持久层接口,SQL映射文件以及主配置文件如上步骤

MyBatis传统Dao方式

7、创建类实现UserDao接口

public class UserDaoImpl implements UserDao {
    /**
     * 查询user列表
     * @param user 单个user用户
     * @return user的list
     */
    @Override
    public List selectUserList(User user) {
        List userList = null;
        try {
            //获取SqlSession对象
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            String sqlId = "com.mycompany.dao.UserDao.selectUserList";
            userList = sqlSession.selectList(sqlId);
            //关闭
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return userList;
    }
 
    @Override
    public int insertUser(User user) {
        int nums = 0;
        try {
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            String sqlId = "com.mycompany.dao.UserDao.insertUser";
            nums = sqlSession.insert(sqlId,user);
 
            //mybatis默认不是自动提交事务的, 所以在insert ,update ,delete后要手工提交事务
            sqlSession.commit();
 
            //关闭
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return nums;
    }
}

8、创建测试类 

public class TestMyBatis {
    @Test
    public void testSelectUsers(){
        /**
         * List userList = userDao.selectUserList(null); 调用
         * 1、dao对象,UserDao,全限定名称是:com.mycompany.dao.UserDao
         *   全限定名称 和 namespace 是一样的
         *
         * 2、方法名称, selectUserList
         *    这个方法就是 mapper文件中的 id值 selectUserList
         *
         * 3、通过dao中方法的返回值也可以确定MyBatis要调用的SqlSession的方法
         *    如果返回值是List ,调用的是SqlSession.selectList()方法
         *    如果返回值 int ,或是非List的, 看mapper文件中的 标签是 就会        
         调用
         *    SqlSession的insert, update等方法
         *
         *  mybatis的动态代理:
         *    mybatis根据 dao的方法调用,获取执行sql语句的信息
         *    mybatis根据你的dao接口,创建出一个dao接口的实现类, 并创建这个类的对象
         *    完成SqlSession调用方法, 访问数据库
         */
        UserDaoImpl userDao = new UserDaoImpl();
        List userList = userDao.selectUserList(null);
        for (User user:userList){
            System.out.println("查询到的用户="+user);
        }
    }
 
    @Test
    public void testInsertUser(){
        UserDaoImpl userDao = new UserDaoImpl();
 
        User user = new User();
        user.setUserId(6);
        user.setUserName("zhaoyunchang");
        user.setEmail("[email protected]");
        user.setAge(18);
 
        int nums = userDao.insertUser(user);
        System.out.println("添加对象的数量:"+nums);
    }
}

MyBatis之Dao动态代理

使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)

getMapper能获取dao接口对于的实现类对象

public class TestMyBatis {
    @Test
    public void testSelectUsers(){
        try {
            /**
             * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)
             * getMapper能获取dao接口对于的实现类对象
             */
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            //com.sun.proxy.$Proxy2 : jdk的动态代理
            System.out.println("userDao="+userDao.getClass().getName());
 
            //调用dao的方法, 执行数据库的操作
            List userList = userDao.selectUserList(null);
            for(User user: userList){
                System.out.println("用户="+user);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void testInsertUser(){
        try {
            /**
             * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)
             * getMapper能获取dao接口对于的实现类对象
             */
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            UserDao userDao = sqlSession.getMapper(UserDao.class);
 
            //com.sun.proxy.$Proxy2 : jdk的动态代理
            System.out.println("userDao="+userDao.getClass().getName());
 
            //调用dao的方法, 执行数据库的操作
            User user = new User();
            user.setUserId(7);
            user.setUserName("zhugeliang");
            user.setEmail("[email protected]");
            user.setAge(18);
 
            int nums = userDao.insertUser(user);
            sqlSession.commit();
            System.out.println("添加对象的数量:"+nums);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(Java之MyBatis的Dao方式以及Dao动态代理详解)