• 如何模拟编写MyBatis之DataSource与Session呢?


    转自:

    如何模拟编写MyBatis之DataSource与Session呢?

    下文笔者讲述mybatis之模拟DateSource和Session的方法分享,如下所示

    DataSource和Session简介

    DataSource:
        实现标准的javax.sql.DataSource接口,用于获取数据库连接
    Session:
        可以直接调用exec(sql)来执行sql语句(在DataSource指定的数据库中操作)
    

    DataSource创建

    public class VDataSource implements DataSource {
    
        private String url;
        private String user;
        private String password;
    
        // 构架函数,创建时尝试加载数据库驱动类
        public VDataSource(String driverClassName, String url, String user, String password) throws ClassNotFoundException {
            Class.forName(driverClassName); 
            this.url = url;
            this.user = user;
            this.password = password;
        }
    
        // 使用自带的java.sql.DriverManager,代入数据库信息取出一个连接
        @Override
        public Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url, user, password);
        }
    }
    

    Session

    public interface Session {
        void exec(String sql) throws SQLException;
    }
     
    新建一个VSession类实现这个接口
    public class VSession implements Session {
    
        private DataSource dataSource;
        private Connection conn;
    
        public VSession(DataSource dataSource) {
            this.dataSource = dataSource;
        }
    
        // 若还Session新建后未连接过,从dataSource中获取一个
        public Connection getConnection() throws SQLException {
            if (conn == null) {
                conn = dataSource.getConnection();
            }
            return conn;
        }
    
        @Override
        public void exec(String sql) throws SQLException {
            Statement stmt = null;
            ResultSet rs = null;
            try {
                // 从连接中创建一个statement
                stmt = getConnection().createStatement();
                // statement执行一句sql查询
                rs = stmt.executeQuery(sql);
                // 结果的元数据,包括别名、列名、类型等
                ResultSetMetaData rsmd = rs.getMetaData();
                // 将所有结果输出
                if (rs.next()) {
                    for (int i=1; i<=rsmd.getColumnCount(); i++) {
                        System.out.println(rsmd.getColumnLabel(i)+"="+rs.getObject(i));
                    }
                    System.out.println();
                }
            } finally {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
            }
        }
    
    }
    

    测试代码

    public class MyTest {
        private static String driverClassName = "com.mysql.jdbc.Driver";
        // 数据库可改为自己需要的地址
        private static String url = "jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf8";
    
        public static void main(String args[]) throws Exception {
            // 创建VDataSource
            DataSource data = new VDataSource(driverClassName, url, "root", "123456");
            // 创建Session
            Session session = new VSession(data);
            // 执行查询sql
            session.exec("select * from users where id=1");
        }
    }
     
  • 相关阅读:
    Hive基础5
    力扣hot100 两数之和 哈希表
    【Linux】Linux远程访问Windows下的MySQL数据库
    Java 18的未来:新特性和编程实践
    Rails进阶——框架理论认知与构建方案建设(一)
    Asahi Linux 采用开源驱动,在 Apple M1 下运行首个三角形渲染
    LazadaAPI接口解析,实现获得lazada商品评论列表
    【计算机网络】成功解决 ARP项添加失败:请求的操作需要提升
    Python-Scrapy框架(框架学习)
    二叉树层序遍历算法
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/128127567