加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Web系列:JDBC 基础

发布时间:2020-12-14 06:26:40 所属栏目:Java 来源:网络整理
导读:ADO.NET在Java中的对应技术是 企业库DataAccessApplicationBlock模块在Java中的对应是 模块,EntityFramework在Java中对应的ORM是 。关系数据库、SQL、数据库事务、分布式事务的概念都是通用的。 1.JDBC JDBC代码和ADO.NET代码一样,除了学习时写demo来掌握

ADO.NET在Java中的对应技术是企业库DataAccessApplicationBlock模块在Java中的对应是模块,EntityFramework在Java中对应的ORM是。关系数据库、SQL、数据库事务、分布式事务的概念都是通用的。

1.JDBC

JDBC代码和ADO.NET代码一样,除了学习时写demo来掌握核心对象外,不适合在项目中直接使用。另外Java中万年不变的学术派抽象接口给我目前看到的大多数容器和框架带来了极大的不便,如Tomcat和Spring中定义的一些抽象类型无论是属性和方法都和.NET中的很相似,但又不得不和Java中的基础接口适配。抽象不能像Java中一样只关注操作接口而不关注基础的数据结构,正确的类型的抽象比方法的抽象更重要,但Java中抽象的做法好像还有一个原则就是与众不同,而不只是关注操作。

(1)核心对象

ADO.NET中的4个核心抽象类是DataAdapter和DataSet构建在核心对象之上。

JDBC的4个核心接口是Statement的子类型。

虽然两者不能完全匹配,对数据库操作的核心操作是一致的,都是打开链接、发送命令和关闭连接的过程。

(2)参数处理

?参数的核心是索引和参数值。ADO.NET中提供了类型用于参数的抽象。JDBC中没有提供参数的抽象类型,而是通过定义的方法来设置参数,可以通过Connection对象获取该类型对象。

(3)事务处理

事务的核心操作是提交和回滚。ADO.NET中提供了类型用于事务的抽象,可以通过DbConnection的BeginTransaction方法开启显式事务.JDBC中没有提供事务的抽象类型,而是通过定义的方法来操作事务。隐性事务的自动提交和显性事务的手动控制方面两者是一致的。

(4)数据源

JDBC中的Connection不具备连接池等高级功能。定义了数据源接口,用于连接管理、连接池和分布式事务等高级功能,连接池的重要性不用强调了。我们可以使用Apache Commons DBCP 2或C3P0(Hibernate)等第三方DataSource实现,Spring框架也有内置的一些简单的DataSource实现,如SimpleDriverDataSource、SingleConnectionDataSource、DriverManagerDataSource等。

我们分别使用DriverManager、commons-dbcp2(参考1)、c3p0(参考2)和h2database(参考3)演示无连接池、dbcp2连接池、c3p0连接池的使用:

main(String[] args) String ddl = "create table user(id integer not null primary key,username varchar(64))" String dml = "insert into user (id,username) values(1,'tom')" String query = "select id,username from user where username=?" String className = "org.h2.Driver" String url = "jdbc:h2:mem:test" Connection conn = conn.setAutoCommit( conn.setAutoCommit( PreparedStatement statement = statement.setString(1,"tom" ResultSet rs = User user = user.setId(rs.getInt(1 user.setUsername("username" System.out.println(String.format("id:%d,username:%s" } Connection conn = conn = } BasicDataSource dataSource = DataSource get_c3p0_dataSource(String clssName,String url) ComboPooledDataSource dataSource = }

其中2dbcp、c3p0和h2database的Maven依赖如下:

com.h2database h2 1.4.190 org.apache.commons commons-dbcp2 2.1.1 com.mchange c3p0 0.9.5.2

2.Spring Jdbc

JDBC和ADO.NET的API类似,都不适合我们直接使用,如果不适用ORM框架,在.NET中我们使用DataAccessApplicationBlock,在Java中我们可以使用。Spring JDBC的核心类是

(1)Sprnig的委托实现

要使用Spring Jdbc的功能,首先要理解Spring中委托的使用方式,Spring定义一个包含该委托签名的接口(这些接口通常都是没有内置实现的),当需要委托参数时,使用该接口作为参数类型,利用Java中的匿名类功能,可以在内联代码中实现接口定义的委托,下面列举几个常见的委托接口:

:PreparedStatement接口的createPreparedStatement方法。

PreparedStatement createPreparedStatement(Connection con) }

:PreparedStatementCallback泛型接口的doInPreparedStatement方法。

PreparedStatementCallback T doInPreparedStatement(PreparedStatement ps) }

:TransactionCallback泛型接口的T doInTransaction(TransactionStatus status)方法。

TransactionCallback }

:ResultSetExtractor泛型方法的T?extractData(ResultSet rs)方法。

ResultSetExtractor T extractData(ResultSet rs) }

(1)JdbcTemplate

?JdbcTemplate需要配合DataSource一起使用。JdbcTemplate的代码中很多都是通过IDE自动生成匿名类导致的,真正手写的代码量并不多。

main(String[] args) String ddl = "create table user(id integer not null primary key,username varchar(64))" String dml = "insert into user (id,'tom')" String query = "select id,username from user where username=?" String className = "org.h2.Driver" String url = "jdbc:h2:mem:test" DataSource dataSource = JdbcTemplate jdbcTemplate = PlatformTransactionManager tm = TransactionTemplate tt = tt.execute( User user = jdbcTemplate.query(query, Object[] { "tom" }, ResultSetExtractor User extractData(ResultSet rs) User user = user.setId(rs.getInt(1 user.setUsername(rs.getString("username" System.out.println(String.format("id:%d,user.getUsername())); }

(3)TransactionTemplate

在上面的代码中出现了用于事务处理,TransactionTemplate依赖,Spring Jdbc中定义的实现类用于处理数据库事务。在Spring的orm、jsm、tx等模块中还有其他的实现。

(4)JdbcDaoSupport

JdbcDaoSupport是一个在内部使用JdbcTemplate字段并且实现了DaoSupport接口的抽象类,可供我们自定义DAO类时参考或用作基类。

MyDao .setJdbcTemplate( @SuppressWarnings("unchecked" PlatformTransactionManager tm = DataSourceTransactionManager( TransactionTemplate tt = tt.execute( .getJdbcTemplate().query(query, Object[] { username }, ResultSetExtractor User extractData(ResultSet rs) User user = user.setId(rs.getInt(1 user.setUsername(rs.getString("username" }

参考

(1)http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

(2)http://sourceforge.net/projects/c3p0/

(3)http://www.h2database.com/html/cheatSheet.html

(4)http://commons.apache.org/proper/commons-dbcp/guide/jndi-howto.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读