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

news/2024/7/7 22:14:37

转自:

如何模拟编写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");
    }
}
 

http://lihuaxi.xjx100.cn/news/241760.html

相关文章

Linux账户安全管理--useradd、groupadd、passwd、chown、chmod工具

groupadd-g 设置组id号实例&#xff1a; groupadd tomcatgroupadd -g600 tomcat删除组用groupdelgroupdel tomcatuseradd-c comment 给新用户添加备注 -d home_dir 为主目录指定一个名字&#xff08;如果不想用登录名作为主目录名的话&#xff09; -e expire_date 用Y…

参加UI培训后可以找什么工作

UI设计在近几年备受大家的关注&#xff0c;很多企业对UI设计这个岗位也显得尤为重要&#xff0c;很多人都想转型学习UI设计技术&#xff0c;大多数人选择参加UI培训机构进行系统学习&#xff0c;那么通过系统培训的同学参加UI培训后可以找什么工作呢?来看看下面的详细介绍。 参…

(C++)1026 程序运行时间

#include<cstdio> const int CLK_TCK100;int main(){ //1.读入c1,c2int c1,c2;scanf("%d%d",&c1,&c2); //2.定义常量CLK_TCK100 //难点&#xff1a;不足 1 秒的时间四舍五入到秒 --不用round()&#xff0c;避免浮点数运算 int dif c2-c1;if(dif%100&…

JAVA根类加载器

2019独角兽企业重金招聘Python工程师标准>>> 根类加载器非常特殊&#xff0c;他不是ClassLoader的子类。是由JVM自身实现的。 转载于:https://my.oschina.net/u/3303751/blog/1023488

git在不同操作系统下自动替换换行符

2019独角兽企业重金招聘Python工程师标准>>> 一天使用docker创建一个镜像执行报一个错 standard_init_linux.go:175: exec user process caused "no such file or directory"参考资料 http://blog.jobbole.com/46200/ http://neue.v2ex.com/t/309469 git …

UI培训教程分享:常用的商业插画风格有哪些?

在UI设计岗位中插画设计是作为一名合格的UI设计师都会接触到的工作内容&#xff0c;运用插画设计&#xff0c;做到图文结合&#xff0c;令用户的印象也更加深刻&#xff0c;今天小编为大家分享的UI培训教程就是关于常用的商业插画风格有哪些?希望能够给大家带来帮助。 UI培训教…

Oracle的Java模块化系统保卫战

2017年企业新兴技术&#xff08;ETE&#xff09;大会上最为及时的演讲之一要算由Oracle JVM负责人Karen Kinnear呈献的“Java的未来&#xff1a;模块化及其他”。在她演讲之前的这段时间发生了很多事情&#xff0c;其中最为引人瞩目的就是5月8号针对JSR 376的投票事件。\\Kinne…

(C++)1046 划拳

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一轮&…