一、JDBC
JDBC通俗的说就是java数据库连接,它是java访问数据库的标准API。它主要做三件事情:(1)与数据库建立连接;(2)发送SQL语句;(3)处理SQL语句执行的结果。(SQL是结构化查询语言)
- JDBC的类型
(1) JDBC-ODBC桥加ODBC驱动程序
调用过程相对复杂,执行效率低。应用时还需预装对应的ODBC程序。
(2) 本地API部分用Java编写的驱动程序
同样需要调用本地驱动程序的代码,所以执行效率也比较低。
(3) JDBC网络协议纯Java驱动程序
可以与服务端完全分离,具有相当大的灵活性。并且由于不调用任何本地代码,所以执行效率和可升级性方面不错。
(4) 本地协议纯Java驱动程序
速度快,只需在用的时候下载相应的驱动。由于是纯Java所以,平台独立性很好。
二、使用JDBC开发数据库应用程序
JDBC中主要的接口和类
JDBC访问数据库的基本步骤:加载驱动程序–》建立与数据库的连接–》创建执行方式语句–》执行SQL语句–》返回处理结果和关闭创建的各种对象。1.加载驱动程序
1 | //使用Class.forName()方法显示加载 |
- 2.创建数据库链接
1 | //要想JDBC驱动程序连接数据库,需要使用DriverManager类中的静态方法来创建连接 |
- Connection接口的常用方法
3.创建执行方式语句
创建完连接后,在所建立的数据库连接上,必须创建一个Statement接口对象,该对象将各种SQL语句发送到所连接的数据库执行。1
2//创建Statement对象
Statement st=conn.creatStatement();4.执行SQL语句
Statement接口常用方法1
2
3
4
5String sql="SELECT * from student";
ResultSet rs=st.executeQuery(sql1);//查询
String sql1="INSERT INTO Student(Name,Age,Sex) VALUES('zx','20','M')";
st.executeUpdate(sql1);//执行更新5.返回处理结果
ResultSet接口的常用方法
SQL数据类型与Java数据类型之间的关系(用于rs返回数据时)1
2
3
4while(rs.next()){
String name=rs.getString("Name");//从获得rs集合中取name
String age=rs.getInt("Age");
}6.关闭创建的各种对象
当对数据库的操作执行完毕或退出应用程序前,需将数据库访问过程中建立的各个对象按顺序关闭,防止系统资源浪费。
关闭的次序是:首先关闭集对象,其次关闭Statement对象,最后,关闭连接对象。1
2
3
4
5
6if(rs!=null)
rs.close();
if(st!=null)
st.close();
if(conn!=null)
conn.close();
三、数据库的进一步操作
JDBC中执行SQL对表的查询有三种方式:不含参数的静态查询(静态SQL语句)、含有参数的动态查询(动态SQL语句)和储存过程。分别对应三个接口,Statement、PreparedStatement、CallableStatement。
- 1.Statement
执行静态SQL语句,语句里面不含参数。 - 2.PreparedStatement
PreparedStatement是处理预编译语句的一个接口,可以用来执行动态SQL语句(即带参数的语句)。
解释一下预编译:内部先通过预编译,形成带参数的内部指令,并保存在PreparedStatement对象中。这样在以后执行同样的语句时,只需修改参数值,然后直接修改内部指令进行执行,不用再编译了,故而提高执行效率。
注意:由于PreparedStatement的对象是预编译的,所以执行效率要比Statenent对象的效率高。并且在常设置参数的语句中,必须用PreparedStatement。
PreparedStatement接口的常用方法。1
2
3正如conn接口有createStatement()方法对应Statement一样,PreparedStatement也有
prepareStatement();来创建对象。
PreparedStatement ps=conn.prepareStatement(sql);
注意:执行带参数的SQL语句前必须对“?”占位符进行赋值,比如插入时的VALUES(?,?,?,?)还有WHERE no=?等等,其中的?可以用ps.setXXX(1,””)来进行设置。次序是往后推的。
- 3.CallableStatement
四、获取元数据
所谓元数据,就是有关数据库和表的结构信息。
JDBC用DatabaseMetaData接口来获取数据库范围的信息,ResultSetMetaData接口用来获取特定结果集ResultSet的信息,如字段名和字段个数等。 - 1.DatabaseMetaData
1
2DatabaseMetaData dmd=conn.getMetaData();
dmd.getURL();//等等
DatabaseMetaData接口常用方法
- 2.ResultSetMetaData接口
1
2ResultSetMetaData rsd=rs.getMetaData();
rs.getColumnCount();//获取列
ResultSetMetaData接口常用方法
五、事物操作
事物是保证数据库中数据完整性与一致性的重要机制。事物由一组SQL语句组成,这组语句要么都执行,要么都不执行。因此事物具有原子性。
JDBC实现事务操作,关键是Connection接口中的三个方法。
- 1.setAutoCommit()
用来设置事务是否自动提交,由于SQL语句一个句子就是一个事务,而且是自动提交的,所以可以用它来改变这种状态。 - 2.commit()
提交事务,当程序不自动提交事务时,可以显示调用该方法进行提交。 - 3.rollback()
在数据处理发生异常时,必须回滚,来保证数据的一致性。恢复事务执行前的状态。
六、补充
1.Statement1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30int no;
int age;
String name;
String UserName="root";
String Password="123456";
String url="jdbc:mysql://localhost:3306/dbname";
String Driver="com.mysql.jdbc.Driver";
Connection conn=null; //声明连接
ResultSet rs=null; //声明结果集
Class.forName(Driver);//加载驱动
conn=DriverManager.getConnection(url,UserName,Password);//创建数据库连接
Statement st=conn.createStatement();//创建Statement执行语句
String show="SELECT * from student";
rs=st.executeQuery(show);//执行查询表
While(rs.next()){
no=rs.getInt("no");
name=rs.getString("name");
age=rs.getInt("age");
System.out.println("No :"+no+"name :"+name+"Age :"+age);
}
String insert="INSERT INTO student(no,name,age) VALUES(1,"zx",20)";
st.executeUpdata(insert);//更新表
2.PreparedStatement1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34int no;
int age;
String name;
String UserName="root";
String Password="123456";
String url="jdbc:mysql://localhost:3306/dbname";
String Driver="com.mysql.jdbc.Driver";
Connection conn=null; //声明连接
ResultSet rs=null; //声明结果集
String show="SELECT * from student";
Class.forName(Driver);//加载驱动
conn=DriverManager.getConnection(url,UserName,Password);//创建数据库连接
PreparedStatement ps=conn.prepareStatement(show);
rs=ps.executeQuery();//执行查询表
While(rs.next()){
no=rs.getInt("no");
name=rs.getString("name");
age=rs.getInt("age");
System.out.println("No :"+no+"name :"+name+"Age :"+age);
}
String insert="INSERT INTO student(no,name,age) VALUES(?,?,?)";
PreparedStatement ps1=conn.prepareStatement(insert);
ps1.setInt(1,1);
ps1.setString(2,"zx");
ps1.setInt(3,20);
ps1.executeUpdata();//更新表