完全卸载mysql数据库图文教程
MySQl:123456
JDBC概述
JDBC是用于执行SQL语句的API类包,由一组Java语言编写的类和接口组成。Jdbc提供了一组标准的应用程序设计接口,通过他可以访问各类数据库。
JDBC技术
jdbc全称为Java database connectivity。Jdbc API中定义了一些Java接口和类,分别用来实现与数据库的连接、发送SQL语句(SQL statements)、获取结果界(result sets)以及其他的数据库对象,使得Java程序能够方便的与数据库交互并处理结果。JDBC的API在java.sql.javax.sql等包中。
JDBC驱动程序
jdbc驱动程序用于解决应用程序与数据库的通信问题,它可以分为JDBC-ODBC Bridge、JDBC-Native API Bridge、JDBC-middleware和Pure JDBCdriver.
JDBC-ODBC Bridge:桥接器的驱动程序,这类驱动程序的特色是必须在使用者端的计算机上事先安装好ODBC驱动程序,然后通过JDBC-ODBC调用方法,进而通过ODBC类存取数据。
JDBC-Native APIBridge:也是桥接器型驱动程序之一,这类型的驱动程序也必须阿紫使用者的计算机上安装好特定的驱动程序如ODBC。然后通过JDBC-Native API调用转换成特定驱动程序的调用方法,进而存取数据库。
JDBC-middleware:省去了在使用者计算机上安装任何驱动的麻烦。只需在服务器端安装好middleware,而middleware会负责所有存取数据库的所有必要转换。
Pure JDBCdriver.:最成熟的JDBC驱动程序,不但无需在使用者计算机上安装任何驱动,也不需要在服务器端安装任何中介程序(middleware),所有的存取数据库都直接有驱动来完成
JDBC中常用的接口
驱动程序接口Driver
Driver接口在java.sql包中定义,每种数据库的驱动程序都提供一个实现该接口的类,简称Driver类,应用程序必须先加载它。加载的目的是创建自己的实例并向Java.sql.DriverManager类注册该实例,以便驱动程序管理类对对数据库程序进行管理。
通常情况下通过java.lang.Class类的静态方法forName(String className)加载欲链接的数据库程序类,该方法的入口参数为预加载的数据库的完整类名。对于每种数据库的完整类名的定义也不一样。
使用第一种类型的驱动程序
Class.forName( “sun.jdbc.odbc.jdbcOdbcDriver”)
使用第四种类型的驱动程序(SQL Server 2005)
Class.forName(“com.microsoft.aqlserver.jdbc.jdbc.SQLServerDriver”)
Try{
Class.forName( drivername)//加载jdbc驱动器
}catch(ClassNotFoundException e){
e.printStackTrace();
}
注意:加载数据库驱动程序属于单例模式,整个数据库应用中只需加载一次就可以了。
驱动程序管理器DriverManager类。
数据库驱动程序加载成功之后,接下来就由DriverManager类来处理,该类是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在驱动器和可用的数据库之间建立连接。另外DriverManager类也处理诸如驱动程序登录时间、登录管理和消息跟踪等。
DriverManager类的主要作用是管理用户程序与特定的数据库的连接。一般情况下,DriverManager类可以管理多个数据库驱动程序,当然对于中小规模的应用程序可能只用到一种数据库,JDBC允许用户通过调用DriverManager类的getDriver、getDrivers和registerDriver等方法,实现对驱动程序的管理,进一步通过这些方法实现对数据库连接的管理。但是大多数情况下让DriverManager类自动管理。
DriverManager类是用静态方法getConnection来获得用户与特定数据库的连接。在建立连接过程中,DriverManager类将检查注册表中的每个驱动程序,查看他是否可以建立连接,使用到多种驱动程序是,加载驱动程序的顺序至关重要,DriverManager类将使用它找到的第一个可以成功连接到给定数据库的驱动程序进行连接。
DriverManager建立连接的方法有以下几种方法
(1)sttic Connection getConnection(String url)
url标识给定的数据库(驱动程序),它由三部分组成用冒号分隔,jdbc:子协议名:子名称。其中jdbc是唯一的,jdbc只要有这种协议;子协议名主要用于识别数据库驱动的,如SQL server2005为sqlserver,子名称属于专门的驱动程序的
(2)Static Connection getConnection(String url,String userName,String password)
数据库连接接口Connection
Connection代表数据库的连接,只有建立了连接,用户程序才能操作数据库。该接口是时间jdbc最重要也是使用频率较高的。连接就像一个会话,由用户程序独占,且需要消耗内存的,因此每个数据库最大连接数是受限的,用户使用完数据库要及时关闭连接,以方便其他用户使用。该接口的主要功能是获得各种SQL语句的运载类。该接口的主要方法如下
(1)close():关闭数据库的连接,在使用完之后必须关闭,否则会保持一段较长的时间,直到超时。
(2)Commit():提交对数据库的更改,使得更改生效。这个方法只有调用了setAutoCommit(False)之后才有效。否则对数据库的更改会自动提交到数据库。
(3)createStatement():创建一个Statement,Statement用于执行SQL语句
(4)createStatement(int resultSet,int resultConcurrency)创建一个Statement,并且产生指定类型的结果集。
(5)getAutoCommit():为这个连接对象获取当前的auto-commit模式。
(6)getMetaData()方法:获得一个DatabaseMetaData对象,其中包含了关于数据库的元数据。
(7)IsClosed():判断连接是否关闭。
(8)prepareStatement( String sql):使用指定的SQL语句创建一个预处理程序,SQL参数往往包含多个?占位符。
(9)Rollback()方法:回滚当前执行操作,只有调用了setAutoCommit(False)才可以使用。
(10)setAutoCommit(boolean autoCommit)方法:设置是否自动提交到数据库默认是true。
执行SQL语句的Statement
Statement、preparedStatement、CallableStatement这三个接口都是用来执行静态SQL语句。Statement用来执行静态的SQL语句并返回它的结果集对象;preparedStatement表示带IN和不带IN的预编译SQL语句对象,SQL语句被预编译并被存储在preparedStatement对象中;CallableStatement用于执行SQL存储过程的接口。
Statement stastement=connection.createStation();
- executeQuery方法,用于执行单个结果集的SQL语句如select语句返回的是一个ResultSet对象。ResultSet executeQuery(String sql)throw SQLException
- executeUpdate方法,执行insert、update、delete语句,或者不返回任何内容的SQL语句。int executeUpdate(String sql) throws Exception对于数据操作语言返回行计数,对于什么都不返回的SQL语句返回正数0.
- Execute方法执行给定的SQL语句该语句可能返回多个结果。一般情况下执行SQL语句并返回第一个结果。然后用户通过getResultSet和getUpdateCount来获取结果,使用getMoreResults来移动后续的结果。Boolean execute(String sql)throws Exception
- executeBatch方法。将一批命令交给数据库来执行,如果全部命令执行成功,则返回一个和添加命令时顺序一样的整形数组,数组元素的排序对应批中的命令。(1)大于或等于0的数,指示成功的执行了命令,其中值为影响了数据库行数的更新计数(2)SUCCESS_NO_INFO,指示成功执行了命令,但是受影响的行数是未知的。如果批量中有命令无法执行会抛出BatchUpdteException,并且jdbc驱动处理器可能继续处理批处理中的剩余命令,也可能不执行。无论如何驱动程序的行为不需与DBMS一致要么始终继续执行要么永远不继续执行。(3)EXECUTE_FAILED,指示未能够成功执行命令,仅当命令处理失败后,驱动程序继续处理命令时出现 int[] executeBatch()throws SQLException
执行动态SQL语句接口的PreParedStatement
PreParedStatement是Statement的子接口,PreParedStatement的实例已经包含了编译的SQL语句,所以他的执行速度要快于Statement。Connection connection=DBConnection.getCon();
String sql=”delete from person where name=?”
PreParedStatement ptsm=connection.prepareStatement(sql);
执行存储过程接口CallableStatement
CallableStatement是PreParedStatement的子接口,用于执行SQL存储过程的接口返回一个或多个ResultSet对象。
访问结果集接口resultset
Statement stmt=connection.createStatement();
ResultSet rs=stmt.executeQuery(sql);
PreParedStatement pstmt=connection.prepareStatement(sql);
ResultSet rs=pstmt.executeQuery(sql);
CallableStatement cstmt=connection.prepareCall(sql);
ResultSet rs=cstmt.executeQuery(sql);
ResultSet的方法(1)boolean next()移向下一行,没有下一行返回false(2)getXxx(int columIndex)列操作方法,取得所在行指定列的值,Xxx与列的类型有关若列为String,则为getString;(3)getXxx(String columName)列操作方法,获取所在行指定列名的值。
可滚动、可修改的ResultSet对象
createStatement( int resultSetType,int resultSetConcurrency)
prepareStatement( String sql,int resultSetType,int resultSetConcurrency)
prepareCall(String sql ,int resultSetType,int resultSetConcurrency)
resultSetType用于指定的滚动的类型
TYPE_FORWARD_ONLY:指示光标只能向前移动的ResultSet对象
TYPE_SCROLL_INSENTIVE:可以滚动但是不受ResultSet对象所连接数据更改影响的ResultSet对象类型。
TYPE_SCROLL_SENTIVE:可以滚动但是受ResultSet对象所连接数据更改影响的ResultSet对象类型。
resultSetConcurrency用于是否可以修改结果集
CONCUR_READ_ONLY:该敞亮表示不可以更新resultSet对象的并发模式
CONCUR_UPDATABLE该敞亮表示可以更新resultSet对象的并发模式 C常用方法如下
Boolean absolute(int low);移动至给定的编号
Void afterLast();移动至结尾,最后一行之后
Void beforeFirst();移动到开头,第一行之前
Boolean first();移动到第一行
Boolean isAfterLast();是否在第一行之后
Boolean isBeforeFirst();是否在第一行之前
Boolean isFirst();是否位于第一行
Boolean isLast();是否位于最后一行
Boolean Last();将光标移动到最后一行
Boolean previous();将光标移动到ResultSet对象的上一行
Bolean realtive();按相对行数移动光标
Void UpdateXxx(int columnIndex,Xxx x);按列号修改当前行的指定值,为Java数据类型
Void UpdateXxx(int columnName,Xxx x);按列名修改当前行的指定值
Void updateRow();ResultSet对象的当前行的内容更新到数据苦中
Void insertRow();将插入行的内容插入到ResultSet对象和数据库中
Void deleteRow();从ResultSet对象和数据库中删除当前行。
Void cancelRowUpdates();取消对ResultSet对象中的当前行所做的更新
Void mooveToCurrentRow();将光标移动到记住光标的位置,通常为当前行
Void moveToInsertRow();将光标移动到插入行
连接数据库
步骤1:加载jdbc驱动程序
try{
Class.forName(“com.mysql.jdbc.Driver”)
}catch(ClassNotFoundException e){
System.out.println(“找不到驱动程序类,加载驱动失败”);
e.printStackTrace();
}
加载成功之后会将driver的实例注册到DriverManager类中。
步骤2:创建数据库连接
MySQL的连接URL如下
Jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=gbk
要连接数据库需要向java.sql.DriverManager请求获得Connection对象。该对象代表一个数据库的连接
String url=”jdbc:mysql://localhost:3306/mydb”;
String username=”root”
String password=”123456”
try {
Connection con=DriverManager.getConnection(url,username,password)
}catch(SQLException se){
System.out.println(“数据库连接失败!”);
se.printStackTrace();
}
步骤3:创建一个Statement
要执行SQL语句必须获得java.sql.Statement实例。
(1)执行静态的SQL语句Statement
(2)执行动态的SQL语句PreparedStatement
(3)执行数据库存储过程CallableStatement
Statement stmt=con.createStatement();
PreparedStatement pstmt=con.prepareStatement();
CallableStatement cstmt=con.PrepareCall();
步骤4:执行SQL语句
Statement接口提供了三种执行SQL语句的方法
(1)ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句返回一个结果集对象。
(2)Int executeUpdate(String SQLString):用于执行insert、update或者delete语句以及DDL语句。
(3)Execute(sqlString):返回多个结果集、多个更新技术或两者结合的语句。
ResultSet rs=stmt.executeQuery(“select*from...”);
Int rows=stmt.executeUpdate(“insert into ...”);
Boolean falg=stmt.execute(String sql);
步骤5:获得查询结果
查询结果分为两种情况
(1)执行更新返回的是本次操做影响的记录数
(2)执行查询结果的是一个ResultSet对象。
While(rs.next()){
String name=rs.getString(“name”);
String pass=rs.getString(1);
}
步骤6:关闭JDBC对象
操作完成后要把所有的JDBC对象全部关闭,以释放jdbc资源,关闭顺序和申明的顺序相反。
(1)关闭记录的结果集
(2)关闭声明
(3)关闭连接对象
If(rs!=null){
try{
rs.close();
rs=null;
}catch(SQLException se){
se.printStackTrace();
}
}
If(stmt!=null){
try{
Stmt.close();
Stmt=null;
}catch(SQLException se){
se.printStackTrace();
}
}
If(con!=null){
try{
Con.close();
Con=null;
}catch(SQLException se){
se.printStackTrace();
}
}
<body>
<%
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123456");
stmt=con.createStatement();
rs=stmt.executeQuery("select*from student");
while(rs.next()){
out.println("<table>");
out.println("<tr>");
out.println("<td>"+rs.getString("sid")+"</td>");
out.println("<td>"+rs.getString("spassword")+"</td>");
out.println("<td>"+rs.getInt("sage")+"</td>");
out.println("</tr>");
out.println("<table>");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}
catch(SQLException se){
se.printStackTrace();
}
finally{
try{
if(rs!=null){
rs.close();
rs=null;
}
if(stmt!=null){
stmt.close();
stmt=null;
}
if(con!=null){
con.close();
con=null;
}
}catch(SQLException se){
se.printStackTrace();}
}
%>
</body>