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

2017-09-03  本文已影响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);
        }

    }
}
上一篇 下一篇

猜你喜欢

热点阅读