一、简介
1.代理模式
代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理类通常在原始对象的基础上提供了一些额外的功能,例如远程访问、安全性控制、延迟加载等。通过使用代理模式,可以在不改变原始对象的情况下增加一些额外的功能,同时也可以对原始对象进行保护和封装。
2. 优点
1. 代理模式可以实现客户端和被代理对象之间的解耦,客户端无需直接与被代理对象交互,而是通过代理进行间接访问,这样可以降低系统的耦合度。
2. 代理模式可以提高系统的安全性,因为代理对象可以对客户端的请求进行过滤和验证,确保只有合法的请求被传递给被代理对象。
3. 代理模式可以实现延迟加载,即在需要时才创建被代理对象,这样可以提高系统的性能和效率。
4. 代理模式可以实现远程代理,即客户端可以通过代理对象访问位于不同地址空间的对象,这样可以实现分布式系统的通信和协作。
5. 代理模式可以实现缓存代理,即代理对象可以缓存被代理对象的结果,当下次需要相同的结果时,直接返回缓存的结果,避免重复计算或访问。
6. 代理模式可以实现日志记录、性能统计等功能,通过在代理对象中添加额外的逻辑,可以实现对被代理对象的操作进行记录和监控。
二、静态代理模式
1.开发规范
开发规范:
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口的开发规范包括以下几点:
定义接口:创建一个Java接口,用于定义数据库访问操作。每个方法定义一个对应的数据库操作,包括增删改查等操作。
方法命名规范:方法名应该描述清楚其功能,可以使用动词开头,如addUser,deleteUser,getUser等。避免使用缩写和简写,保持方法名的可读性。
方法参数规范:方法参数应该明确指定,避免使用泛型。参数类型应该与数据库表的列类型对应。
返回值规范:方法的返回值应该明确指定,通常为数据库操作的结果或者查询结果。避免使用泛型,返回值类型应该与查询结果的类型对应。
注解使用规范:使用@Mapper注解标记Mapper接口,并使用@Param注解标记方法参数,用于指定参数名称。
SQL语句规范:SQL语句应该使用注解的方式进行书写,避免使用字符串拼接的方式。SQL语句应该简洁明了,避免使用复杂的子查询和嵌套查询。
异常处理规范:数据库操作可能会出现异常,应该捕获异常并处理。可以使用try-catch语句捕获异常,并根据需要进行异常处理或者抛出异常给上层调用者处理。
单元测试规范:对于每个数据库操作方法,应该编写对应的单元测试用例进行测试。测试用例应该覆盖常见的正常和异常情况,确保数据库操作的正确性。
接口文档规范:对于每个方法,应该编写相应的接口文档,包括方法的功能描述、参数说明、返回值说明等。接口文档可以使用注释的方式写在接口方法上方。
2.实现代码
定义mapper映射文件UserMapper.xml(内容同Users.xml),需要修改namespace的值为 UserMapper接口路径。将UserMapper.xml放在sr
下mapper目录 下。
UserMapper.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.test.mybatis.mapper.UserMapper">
<!-- 根据id获取用户信息 -->
<select id="findUserById" parameterType="int" resultType="cn.test.mybatis.po.User">
select * from user where id = #{id}
</select>
</mapper>
Mapper接口
package com.ba.mapper;
import com.ba.domain.Order;
import com.ba.domain.QueryUser;
import com.ba.domain.User;
import java.util.List;
public interface UserMapper {
public User findUserById(int id);
}
测试类
package com.ba.test;
import com.ba.domain.*;
import com.ba.mapper.CommodityMapper;
import com.ba.mapper.OrderMapper;
import com.ba.mapper.UserMapper;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
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 org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestDemo1{
SqlSessionFactory ssf = null;
@Before
public void creatFactory(){
try {
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test(){
SqlSession sqlSession = ssf.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(10);
System.out.println(user);
}
}
运行结果