JDBC详解

JDBC

 

什么是JDBC?

Java语言访问数据库的一律种标准,是一致仿API

JDBC (Java Database Connectivity)
API,即Java数据库编程接口,是平组正式的Java语言中的接口及好像,使用这些接口及相近,Java客户端程序可以拜各种不同品种的数据库。比如成立数据库连接、执行SQL语句进行多少的存取操作。

 

   JDBC规范应用接口及兑现分离的构思设计了Java数据库编程的框架。接口包含在java.sql及javax.sql包吃,其中java.sql属于JavaSE,javax.sql属于JavaEE。这些接口的兑现类似叫做数据库驱动程序,由数据库的厂商还是其它的厂商还是个体提供。

 

   为了要客户端程序独立为特定的数据库驱动程序,JDBC规范建议开发者使用基于接口的编程方式,即尽量要应用只依赖java.sql及javax.sql中之接口及类似。

SQL Server 1

 

JDBC驱动程序:

咦是JDBC驱动程序?

这些是逐一数据库厂家根据JDBC的正规制作的JDBC实现类似

JDBC驱动程序的季种植类型:

1.       第一种植档次的驱动程序的贯彻是经过以JDBC的调用全部寄托给任何编程接口来落实的,比如ODBC。这种类型的驱动程序需要设置本地代码库,即乘让地方的次序,所以便携性较差。比如JDBC-ODBC桥驱动程序

2.       第二种植类型的驱动程序的落实是有基于Java语言的。即该驱动程序一部分是因此Java语言编写,其它一些委托本地的数据库的客户端代码来落实。同类型1的教一样,该型的驱动程序也凭借地方的顺序,所以便携性较差

3.       第三种植类型的驱动程序的实现是整个基于JAVA语言的。该型的驱动程序通常由某中间件服务器提供,这样客户端程序可以用数据库无关之说道以及中路件服务器进行通信,中间件服务器又以客户端的JDBC调用转发让数据库进行拍卖

4.       第四种植档次的驱动程序的兑现是通基于JAVA语言的。该品种的驱动程序中蕴藏了一定数据库的顾协议,使得客户端好直接与数据库进行通信

 

JDBC类结构:

                           DriverManager

 

Driver                               Driver

 

Connection                         Connection

 

Statement                                  Statement

 

Resultset                                    Resultset

 

DriverManager:这个是一个落实类似,它是一个厂子类,用来生产Driver对象的

其一仿佛的结构设计模式吧工厂方法

Driver:这是驱动程序对象的接口,它对一个活生生的数据库驱动程序对象,那么是数据库驱动程序对象是自乌来之吧?

DriverManager工厂中起只方法:getDriver(String URL),通过这个措施好拿走驱动程序对象,这个艺术是在依次数据库厂商按JDBC规范设计之数据库驱动程序包里的类似中静态实现的,也尽管是以静态块被

Connection:这个接口可以制向一个数据库连接对象,那么如何获得此连续对象为?

举凡由此DriverManager工厂中之getConnection(String URL)方法取得的

Statement:用于执行静态的SQL语句之接口,通过Connection中之createStatement方法取得的

Resultset:用于因为结果集对象的接口,结果集对象是经Statement中的execute等艺术取得的

 

JAVA以JDBC访问数据库的步子:

1.     得到数据库驱动程序

2.     创建数据库连接

3.     执行SQL语句

4.     得到结果集

5.     对结果集做相应的拍卖(增,删,改,查)

6.     关闭资源:这里释放的凡DB中之资源

SQL Server 2 

  

设置classpath:

1.     在java文件被自底包名一定要是工程基目录下的子目录,classpath:基目录

2.     .jar包,需要以之.jar包的门路概括这文件之全名添加到classpath中来

Oracle连接字符串的书写格式:

“oracle:jdbc:thin:@ip:1521: 数据库名”,”数据库用户名”,”数据库密码”

 

简短的例子:

package
moudule1.first;

 

import
java.sql.*;

 

public class
FirstJdbc

{

      public
static void main(String[] args)

     
{

                 String sql=”select * from
yuchen_user”;

                 Connection
con=null;

                 Statement
st=null;

                 ResultSet
rs=null;

                

     
 try

     
 { 

                
Class.forName(“oracle.jdbc.driver.OracleDriver”);

                
con=DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:name”,
“scott”,”tiger”);

                
st=con.createStatement();

                
rs=st.executeQuery(sql);

                
while(rs.next())

                 {

                           
System.out.println(rs.getInt(“id”));

                           
System.out.println(rs.getString(“name”));

                 }

     
 }catch(Exception e)

     
 {

     
           e.printStackTrace();

     
 }finally

     
 {

     
           try

     
           {

     
                con.close();

     
           }catch(Exception e)

     
           {}

     
          

     
           try

     
           {

     
                st.close();

     
           }catch(Exception e)

     
           {

     
           }

     
          

     
           try

     
           {

     
                rs.close();

     
           }catch(Exception e)

     
           {

     
           }

                     

     
 }

 

                

     
}

     

}

 

 

常用数据库的驱动程序及JDBC
URL:

Oracle数据库:

驱动程序包名:ojdbc14.jar

 驱动类的名:oracle.jdbc.driver.OracleDriver

 JDBC URL:jdbc:oracle:thin:@dbip:port:databasename

 说明:驱动程序包名有或会见转换

       JDBC URL中黑色字体部分要原封不动的保留,为该令识别的URL格式。红色字体部分用依据数据库的安装情况填写。其中各个部分含义如下:

        dbip –为数据库服务器的IP地址,如果是地方可写:localhost或127.0.0.1。

        port –为数据库的监听端口,需要看安装时的安排,缺省为1521。

        databasename
–为数据库的SID,通常也大局数据库的讳。

        举例如果要是拜访当地的数额库allandb,端口1521,那么URL写法如下:

      
jdbc:oracle:thin:@localhost:1521:allandb 下载地址如下:

http://www.oracle.com/technology/software/tech/java/sqlj\_jdbc/index.html

 

SQL Server数据库

   驱动程序包名:msbase.jar mssqlserver.jar
msutil.jar

   驱动类的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver

   JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename

   说明:驱动程序包名有或会见转换

        JDBC URL中黑色字体部分必须原封不动的保留,为该叫识别的URL格式。红色字体部需要根据数据库的安情况填写。其中各个部分含义如下:

       dbip –为数据库服务器的IP地址,如果是本土可写:localhost或127.0.0.1。

        port –为数据库的监听端口,需要看安装时的布局,缺省为1433。

       databasename
–数据库的名。

       举例如果只要看当地的数目库allandb,端口1433,那么URL写法如下:

       jdbc:
microsoft: sqlserver:@localhost:1433; DatabaseName
=allandb

       下载地址:http://www.microsoft.com/downloads/details.aspx

 

 MySQL数据库

   驱动程序包名:mysql-connector-java-3.1.11-bin.jar

   驱动类的名:com.mysql.jdbc.Driver

   JDBC URL:jdbc:mysql://dbip:port/databasename

   说明:驱动程序包名有或会见转移

        JDBC URL中黑色字体部分必须原封不动的保存,为该令识别的URL格式。红色字体部需要依据数据库的装情况填写。其中各个组成部分含义如下:

        dbip –为数据库服务器的IP地址,如果是地方可写:localhost或127.0.0.1。

        port –为数据库的监听端口,需要看安装时之布局,缺省为3306。

        databasename
–数据库的名。

        举例如果要访问当地的数据库allandb,端口1433,那么URL写法如下:

      
jdbc:mysql://localhost:3306/allandb

   下载地址:http://dev.mysql.com/downloads/connector/j/

 

Access数据库

   驱动程序包名:该驱动程序包含在JavaSE中,不待格外安装。

   驱动类的讳:sun.jdbc.odbc.JdbcOdbcDriver

   JDBC URL:jdbc:odbc:datasourcename

   说明:该叫只能工作以Windows系统中,首先得在操作系统被起一个得以看Access数据库的本土数据源(ODBC),如果名字为allandb,那么URL写法如下:

       
jdbc:odbc:allandb

 

PreparedStatement接口:

预编译的sql语句对象

意: 解决了书sql语句时部分独特之字符与sql保留字符冲突之题目,非常有利

/**

*知识点:

*PreparedStatement接口和措施的以

*程序目标:

*java文件:

*PreparedInsert.java:连接数据库,插入一久数据

*JdbcUtil.java:实现一个器类,功能:1.连数据库 2.关资源

*/

 

package
moudule1.preparedstatement;

 

import
java.sql.*;

import
moudule1.com.*;

 

public class
PreparedInsert

{

      public
static void main(String[] args)

     
{

          
String sql=”insert into yuchen_user (id,name) values
(?,?)”;

          
System.out.println(sql);

          

          
Connection con=null;

          
PreparedStatement ps=null;

          

          
try{

                
con=JdbcUtil.getConnection();

                
ps=con.prepareStatement(sql);

                

                
ps.setInt(1,2);

                
ps.setString(2,”zhangsan”);

                
ps.executeUpdate();

                

                
ps.setInt(1,3);

                
ps.setString(2,”lisi”);

                
ps.executeUpdate();

                

          
}catch(Exception e){

                
e.printStackTrace();

          
}finally{

                
JdbcUtil.close(con,ps);

                 }

          
}

     
}

 

package
moudule1.com;

 

import
java.sql.*;

 

public class
JdbcUtil{

     

      public
static Connection getConnection() throws
Exception{

          
Class.forName(“oracle.jdbc.driver.OracleDriver”);

       return
DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:name”,
“scott”,”tiger”);

          
}

          

      public
static void close(Connection con,Statement st){

          

          
close(con);

          
close(st);

          

          
}

          

      public
static void close(Connection con,Statement st,ResultSet
rs){

          

          

          
close(con,st);

          
close(rs);

          

          
}

          

      public
static void close(Connection con){

          
try{

                

                
con.close();

                

          
}catch(Exception e){

                

                

                 }

          

          
}

          

      public
static void close(Statement st){

          

          
try{

                

                
st.close();

                

          
}catch(Exception e){

                

                 }

          
}

          

      public
static void close(ResultSet rs){

          

          
try{

                

                
rs.close();

                

          
}catch(Exception e){

                

                 }

          

          
}

     

     
}

     

数据库的增删改查的事例:

/**

*知识点:

*JDBC+SQL+ORACLE

*先后目标:

*UserDao.java:实现了数据库的增删改查

*JdbcUtil.java:工具类,有连库和倒闭资源的不二法门

*/

 

package
moudule1.idus;

 

import
java.sql.*;

import
moudule1.com.*;

 

public class
UserDao{

     

      private
String sql;

      private
Connection con;

      private
Statement st;

      private
ResultSet rs;

     

      public
UserDao(){

          
sql=null;

          
con=null;

          
st=null;

          
rs=null;

          
}

     

      public
void insert(){

          

          
sql=”insert into yuchen_user (id,name) values(“;

          
sql+=”4,’zhouwu’)”;

          
System.out.println(sql);

          

          
try{

                

          
con=JdbcUtil.getConnection();

          
st=con.createStatement();

          
st.executeUpdate(sql);

          

          
}catch(Exception e){

                

                
e.printStackTrace();

                

          
}finally{

                

                
JdbcUtil.close(con,st);

                

                 }

          

          
}

          

          

      public
void delete(){

          

          
sql=”delete from yuchen_user where id=2″;

          
System.out.println(sql);

          

          
try{

                

                
con=JdbcUtil.getConnection();

          
 st=con.createStatement();

          
 st.executeUpdate(sql);

                

          
}catch(Exception e){

                

                
e.printStackTrace();

                

          
}finally{

                

                
JdbcUtil.close(con,st);

                

                 }

          
}

          

          

      public
void update(){

          

          
sql=”update yuchen_user set name=’liumang’ where
id=1″;

          
System.out.println(sql);

          

          
try{

                

                
con=JdbcUtil.getConnection();

          
 st=con.createStatement();

          
 st.executeUpdate(sql);

                

          
}catch(Exception e){

                

                
e.printStackTrace();

                

          
}finally{

                

                
JdbcUtil.close(con,st);

                

                 }

          
}

          

          

      public
void select(){

          

          
sql=”select * from yuchen_user”;

          
System.out.println(sql);

          

          
try{

                

                
con=JdbcUtil.getConnection();

          
 st=con.createStatement();

           
 rs=st.executeQuery(sql);

          
 

          
 while(rs.next()){

          
   

          
    System.out.println(rs.getInt(1));

          
    System.out.println(rs.getString(2));

          
   

          
    }

                

          
}catch(Exception e){

                

                
e.printStackTrace();

                

          
}finally{

                

                
JdbcUtil.close(con,st,rs);

                

                 }

          

          
}

          

          

      public
static void main(String[] args){

          

          
UserDao ud=new UserDao();

          
ud.select();

          
ud.insert();

          
ud.select();

          
ud.update();

          
ud.select();

          
ud.delete();

          
ud.select();

          
}

     
}

 

局部常用的方式:

/**

*知识点:

*execute方法,getResultSet(),getUpdateCount()

*次第目标:

*JdbcUtil.java:工具类,连接数据库,关闭资源

*sqlExecutor.java:命令执行参数输入sql语句,并执行该语句

*/

package
moudule1.fangfa;

 

import java.sql.*;

import
moudule1.com.*;

 

public class
sqlExecutor{

     

      public static void main(String[]
args){

          

           Connection
con=null;

           Statement
st=null;

          

           try{

                

                
con=JdbcUtil.getConnection();

                
st=con.createStatement();

                 boolean
str=st.execute(args[0]);

                

                
if(str){

 

                      ResultSet
rs=st.getResultSet();

                     

                     
while(rs.next()){

                           
System.out.println(rs.getInt(“id”)+”:”+rs.getString(“name”));

                           
}

                           

                           
rs.close();

                     

                
}else{

                      int
row=st.getUpdateCount();

                     
System.out.println(row);

                     
}

                

           }catch(Exception
e){

                

                
e.printStackTrace();

                

           }finally{

                

                
JdbcUtil.close(con,st);

                

                 }

           }

      }

2. 补充   JDBC连接MySQL

加载与注册JDBC驱动程序

Class.forName(“com.mysql.jdbc.Driver”);

Class.forName(“com.mysql.jdbc.Driver”).newInstance();

JDBC URL 定义驱动程序与数据源之间的连续

标准语法:

<protocol(主要通讯协议)>:<subprotocol(次要通讯协议,即驱动程序名称)>:<data source
identifier(数据源)>

MySQL的JDBC URL格式:

jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&param2=value2]….

 

示例:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

 

常见参数:

user                       用户名

password                  密码

autoReconnect                  联机失败,是否再次联合(true/false)

maxReconnect              尝试还联合次数

initialTimeout               尝试再度联合间隔

maxRows                   传回最大行数

useUnicode                 是否采取Unicode字体编码(true/false)

characterEncoding          何种编码(GB2312/UTF-8/…)

relaxAutocommit            是否自动提交(true/false)

capitalizeTypeNames        数据定义的称呼为大写表示

树连接对象

String
url=”jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password”;

Connection con = DriverManager.getConnection(url);

建立SQL陈述式对象(Statement Object)

Statement stmt =
con.createStatement();

执行SQL语句

executeQuery()

String
query = “select * from test”;

ResultSet rs=stmt.executeQuery(query);

结果集ResultSet

while(rs.next())

{rs.getString(1);rs.getInt(2);}

executeUpdate()

String upd=”insert into test (id,name) values(1001,xuzhaori)”;

int con=stmt.executeUpdate(upd);

execute()

示例:

try{
}

catch(SQLException sqle)

{

}

finally

{

}

 

Java类型和SQL类型 技术手册P421

PreparedStatement(预编语句)

PreparedStatement stmt = conn.prepareStatement(“insert into
test(id,name)values(?,?)”);

stmt.setInt(1,id);

stmt.setString(2,name);

横流:一旦设定语句的参数值后,就足以频繁执反语句子,直到调用clearParameters()方法以他剪除了

CallableStatement(预储程序)技术手册P430

JDBC2.0使用

ResultSet对象中的光标上下自由移动

Statement stmt = con.createStatement
(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);

ResultSet rs=stmt.executeQuery(“select * from test”);

 

public Statement createStatement(int resultSetType,int
resultSetConcuttency) throws SQLException

 

resultSetType

TYPE_FORWARD_ONLY            只能采用next()方法。

TYPE_SCROLL_SENSITIVE        可以上下移动,可以赢得转后底价。

TYPE_SCROLL_INSENSITIVE      可以上下移动。

resultSetConcuttency

CONCUR_READ_ONLY        只读

CONCUR_UPDATABLE        ResultSet对象可以履数据库的骤增、修改、和移除

 

一直动用ResultSet对象实行更新数据

新增多少

Statement
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);

ResultSet
uprs=stmt.executeQuery(“select * from test”);

uprs.moveToInsertRow();

uprs.updateInt(1,1001);

uprs.updateString(2,”许召日”);

uprs.insertRow;

创新数据

Statement
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);

ResultSet
uprs=stmt.executeQuery(“select * from test”);

uprs.last();

uprs.updateString(“name”,”xuzhaori”);

uprs.updateRow;

抹数据

Statement
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);

ResultSet
uprs=stmt.executeQuery(“select * from test”);

uprs.absolute(4);

uprs.deleteRow();

 

批处理

con.setAutoCommit(false);  关闭自动确认模式

Statement stmt=con.createStatement();

int[] rows;

stmt.addBatch(“insert into test values(1001,xuzhaori)”);

stmt.addBatch(“insert into test values(1002,xuyalin)”);

rows=stmt.executeBatch();

con.commit();  没有外错误,执行批处理stmt.executeBatch();

 

JNDI-数据源(Data Source)与连接池(Connection Pool)

Tomcat的JDBC数据源设置  技术手册P439

连接池工具-Proxool Var 0.8.3
技术手册P446

设置web.xml

<?xml version=”1.0″ encoding=”ISO-8859-1″?>

<!–<?xml version=”1.0″ encoding=”GB2312″?>–>

 

<web-app xmlns=”http://java.sun.com/xml/ns/j2ee”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee/web-app\_2\_4.xsd”

version=”2.4″>

….

<servlet>

<servlet-name>ServletConfigurator</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>

 

<init-param>

<param-name>propertyFile</param-name>

<param-value>WEB-INF/classes/Proxool.properties</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

后端统计端口添加下列

<servlet>

<servlet-name>Admin</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>

</servlet>

 

<servlet-mapping>

<servlet-name>Admin</servlet-name>

<url-pattern>/Admin</url-pattern>

</servlet-mapping>

 

….

 

</web-app>

 

配置Proxool.properties

jdbc-0.proxool.alias=JSPBook

jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver

jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/sample_db?user=root&password=browser&useUnicode=true&characterEncoding=UTF-8

jdbc-0.proxool.maximum-connection-count=10

jdbc-0.proxool.prototype-count=4

jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE

jdbc-0.proxool.verbose=true

jdbc-0.proxool.statistics=10s,1m,1d    后端平统计接口添加此行

jdbc-0.proxool.statistics-log-level=DEBUG

使用Proxool连接池

Connection con =
DriverManager.getConnection(“proxool.JSPBook”);

Statement stmt =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);

String query = “SELECT * FROM employee”;

ResultSet rs =
stmt.executeQuery(query);

相关文章