您当前的位置: 首页 > 

java持续实践

暂无认证

  • 4浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式 中介者模式

java持续实践 发布时间:2022-04-01 22:35:27 ,浏览量:4

文章目录
      • 中介者模式
      • 中介者模式实战
        • 不使用中介者模式写法
        • 使用中介者模式写法
      • 测试验证

中介者模式

中介者模式使用的场景: 把复杂功能的重复调用, 中间添加一层包装, 对外提供简单, 易扩展的服务能力. 例如中间件组提供的统一的接口与服务等.

中介者模式实战

模拟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();
        }
    }
关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.1776s