文章目录
中介者模式
- 中介者模式
- 中介者模式实战
- 不使用中介者模式写法
- 使用中介者模式写法
- 测试验证
中介者模式使用的场景: 把复杂功能的重复调用, 中间添加一层包装, 对外提供简单, 易扩展的服务能力. 例如中间件组提供的统一的接口与服务等.
中介者模式实战模拟jdbc连接数据库的操作. 使用中介者模式,手写一个简易版的mybatis.
不使用中介者模式写法创建模块tutorials-19.0-0 创建JDBCUtil类 该类是纯手写jdbc的过程.
public class JDBCUtil {
private static Logger logger = LoggerFactory.getLogger(JDBCUtil.class);
public static final String URL = "jdbc:mysql://127.0.0.1:3306/itstack_demo_ddd";
public static final String USER = "root";
public static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
// 1. 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接.
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3.操作数据库
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery("select id, name, age from user ");
// 如果有数据, rs.next()返回true
while (resultSet.next()) {
logger.info("测试结果 姓名: {}, 年龄: {}", resultSet.getString("name"), resultSet.getInt("age"));
}
}
}
使用中介者模式写法
使用中介者模式, 手写一个简易的mybatis查询框架. uml图如下. 实现对配置文件的加载, xml的解析, 获取数据库的session, 数据库操作以及返回结果等.
定义SqlSession接口
public interface SqlSession {
T selectOne(String statement);
T selectOne(String statement, Object parameter);
List selectList(String statement);
List selectList(String statement, Object parameter);
void close();
}
SqlSession具体实现类 DefaultSqlSession
public class DefaultSqlSession implements SqlSession{
// sql 连接
private Connection connection;
private Map mapperElement;
public DefaultSqlSession(Connection connection, Map mapperElement) {
this.connection = connection;
this.mapperElement = mapperElement;
}
/**
* 无参数查询返回一个结果
* @param statement
* @param
* @return
*/
@Override
public T selectOne(String statement) {
try {
XNode xNode = mapperElement.get(statement);
PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql());
ResultSet resultSet = preparedStatement.executeQuery();
List resultList = resultSet2Obj(resultSet, Class.forName(xNode.getResultType()));
return resultList.get(0);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 有参数查询, 返回一个结果
* @param statement
* @param parameter
* @param
* @return
*/
@Override
public T selectOne(String statement, Object parameter) {
XNode xNode = mapperElement.get(statement);
Map parameterMap = xNode.getParameter();
try {
PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql());
buildParameter(preparedStatement, parameter, parameterMap);
ResultSet resultSet = preparedStatement.executeQuery();
List objects = resultSet2Obj(resultSet, Class.forName(xNode.getResultType()));
return objects.get(0);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解析查询参数
* @param preparedStatement
* @param parameter
* @param parameterMap
* @throws Exception
*/
private void buildParameter(PreparedStatement preparedStatement,
Object parameter,
Map parameterMap) throws Exception {
int size = parameterMap.size();
// 判断参数类型
if (parameter instanceof Long) {
// the first parameter is 1, the second is 2 因此这里要从1开始.
for (int i = 1; i
创建ISchoolDao
public interface ISchoolDao {
School querySchoolInfoById(Long treeId);
}
创建IUserDao
public interface IUserDao {
User queryUserInfoById(Long id);
List queryUserList(User user);
}
创建School_Mapper.xml
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
SELECT id, name, address, createTime, updateTime
FROM school
where id = #{id}
创建User_Mapper.xml
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
SELECT id, name, age, createTime, updateTime
FROM user
where id = #{id}
SELECT id, name, age, createTime, updateTime
FROM user
where age = #{age}
ApiTest 测试类
private Logger logger = LoggerFactory.getLogger(ApiTest.class);
// 单个结果查询测试
@Test
public void test_queryUserInfoById() {
String resource = "mybatis-config-datasource.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlMapper.openSession();
try {
User user = session.selectOne("com.thc.design.dao.IUserDao.queryUserInfoById", 1L);
logger.info("测试结果: {}", JSON.toJSONString(user));
} finally {
session.close();
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
集合查询
// 集合结果查询测试
@Test
public void test_queryUserList() {
String resource = "mybatis-config-datasource.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlMapper.openSession();
try {
User req = new User();
req.setAge(18);
List userList = session.selectList("com.thc.design.dao.IUserDao.queryUserList", req);
logger.info("测试结果: {}", JSON.toJSONString(userList));
} finally {
session.close();
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}