美文网首页
10.平凡之路-传统模式和接口代理模式

10.平凡之路-传统模式和接口代理模式

作者: 胖先森 | 来源:发表于2017-09-03 20:09 被阅读0次

    在我之前的过学习过程中,我们一直使用的传统模式,由自己去完成接口对应的实现类,这样无形中增加了很多的代码,因此MyBatis也提供了接口代理模式,由MyBatis自动帮我们完成实现类
    下面我们通过代码的形式,来体验一下传统模式和代理模式

    传统模式

    映射文件

    使用传统模式大部分的公司的命名空间都是使用的持久化类的全路径
    这是一种约定

    <mapper namespace="com.shxt.model.User">
       
         <resultMap type="com.shxt.model.User" id="BaseResultMapper">
            <id column="user_id" property="user_id"/>
            <result column="account" property="account"/>
            <result column="password" property="password"/>
            <result column="user_name" property="user_name"/>
            <result column="status" property="status"/>
            <result column="login_time" property="login_time"/>
            <result column="ip" property="ip"/>
            <result column="fk_role_id" property="fk_role_id"/>
        </resultMap>
        
        <sql id="sys_user_columns">
            user_id,account,password,user_name,status,login_time,ip,fk_role_id
        </sql>
        
        <select id="load" parameterType="int" resultMap="BaseResultMapper">
            SELECT
                <include refid="sys_user_columns"/>
            FROM
                sys_user
            WHERE user_id=#{user_id}
        </select>
    </mapper>
    

    UserDao接口

    public interface UserDao {
        User load(int user_id);
    }
    

    UserDaoImpl实现类

    public class UserDaoImpl implements UserDao {
        @Override
        public User load( int user_id ) {
    
            SqlSession sqlSession = null;
            try {
                sqlSession = MyBatisUtils.getSqlSession();
    
                return sqlSession.selectOne(User.class.getName()+".load", user_id);
            } finally {
                MyBatisUtils.closeSqlSession(sqlSession);
            }
        }
    }
    

    测试类

    public class MyTest {
    
        @Test
        public void load(){
            UserDao userDao = new UserDaoImpl();
    
            System.out.println(userDao.load(-999));
        }
    

    接口代理模式

    映射文件

    重要规则:

    1. 命名空间一定为接口的全路径
    2. 接口中的方法名称跟映射文件执行定制SQL的ID对应的名称保持一致
    <mapper namespace="com.shxt.dao.UserDao">
       
         <resultMap type="com.shxt.model.User" id="BaseResultMapper">
            <id column="user_id" property="user_id"/>
            <result column="account" property="account"/>
            <result column="password" property="password"/>
            <result column="user_name" property="user_name"/>
            <result column="status" property="status"/>
            <result column="login_time" property="login_time"/>
            <result column="ip" property="ip"/>
            <result column="fk_role_id" property="fk_role_id"/>
        </resultMap>
        
        <sql id="sys_user_columns">
            user_id,account,password,user_name,status,login_time,ip,fk_role_id
        </sql>
        
        <select id="load" parameterType="int" resultMap="BaseResultMapper">
            SELECT
                <include refid="sys_user_columns"/>
            FROM
                sys_user
            WHERE user_id=#{user_id}
        </select>
    </mapper>
    

    UserDao接口

    public interface UserDao {
        User load(int user_id);
    }
    

    测试类

    public class MyTest {
        @Test
        public void load(){
            SqlSession sqlSession = null;
            try {
                sqlSession = MyBatisUtils.getSqlSession();
                //实例化接口
                UserDao userDao = sqlSession.getMapper(UserDao.class);
                User user = userDao.load(-999);
                System.out.println(user);
            } finally {
                MyBatisUtils.closeSqlSession(sqlSession);
            }
        }
    }
    

    sqlSession.getMapper帮我们完成了接口的实例化操作,关键步骤

    接口代理模式 - 传递多个形参

    映射文件

    <mapper namespace="com.shxt.dao.UserDao">
       
         <resultMap type="com.shxt.model.User" id="BaseResultMapper">
            <id column="user_id" property="user_id"/>
            <result column="account" property="account"/>
            <result column="password" property="password"/>
            <result column="user_name" property="user_name"/>
            <result column="status" property="status"/>
            <result column="login_time" property="login_time"/>
            <result column="ip" property="ip"/>
            <result column="fk_role_id" property="fk_role_id"/>
        </resultMap>
       
        <sql id="sys_user_columns">
            user_id,account,password,user_name,status,login_time,ip,fk_role_id
        </sql>
        
        <!-- 接口代理模式
        1.当你的形参个数多于一个的时候 parameterType 不写,让其自动处理
         -->
        <select id="login" resultMap="BaseResultMapper">
            SELECT
                <include refid="sys_user_columns"/>
            FROM
                sys_user
            WHERE
                account=#{account}
                AND
                password=#{password}
        </select>
        
        
    
    
    </mapper>
    

    UserDao关键代码

    推荐使用@Param注解完成

    public interface UserDao {
        User login(
                @Param("account") String account,/*arg0或者param1*/
                @Param("password") String password);
    
    }
    
    

    测试代码

    public class MyTest {
    
        @Test
        public void loginTest(){
            SqlSession sqlSession = null;
            try {
                sqlSession = MyBatisUtils.getSqlSession();
                //实例化接口
                UserDao userDao = sqlSession.getMapper(UserDao.class);
                User user = userDao.login("admin", "admin");
                System.out.println(user);
    
            } finally {
                MyBatisUtils.closeSqlSession(sqlSession);
            }
    
        }
    }
    

    相关文章

      网友评论

          本文标题:10.平凡之路-传统模式和接口代理模式

          本文链接:https://www.haomeiwen.com/subject/uetvdxtx.html