mybatis dao implementation|| interface proxy implementation

mybatis dao层实现

1. 实现dao层接口
2. 接口代理方式实现dao

代理开发要求:

​	Mapper接口开发方法只需要编写Mapper接口(相当于dao接口),由mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体和dao方式实现的接口一样。

1. mapper.xml 中namespace与mapper接口中全限定名相同
2. mapper接口方法名和mapper.xml中定义的每个statement的id相同
3. mapper接口方法入参类型,和 statement的paramType相同
4. mapper接口返回值类型,和statement的resultType相同

1. Mybatis environment construction

  • user-mapper.xml
<?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="cn.bitqian.dao.UserMapper">

    <!-- resultType 引用别名user -->
    <select id="queryAllUser" resultType="user">
        select * from users1
    </select>

    <select id="queryUserByUserId" parameterType="int" resultType="user">
        select * from users1 where userid = #{id}
    </select>

</mapper>
  • mybatis-config.xml core configuration file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <properties resource="jdbc.properties"></properties>

    <!-- user别名 -->
    <typeAliases>
        <typeAlias type="cn.bitqian.entity.User" alias="user"></typeAlias>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="cn\bitqian\mapper\user-mapper.xml"></mapper>
    </mappers>

</configuration>

2. Implementation of mybatis dao interface

  • Write dao interface, same as mapper interface below
package cn.bitqian.dao;

import cn.bitqian.entity.User;

import java.io.IOException;
import java.util.List;

/**
 * 注意 接口代理开发
 * 1. 接口类名与mapper中namespace对应
 * 2. 接口中方法名与statement中的id对应
 * 3. 接口中方法参数与statement中的parameterType对应
 * 4. 接口中方法返回值与statement中的resultType类型对应
 */
public interface UserMapper {
    
    

    public List<User> queryAllUser() throws IOException;

    public User queryUserByUserId(int userId);

}

  • dao interface implementation
package cn.bitqian.dao.impl;

import cn.bitqian.dao.UserMapper;
import cn.bitqian.entity.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 传统实现dao层接口 模板api
 * @author echo lovely
 * @date 2020/9/11 9:23
 */
public class UserMapperImpl implements UserMapper {
    
    
    @Override
    public List<User> queryAllUser() throws IOException {
    
    
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();
        // namespace.id
        List<User> userList = sqlSession.selectList("cn.bitqian.dao.UserMapper.queryAllUser");

        sqlSession.close();
        return userList;
    }

    @Override
    public User queryUserByUserId(int userId) {
    
    
        return null;
    }
}

3. Dynamic proxy mode, only implements the Mapper interface

  • The UserMapper interface is the same as above
优点分析:
	1. 只需实现mapper接口,定义对应的业务方法,注意接口名,
方法名,入参,返回的参数和mappers的配置一致
	2. 无需实现mapper接口,mybatis通过动态代理的方式进行实现了
只需用UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
getMapper api 来创建对象,进行数据库操作
	
package cn.bitqian.service;

import cn.bitqian.dao.UserMapper;
import cn.bitqian.dao.impl.UserMapperImpl;
import cn.bitqian.entity.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author echo lovely
 * @date 2020/9/11 9:29
 */
public class DemoTest {
    
    

    public static void main(String[] args) {
    
    
        // 通过实现dao层接口
        UserMapper userMapper = new UserMapperImpl();
        try {
    
    
            System.out.println(userMapper.queryAllUser());
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

        // 编写mapper接口实现查询所有
        test1();

        // 根据id查询user对象
        test2();
    }

    private static UserMapper userMapper;

    static {
    
    
        try {
    
    
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = build.openSession();

            // 使用getMapper api拿到接口对象,mybatis会通过动态代理进行底层实现
            userMapper = sqlSession.getMapper(UserMapper.class);

        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    // 通过编写mapper接口实现查询
    static void test1() {
    
    
        try {
    
    
            List<User> userList = userMapper.queryAllUser();
            System.out.println(userList);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    static void test2() {
    
    
        User user = userMapper.queryUserByUserId(1);
        System.out.println(user);
    }

}

Guess you like

Origin blog.csdn.net/qq_44783283/article/details/108530024