java开发的时候,数据库连接方式除了jdbc,jndi,还有JDBC-ODBC桥的方式、JDBC+厂商Database Connection Server+DataBase的形式和纯JDBC+DATABASE的连接方式。推荐选择千锋教育,千锋教育服务面对企业建立全方位、立体化、遍布全国的企业合作网络,覆盖全国一线二线城市大中小型公司。
Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的 *** 作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。
想要了解更多Java培训的相关信息,推荐咨询千锋教育。千锋教育成立教研学科中心,推出贴近企业需求的线下技能培训课程。采用全程面授高品质、高体验培养模式,学科大纲紧跟企业需求,拥有国内一体化教学管理及学员服务,在职业教育发展道路上不断探索前行。
我的想法是这样的:首先建立一个showDatabasejava ,用于连接数据库,其源文件如下:
package stuTest;
import javasql;
public class showDatabase {
public Connection getConnection()
{
Connection conn;
try{
ClassforName("orggjtmmmysqlDriver")newInstance();
conn=DriverManagergetConnection("jdbc:","root","a123456");
//connsetAutoCommit(false);
}
catch(Exception e){throw new RuntimeException(e);}
return conn;
}
public void closeCon(Connection conn)
{
try{
if(conn!=null) connclose();
}
catch(SQLException e)
{
throw new RuntimeException(e);
}
}
public void rollback(Connection conn)
{
try
{
connrollback();
}
catch(SQLException e)
{
throw new RuntimeException(e);
}
}
}
前几天笔者发布了博客,手写mybatis彻底搞懂框架原理。为了帮助初学者更好理解mybatis框架,这次讲解一下Java的JDBC的运行过程。
JDBC的作用
JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来 *** 作关系型数据库。JDBC接口及相关类在javasql包和javaxsql包里。我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。
JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加简单。
JDBC的连接步骤
执行一次JDBC连接,分六个步骤进行:
1 导入包
在程序中包含数据库编程所需的JDBC类。大多数情况下,使用 import javasql 就足够了
2 注册JDBC驱动程序
需要初始化驱动程序,这样就可以打开与数据库的通信。
3 打开一个连接
使用DriverManagergetConnection()方法来创建一个Connection对象,它代表一个数据库的物理连接。
4 执行一个查询
需要使用一个类型为Statement或PreparedStatement的对象(两者区别看后文),并提交一个SQL语句到数据库执行查询。
5 从结果集中提取数据
这一步中演示如何从数据库中获取查询结果的数据。使用ResultSetgetXXX()方法来检索的数据结果
6 清理环境资源
在使用JDBC与数据交互 *** 作数据库中的数据后,应该明确地关闭所有的数据库资源以减少资源的浪费。本文使用了try with resources方式关闭资源,这是JDK7的语法糖,读者可自行搜索。
完整代码如下。
JDBC的最佳实践
JDBC是如何实现Java程序和JDBC驱动的松耦合?
JDBC API使用Java的反射机制来实现Java程序和JDBC驱动的松耦合。看一下上文的JDBC示例,你会发现所有 *** 作都是通过JDBC接口完成的,而驱动只有在通过ClassforName反射机制来加载的时候才会出现。
这是Java核心库里反射机制的最佳实践之一,它使得应用程序和驱动程序之间进行了隔离,让迁移数据库的工作变得更简单。
Statement和PreparedStatement区别
预编译
创建时的区别:
执行时的区别:
由上可以看出,PreparedStatement有预编译的过程,已经绑定sql,之后无论执行多少次,都不会再去进行编译,而Statement 不同,如果执行多次,则相应的就要编译多少次sql,所以从这点看,PreparedStatement的效率会比Statement要高一些。PreparedStatement是预编译的,所以可以有效的防止SQL注入等问题
占位符
PrepareStatement可以替换变量在SQL语句中可以包含,可以用替换成变量。
而Statement只能用字符串拼接。
JDBC的ResultSet
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。
ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了,next()方法会返回false。可以在for循环中用它来遍历数据集。
默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也可以创建可以回滚或者可更新的ResultSet,像下面这样。
当生成ResultSet的Statement对象要关闭或者重新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。
可以通过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据。
ResultSet的不同类型
根据创建Statement时输入参数的不同,会对应不同类型的ResultSet。如果你看下Connection的方法,你会发现createStatement和prepareStatement方法重载了,以支持不同的ResultSet和并发类型。
ResultSet对象有三种类型。
ResultSet有两种并发类型。
数据库有个连接缓冲池,是为了降低每次建立/释放连接时的开销,每次JDBC连接都会产生一个连接在池中,关闭连接后并不会马上释放,如果频繁连接,池里的连接数会达到最大连接数,从而导致数据库连接不稳定~
用这个类吧好的话,给我加加分
import javasql;
/
@功能: 一个JDBC的本地化API连接类,封装了数据 *** 作方法,只用传一个SQL语句即可
@作者: 李开欢
@日期: 2007/
/
public class ConnectionDemo {
/
这里可以将常量全部放入另一个类中,以方便修改
/
private static Connection conn;
private static Statement ps;
private static ResultSet rs;
private static final String DRIVER = "commicrosoftjdbcsqlserverSQLServerDriver";
private static final String URL = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
private static final String USER ="sa";
private static final String PASS = "sa";
public ConnectionDemo() {
// TODO Auto-generated constructor stub
ConnectionDemogetConnection();
}
public static Connection getConnection(){
Systemoutprintln("连接中");
try {
ClassforName(ConnectionDemoDRIVER);
conn = DriverManagergetConnection(ConnectionDemoURL, ConnectionDemoUSER, ConnectionDemoPASS);
Systemoutprintln("成功连接");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
return conn;
}
public static Statement getStatement(String sql){
Systemoutprintln("执行SQL语句中");
try {
ps = conncreateStatement(ResultSetTYPE_SCROLL_SENSITIVE, ResultSetCONCUR_UPDATABLE);
if(sqlsubstring(0, 6)equals("select")){
rs = psexecuteQuery(sql);
Systemoutprintln("执行完查询 *** 作,结果已返回ResultSet集合");
}else if(sqlsubstring(0, 6)equals("delete")){
psexecuteUpdate(sql);
Systemoutprintln("已执行完毕删除 *** 作");
}else if(sqlsubstring(0, 6)equals("insert")){
psexecuteUpdate(sql);
Systemoutprintln("已执行完毕增加 *** 作");
}else{
psexecuteUpdate(sql);
Systemoutprintln("已执行完毕更新 *** 作");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
return ps;
}
public static ResultSet getResultSet(){
Systemoutprintln("查询结果为:");
return rs;
}
public static void closeConnection(){
Systemoutprintln("关闭连接中");
try {
if (rs != null) {
rsclose();
Systemoutprintln("已关闭ResultSet");
}
if (ps != null) {
psclose();
Systemoutprintln("已关闭Statement");
}
if (conn != null) {
connclose();
Systemoutprintln("已关闭Connection");
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ConnectionDemogetConnection();
String sql = "delete from type where id = 1";
ConnectionDemogetStatement(sql);
String sql2 = "insert into type values(1,'教学设备')";
ConnectionDemogetStatement(sql2);
String sql1 = "select from type";
ConnectionDemogetStatement(sql1);
ResultSet rs = ConnectionDemogetResultSet();
Systemoutprintln("编号 "+"类 型");
try {
while(rsnext()){
Systemoutprint(" "+rsgetInt(1)+" ");
Systemoutprintln(rsgetString(2));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
ConnectionDemocloseConnection();
}
}
这是老师发给我们的资料,共享给你:\x0d\Type 1: jdbc-odbc桥 \x0d\Jdbc-odbc 桥 是sun公司提供的,是jdk提供的的标准api 这种类型的驱动实际是把所有 jdbc的调用传递给odbc ,再由odbc调用本地数据库驱动代码( 本地数据库驱动代码是指 由数据库厂商提供的数据库 *** 作二进制代码库,例如在oracle for windows中就是oci dll 文 件) \x0d\\x0d\jdbc-odbc桥|odbc|厂商DB代码---数据库Server\x0d\\x0d\只要本地机装有相关的odbc驱动那么采用jdbc-odbc桥几乎可以访问所有的数据库,jdbc- odbc方法对于客户端已经具备odbc driver的应用还是可行的\x0d\\x0d\但是,由于jdbc-odbc先调用 odbc再由odbc去调用本地数据库接口访问数据库所以,执行效率比较低,对于那些大数据量 存取的应用是不适合的而且,这种方法要求客户端必须安装odbc 驱动,所以对于基于 internet ,intranet的应用也是不合适的因为,你不可能要求所有客户都能找到odbc driver \x0d\\x0d\=====一般ACCESS用到的比较多,初学者用。实际项目是不用的。\x0d\\x0d\Type 2: 本地Api驱动 \x0d\\x0d\本地api驱动直接把jdbc调用转变为数据库的标准调用再去访问数据库\x0d\\x0d\这种方法需要本地 数据库驱动代码 本地api驱动|厂商DB代码---数据库Server这种驱动比起jdbc-odbc桥执行效率大大提高了但是,它仍然需要在客户端加载数据库厂商 提供的代码库这样就不适合基于internet的应用并且,他的执行效率比起3,4型的jdbc驱动 还是不够高 \x0d\\x0d\Type3:网络协议驱动 这种驱动实际上是根据我们熟悉的三层结构建立的 jdbc先把对数局库的访问请求传递给网 络上的中间件服务器 中间件服务器再把请求翻译为符合数据库规范的调用,再把这种调用 传给数据库服务器如果中间件服务器也是用java开法的,那么在在中间层也可以使用1,2型 jdbc驱动程序作为访问数据库的方法 网络协议驱动--中间件服务器---数据库Server \x0d\\x0d\由于这种驱动是基于server的所以,它不需要在客户端加载数据库厂商提供的代码库而且 他在执行效率和可升级性方面是比较好的因为大部分功能实现都在server端,所以这种驱动 可以设计的很小,可以非常快速的加载到内存中 但是,这种驱动在中间件层仍然需要有配置 其它数据库驱动程序,并且由于多了一个中间层传递数据,它的执行效率还不是最好 \x0d\\x0d\Type4 纯JAVA驱动 \x0d\这种驱动直接把jdbc调用转换为符合相关数据库系统规范的请求由于4型驱动写的应用可 以直接和数据库服务器通讯这种类型的驱动完全由java实现,因此实现了平台独立性 本地协议驱动---------数据库Server \x0d\\x0d\由于这种驱动不需要先把jdbc的调用传给odbc或本地数据库接口或者是中间层服务器所 以它的执行效率是非常高的而且,它根本不需要在客户端或服务器端装载任何的软件或驱动 这种驱动程序可以动态的被下载但是对于不同的数据库需要下载不同的驱动程序 \x0d\\x0d\以上对四种类型的jdbc驱动做了一个说明那么它们适合那种类型的应用开发呢 \x0d\\x0d\Jdbc-odbc桥由于它的执行效率不高,更适合做为开发应用时的一种过度方案,或着对于初学 者了解jdbc编程也较适用 对于那些需要大数据量 *** 作的应用程序则应该考虑2,3,4型驱动在intranet方面的应用可以 考虑2型驱动,但是由于3,4型驱动在执行效率上比2型驱动有着明显的优势,而且目前开发 的趋势是使用纯java所以3,4型驱动也可以作为考虑对象 至于基于internet方面的应用就只有考虑3,4型驱动了 因为3型驱动可以把多种数据库驱 动都配置在中间层服务器所以3型驱动最适合那种需要同时连接多个不同种类的数据库, 并且对并发连接要求高的应用 4型驱动则适合那些连接单一数据库的工作组应用。\x0d\\x0d\现在是纯java 开发,所以一般都用type4的jdbc driver。
以上就是关于java开发的时候,数据库连接方式除了jdbc,jndi,还有有哪几种全部的内容,包括:java开发的时候,数据库连接方式除了jdbc,jndi,还有有哪几种、WebService与数据库的长连接,该怎么处理、彻底搞懂JDBC的运行过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)