数据库连接的方式,在之前的博客有记载,就不多说了,主要说说怎么在连接数据库之后,对数据库中的数据进行操作(包括最常见的增删查改)。
JDBC 主要做这样的事,
java程序通过它与数据库连接
将开发者的想要使用的sql语句发送到已连接的数据库
处理sql语句返回的结果
连接数据库,采用驱动连接(以对mysql的操作为例)
Connection ct;
PreparedStatement pstmt;
public Connect(){
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//?useUnicode=true&characterEncoding=UTF-8
//设置数据库编码格式
//与数据库连接,empsys数据库名称 ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/empsys?useUnicode=true&characterEncoding=UTF-8","root","666666yuan");
System.out.println("success");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
如果能输出success,则说明连接正确。否则请检查有没有加驱动包,路径有没有问题,等等(别人教你的只有方法,自己的bug还得自己来debug)
注意,这些类和接口都在java.sql包中,其中只有DriverManager是类,Connection是接口,如果想要具体了解,可以自己查看api手册
既然连接上数据库了,我们总得做些什么东西吧
通过执行sql语句来操纵数据库
这里有个点要区别一下,执行sql语句,sql语句分为两种1.静态sql语句2.动态sql语句。
不同的语句执行时采用不同的接口。
执行静态sql语句
主要是通过Statement接口
String sql="delete from cjb where grade<60";
//connection接口有很多常用的方法
//创建并返回一个statement接口
Statement stm=ct.createStatement();
//statement接口执行静态的sql语句
//数据库执行数据更新语句,update,delete,insert语句都是这个方法
stm.executeUpdate(sql);
//立即释放Statement实例占用的数据库和JDBC资源
stm.close();
//关闭数据库连接
ct.close();
静态查询语句使用
Statement stmt=ct.createStatement();
String sql="select * from cjb";
//executeQuery执行查询语句
ResultSet rs=stmt.executeQuery(sql);
System.out.println("snumber cnumber grade");
while(rs.next()){
String snumber=rs.getString(1);
String cnumber=rs.getString(2);
int grade=rs.getInt(3);
System.out.println(snumber+" "+cnumber+" "+grade);
}
PrepareStatement接口动态执行sql语句
//通过PreparedStatement接口执行动态Insert语句批量记录
String [][] records={ {"081107","101","83"},{"081108","208","86"}};
String sql="insert into CJB(snumber,cnumber,grade) values(?,?,?)";
PreparedStatement prs=conn.prepareStatement(sql);
prs.clearBatch();//清空Batch
for(int i=0;i<records.length;i++){
prs.setString(1, records[i][0]);
prs.setString(2, records[i][1]);
prs.setInt(3, Integer.valueOf(records[i][2]));
prs.addBatch();//将insert语句添加到Batch中
}
prs.executeBatch();//批量执行Batch中的Insert语句
prs.close();
conn.close();
//通过PrepareStatement实例执行动态SELECT语句查询记录,并输出列名
String sql="select * from CJB where snumber=?";
PreparedStatement prs=conn.prepareStatement(sql);
prs.setString(1, "081101");
ResultSet rs=prs.executeQuery();
//获得ResultSetMetaData类的实例,然后通过列索引获得指定列的名称并输出
ResultSetMetaData medata=rs.getMetaData();
System.out.print(medata.getColumnName(1)+" ");
System.out.print(medata.getColumnName(2)+" ");
System.out.println(medata.getColumnName(3));
while(rs.next()){//遍历结果集,next()方法可以判断是否存在符合条件的记录
String snumber=rs.getString(1);//通过列索引来获得指定列的值
String cnumber=rs.getString(2);
int grade=rs.getInt(3);
System.out.println(snumber+" "+cnumber+" "+grade);
}
rs.close();
prs.close();
conn.close();
还有一种就是通过存储过程实现增删查改
String [][] records={{"081107","102","80"},{"081108","206","89"}};
//调用存储过程
CallableStatement cablStmt=conn.prepareCall("{call pro_insert1(?,?,?)}");
cablStmt.clearBatch();
for(int i=0;i<records.length;i++){
cablStmt.setString(1, records[i][0]);
cablStmt.setString(2, records[i][1]);
cablStmt.setInt(3, Integer.valueOf(records[i][2]));
cablStmt.addBatch();//将insert语句添加到Batch中
}
cablStmt.executeBatch();//批量执行Batch中的Insert语句
cablStmt.close();
conn.close();