在我之前的过学习过程中,我们一直使用的传统模式,由自己去完成接口对应的实现类,这样无形中增加了很多的代码,因此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));
}
接口代理模式
映射文件
重要规则:
- 命名空间一定为接口的全路径
- 接口中的方法名称跟映射文件执行定制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);
}
}
}
网友评论