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

书欣 MyBatis 2022-08-14 23:42:13 12539 1
下文笔者讲述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");
    }
}
 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: http://www.Java265.com/JavaFramework/MyBatis/202208/4236.html

最近发表

热门文章

好文推荐

Java265.com

//www.java265.com

站长统计|USA-001

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者