编程步骤:
1. 加载驱动:
三种方法:
1)Class.forName(driverName);//常用
2)先创建一个Driver对象,在到DriverManager中去进行注册;
3)利用JAVA虚拟机加载驱动,java –Djdbc.drivers=driverName;;
2. 建立连接
两种方法:
1) DriverManager.getConnection(url,user,password); ;//常用
2) DriverManager.getConnection(url,properties);
3. 获得Statement(PreparedStatement,CallabelStatement);
4. 操作DB;
5. 处理ResultSet;
6. 关闭连接。
注意:建立一个连接数据库的工具类JdbcUtil帮我们加载驱动、建立连接、关闭连接、处理结果集等
PreparedStatement与Statement相比的优点:
1)效率高,因为PreparedStatement中的SQL语句是预编译的;
2)类型清晰,如:使用方法setInt(1,x)时,会检查x的数据类型与int是否兼容,保持了JAVA是静态语言的特征;
SQL的两种类型:
1)同构:只有参数不同,使用PreparedStatement,利用它的预编译特点和类型清晰特点
2)异构:SQL的结构不同,使用PreparedStatement,利用它的类型清晰特点
结果集元数据(ResultSetMetaData):
由ResultSet.getMetaData获得,可用于获取关于 ResultSet
对象中列的类型和属性信息的对象,注意方法getColumnType(i)(获取jdbc中用于表示i列的据类型的整数,具体表示查看Type类)和getColumnTypeName(i)(获取i列在数据库中的类型名)的区别
元数据:
DatebaseMetaData:数据库元数据,由Connection类型中的getMetaData()方法获得,调用方法getTables(4个参数)获得所需要的表、视图等;
ResultSetMetaData:结果集元数据
ParameterMetaData :PreparedStatement参数元数据
事务:
注意以下方法的作用:1)con.setAutoCommit(boolean)//将事务的提交方式设置为显示提交;2)con.commit()//提交事务;3)con.rollback();回滚事务;
结果集增强(滚动和更新):
滚动:在创建Statement时,设置属性TYPE_SCROLL_SENSITIVE或TYPE_SCROLL_INSENSITIVE (即使做了更新等操作,但不改变结果集)
双向滚动,绝对定位absolute(int row)函数,返回值类型为boolean,相对定位relative(int i)i为相对移动的位置数,可为负数
其它函数:移动游标的函数:afterLast()、beforeFirst()、first()、last()、next()、previous()、判断位置的函数:isAfterLast()、isBeforeFirst()、isFrist()、isLast()
更新:(有较多的限制容易出现异常,最好不要用。限制:获得rs时只能涉及到一个表,选出来的字段要包含主键,当要进行插入操作时要把表中所有非空和没有默认值的字段全选出来,还要看驱动是否支持更新操作等)在创建Statement时,设置属性CONCUR_READ_ONLY、CONCUR_UPDATABLE(可通过结果集更新数据库,对更新:1.移动游标到指定位置rs.absolute(i);2.rs.updateInt(column,value)或.rs.updateString(columnName, value);3.rs.updateRow().对删除:1.移动游标到指定位置rs.absolute(i);2.rs.deleteRow()。对插入:1.rs.moveToInsertRow();2.rs.updateInt(column,value)/
rs.updateString()3.rs.insertRow(columnName,value);4.rs.moveToCurrentRow())
Statement = con.getConnection(scrolltype,updatetype);
批处理:
使用PreparedStatement(ps):1.获得ps;2.设置数据;3.调用addBatch()方法;4.使用executeBatch进行传输数据,int[]counts=ps.excuteBatch()。注意:只能处理同构的SQL或是只有一个SQL,不可处理异构的SQL;
使用Statement:1。获得statm;2,多次调用stm.addBatch(sql);3.int[] results=stem.executeBatch();可处理异构的SQL
增删改查案例:
加载驱动极其释放资源
package cn.csdn.web.jsp.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class DbManager {
private static String url;
private static String user;
private static String password;
static{
try {
InputStream in=DbManager.class.getClassLoader().getResourceAsStream("db.properties");
Properties p=new Properties();
p.load(in);
url=p.getProperty("url");
user=p.getProperty("user");
password=p.getProperty("password");
} catch (IOException e1) {
e1.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn=null;
//String url="jdbc:mysql://localhost:3306/db14?user=root&password&useUnicode=true&characterEncoding=UTF8";
try {
conn=DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void release(Connection conn, Statement stat,ResultSet rt){
if(rt!=null){
try {
rt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rt=null;
}
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stat=null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn=null;
}
}
}
数据库的定义,用户名的声明
db.properties
url=jdbc:mysql://localhost:3306/db14
user=root
password
增删改查案例的实现
package cn.csdn.web.jsp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import cn.csdn.web.jsp.util.DbManager;
public class Demo1 {
@SuppressWarnings("null")
public static void main(String[] args) {
Connection conn=null;
Statement stat=null;
ResultSet rt=null;
//String url="jdbc:mysql://localhost:3306/db14?user=root&password&useUnicode=true&characterEncoding=UTF8";
// String url="jdbc:mysql://localhost:3306/db14";
// String username="root";
// String password="";
try {
conn=DbManager.getConnection();
stat=conn.createStatement();
// String sql="insert into user values(null,'qw',1,23)";//增
// String sql="update user set name='papa' where id=4";//改
String sql="delete from user where id=4 ";//删
stat.executeUpdate(sql);
sql="select * from user";//查
rt=stat.executeQuery(sql);
// while(rt.next()){
// System.out.println(rt.getInt("id"));
// System.out.println(rt.getString("name"));
// System.out.println(rt.getInt("age"));
// System.out.println(rt.getString("sex"));
// }
ResultSetMetaData rsm=rt.getMetaData();
int ol=rsm.getColumnCount();
while(rt.next()){
for (int i = 1; i < ol; i++) {
String urr=rsm.getCatalogName(1);
System.out.println(urr+":"+rt.getObject(i));
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DbManager.release(conn, stat, rt);
}
}
}