数据库JDBC驱动设计理解

文章讲述了如何使用JDBC处理多种数据库连接,通过抽象接口减少冗余代码,运用工厂模式动态创建连接,使用配置文件灵活管理数据库类型,以及进一步的优化如ORM框架简化SQL操作。同时提出了使用JdbcTemplate和数据源来提升数据库操作的便捷性。
摘要由CSDN通过智能技术生成

JDBC驱动详解

问题一:

对于Mysql、Oracle、Sql Server等各式各类的数据库,都有自己的应用层访问协议,但我们的数据库连接程序只能连接一个数据库,要如何避免冗杂的代码来解决该问题

解决方法

利用抽象概念,用Connection代表连接,用Statement代表SQL语句,ResultSet代表返回结果

问题二:

Connection conn = new MysqlConnectionImpl("localhost","3306","stu_db","root","admin");

如果是写具体类,那么哪一天类名更改了,那么就会出现问题

解决方法

不让用户自己new,让系统自己new,对应的就是工厂模式

public class Driver{
    public static Connection getConnection(String dbType,Properties info){
        if("mysql".equals(dbType)){
            return new MysqlConnectionImpl(info);
        }
        if("oracle".equals(dbType)){
            return new OracleConnectionImpl(info);
        }
        if("db2".equals(dbType)){
            return new DB2ConnectionImpl(info);
        }
        throw new RuntimeException("unsupported db type = " + dbType);
    }
}

问题3

对于增加数据库操作,仍需要添加if语句,另外如果修改连接类的类名,那么还是要去修改Driver的代码

解决办法

利用配置文件,通过I/O去读配置文件,从而创建类以及添加if语句,这样就不用手动的去修改代码了

mysql = com.mysql.jdbc.MysqlConnectionImpl
db2 = com.ibm.db2.DB2ConnectionImpl
oracle = com.oracle.jdbc.OracleConnection
sqlserver = com.Microsoft.jdbc.SqlServerConnection
public class Driver{
    public static Connection getConnection(String dbType,Properties info){
        Class<?> clz = getConnectionImplClass(dbType);
        try{
            Constructor<?> c = clz.getConstructor(Properties.class);
            return (Connection) c.newInstance(info);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    private static Class<?> getConnectionImplClass(String dbType){
        // 读取配置文件,从中根据dbType来读取相应的Connection实现类
    }
}

问题4

  1. 客户使用时,需要将具体的实现类写对

  1. 创建实现类的过程在用户面前展现了出来,照理说应该让各个数据库厂商创建自己的Connection实例

解决办法

利用更高级的工厂模式,有多个类继承Driver类,但是这里要避免自己new出一个对象来,让它进行一个动态创建

Class<?> clz = Class.forName("com.mysql.MysqlDriver");
Driver driver = (Driver) clz.newInstance();
Connection conn = driver.getConnection(info);

问题5

如何更加简化,使得第一步和第二步能够一步到位

解决办法
public class MysqlDriver implements Driver {
    
    // 在Mysql驱动类被装载时,就注册到DriverManager的注册表中
    static{
        DriverManager.register(new MysqlDriver());
    }
    
    // 获取具体连接
    public Connection getConnection(String url,Properties info) {
        if(acceptsURL(url)){
            return new MysqlConnectionImpl(info); 
        }
        return null;
    } 
    
    // 格式检查
    public boolean acceptsURL(String url){
        return url.startsWith("jdbc:mysql");
    }
}

简化后的代码

Class.forName("com.mysql.MysqlDriver");
Connection conn = DriverManager.getConnection(
				"jdbc:mysql://localhost:3306/studb",
				"root",
				"admin");

问题6

对于冗长的SQL语句,如何进行简化

解决方法

写一个JDBC的模板

将数据源注入JDBC模板

// 获取数据源(伪代码)
DataSource ds = Tool.getDataSource();
this.jdbcTemplate = new JdbcTemplate(ds);
List<User> users = this.jdbcTemplate.query(
	"select id,name from users",
    new RowMapper<User>(){
        public User mapRow(ResultSet rs,int rowNum) throws SQLException{
            User user = new User();
            user.setID(rs.getInt("id"));
            user.setName(rs.getString("name"));
            return user;
        }
    }
);

但本质问题并没有解决,还是要通过ORM(对象关系映射)来解决,使得其可以通过xml配置来解决,从Java代码中解耦出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值