(点击上方蓝字,可快速关注我们)
来源:**
链接:http://www.cnblogs.com/easygame/p/5116251.html
ADO.NET在Java中的对应技术是JDBC,企业库DataAccessApplicationBlock模块在Java中的对应是spring-jdbc模块,EntityFramework在Java中对应的ORM是Hibernate。关系数据库、SQL、数据库事务、分布式事务的概念都是通用的。
1.JDBC
JDBC代码和ADO.NET代码一样,除了学习时写demo来掌握核心对象外,不适合在项目中直接使用。另外Java中万年不变的学术派抽象接口给我目前看到的大多数容器和框架带来了极大的不便,如Tomcat和Spring中定义的一些抽象类型无论是属性和方法都和.NET中的很相似,但又不得不和Java中的基础接口适配。抽象不能像Java中一样只关注操作接口而不关注基础的数据结构,正确的类型的抽象比方法的抽象更重要,但Java中抽象的做法好像还有一个原则就是与众不同,而不只是关注操作。
(1)核心对象
ADO.NET中的4个核心抽象类是DbConnection、DbCommand、DbParameter和DbTransaction.DataAdapter和DataSet构建在核心对象之上。
JDBC的4个核心接口DataSource、Connection、Statement和ResultSet。PreparedStatement是Statement的子类型。
虽然两者不能完全匹配,对数据库操作的核心操作是一致的,都是打开链接、发送命令和关闭连接的过程。
(2)参数处理
参数的核心是索引和参数值。ADO.NET中提供了DbDataParameter类型用于参数的抽象。JDBC中没有提供参数的抽象类型,而是通过PreparedStatement定义的方法来设置参数,可以通过Connection对象获取该类型对象。
(3)事务处理
事务的核心操作是提交和回滚。ADO.NET中提供了DbTransaction类型用于事务的抽象,可以通过DbConnection的BeginTransaction方法开启显式事务.JDBC中没有提供事务的抽象类型,而是通过Connection定义的setAutoCommit、commit和rollback方法来操作事务。隐性事务的自动提交和显性事务的手动控制方面两者是一致的。
(4)数据源
JDBC中的Connection不具备连接池等高级功能。DataSource定义了数据源接口,用于连接管理、连接池和分布式事务等高级功能,连接池的重要性不用强调了。我们可以使用Apache Commons DBCP 2或C3P0(Hibernate)等第三方DataSource实现,Spring框架也有内置的一些简单的DataSource实现,如**DriverDataSource、SingleConnectionDataSource、DriverManagerDataSource等。
我们分别使用DriverManager、commons-dbcp2(参考1)、c3p0(参考2)和h2database(参考3)演示无连接池、dbcp2连接池、c3p0连接池的使用:
package test.jdbc;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Jdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException, PropertyVetoException {
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 = DriverManager.getConnection(url);
Connection conn = get_dbcp2_dataSource(className, url).getConnection();
// Connection conn = get_c3p0_dataSource(className,//
// url).getConnection();
conn.setAutoCommit(false);
conn.prepareStatement(ddl).EⅩEcute();
conn.createStatement().EⅩEcute(dml);
conn.commit();
conn.setAutoCommit(true);
PreparedStatement statement = conn.prepareStatement(query);
statement.setString(1, "tom");
ResultSet rs = statement.EⅩEcuteQuery();
User user = new User();
while (rs.next()) {
user.setId(rs.getInt(1));
user.setUsername("username");
break;
}
conn.close();
System.out.println(String.format("id:%d,username:%s", user.getId(), user.getUsername()));
}
public static Connection getConnection(String driverClassName, String url) {
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
Connection conn = null;
try {
conn = DriverManager.getConnection(url);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static DataSource get_dbcp2_dataSource(String clssName, String url) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(clssName);
dataSource.setUrl(url);
return dataSource;
}
public static DataSource get_c3p0_dataSource(String clssName, String url) throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(clssName);
dataSource.setJdbcUrl(url);
return dataSource;
}
}
其中2dbcp、c3p0和h2database的Maven依赖如下:
Tag标签: