一、JDBC:解决java与数据库的连接。JDBC框架:
二、JDBC驱动程序类型:
1、JDBC-ODBC桥驱动程序:将JDBC方法调用转换为开放数据库连接(ODBC)函数调用。使Java应用程序能够使用支持ODBC驱动程序的任何数据库,通常使用独立应用程序(本地使用)。
其中,开放数据库连接(ODBC)由微软发起的,很多其他数据库厂商认同的连接方式
2、本机API驱动程序:将JDBC调用映射到本机方法调用,它们传递到本地的本机调用级接口(CLI)。本机API驱动程序没有ODBC中间层。
性能优于JDBC-ODBC桥驱动程序,通常用于基于网络的应用程序。
3、网络协议驱动程序:由客户机(包含纯Java函数)和服务器( 包含Java和本机方法)组成。
Java应用程序将JDBC调用发送到网络协议驱动程序客户机部分,后者将JDBC调用转换为数据库调用。数据库调用被发送到网络协议驱动程序服务器部分,这部分将请求转发给数据库。使用网络协议驱动程序时,在服务器上加载CLI本机库。
4、本机协议驱动程序:使用供应商(各种数据库)特定网络协议直接与数据库交互的Java驱动程序,使用时无需安装任何供应商特定的库。
每个数据库都有特定的本机协议驱动程序。
三、使用JDBC API
1、JDBC API包:java.sql 或者javax.sql
2、借助JDBC API和驱动程序建立java与数据库的连接(数据库ip地址,数据库名称,用户名,密码)
3、JDBC API中常用的类和接口:
1)DriverManager类:载入数据库的驱动程序;
2)Driver接口:表示数据库驱动程序,所有JDBC驱动程序必须实现Driver接口。
3)Connection接口:支持建立java应用程序和数据库之间的连接。建立连接后如果不关闭,则一直在内存中,所有在程序后面,使用close()方法关闭。
4)Statement接口:支持执行SQL语句。
5)ResultSet接口:表示从数据库检索到的信息,所有查询到的数据。
6)SQLException类:提供与数据库交互时发生的异常的相关信息。
4、写JDBC代码的步骤:
1)在项目中添加驱动程序:(操作:右键项目,点击my--->build Path--->add external Archiver...选择jdbc驱动,点击确定。)
其中,.jar里面都是编译完成的java应用程序。都是class文件,是java的可执行程序
2)加载驱动程序(不同的数据库,需要不同的驱动):
try{
Class.forName("com.mysql.jdbc.Driver");//按照驱动程序的名字加载驱动,参数表示驱动的名字
}catch (ClassNotFoundException e) {
<pre name="code" class="java"> e.printStackTrace();
}
驱动程序名称的来源:
3)建立连接,有以下2种方式:
DriverManager.getConnection("jdbc:mysql://数据库IP地址:端口号/数据库名称?用户名&密码");
DriverManager.getConnection("jdbc:mysql://localhost:3306/sh?user=shde&password=123456");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sh","shde","123456");
其中:localhost是本机IP地址的替换写法,?代表传一个参数。
4)操作数据库:
Statement stmt=conn.createStatement();
stmt.executeQuery("");//执行查询select语句 返回ResultSet
stmt.executeUpdate("");//执行更新,包括update/insert/delete语句 返回受影响的行数
stmt.execute("");//执行任何的SQL语句 包括create table/alter table 返回boolean类型
5)保存结果集
ResultSet rs=stmt.executeQuery("select * from employee");
6)使用结果集
//rs.next();//向前滑动游标,判断结果集里面是否有下一条数据,如果存在数据,则取出
while(rs.next()){
//游标返回的是一行数据,需要一列,一列的取出来
System.out.print(rs.getInt(1)+" ");//把第一列的数据取出,转换为整型
System.out.println(rs.getObject(1));
System.out.print(rs.getString(2)+" ");
System.out.print(rs.getInt(3)+" ");
}
如查询数据库的代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) {
final String driver="com.mysql.jdbc.Driver";
try {
Class.forName(driver);
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sh","sh","123456");
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from employee");
while(rs.next()){
System.out.print(rs.getInt(1)+" ");//把第一列的数据取出,转换为整型
//System.out.println(rs.getObject(1));
System.out.print(rs.getString(2)+" ");
System.out.print(rs.getInt(3)+" ");
}
stmt.close();//关闭连接,清除内存中的连接
conn.close();//关闭连接,清除内存中的连接
} catch (ClassNotFoundException e) {
//当驱动程序不存在或错误时报该异常
e.printStackTrace();
} catch (SQLException e) {
//建立连接失败
e.printStackTrace();
}
}
}
5、使用JDBC添加、修改、删除数据到数据库:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertDemo {
public static void main(String[] args) {
final String driver="com.mysql.jdbc.Driver";
try {
Class.forName(driver);
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sh","sh","123456");
Statement stmt=conn.createStatement();
//executeUpdate方法返回0则处理失败,大于0返回受影响的行数
int count2=stmt.executeUpdate("delete from employee where id=110");
int count=stmt.executeUpdate("insert into employee values(110,'李',27,15000,'欧洲',101)");
int count1=stmt.executeUpdate("update employee set name='恁',age=29 where id=109");
if(count==0){
System.out.println("数据添加失败");
}else{
System.out.println("成功添加数据:"+count+"条");
}
if(count1==0){
System.out.println("数据更新失败");
}else{
System.out.println("成功更新数据:"+count+"条");
}
if(count2==0){
System.out.println("数据删除失败");
}else{
System.out.println("成功删除数据:"+count+"条");
}
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
//当驱动程序不存在或错误时报该异常
e.printStackTrace();
} catch (SQLException e) {
//建立连接失败
e.printStackTrace();
}
}
}
6、JDBC代码常见的异常:
1)ClassNotFoundException:检查驱动的名称,是否为“com.mysql.jdbc.Driver”;检查是否添加了Jar包。
2)java.sql.SQLException:No suitable driver found:驱动jar包的版本不正确;或者协议错误(正确协议:jdbc:mysql://)。
3)java.sql.SQLException: Access denied for user 'sh'@'localhost' (using password: YES):用户sh的密码不正确。
4)com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax;:sql语句有误。
5)当更新的中文数据在数据库显示乱码:
a)检查数据库、表的字符集是否为UTF8;
b)检查java代码所属项目的字符类型是否为GBK;
c)在java代码的数据库连接中添加字符集参数(characterEncoding=utf-8),如下:
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sh?characterEncoding=utf-8&user=sh&password=123456");
6)更新数据中,界面上接受的数据都是字符串类型,注意转型。
a)如插入数据是int类型,获取界面上的id值,则转换如下:
int id=Integer.parseInt(id.getText())
b)如插入数据是String类型,获取界面上的name值,则转换如下:
String name=name.getText();