java學(xué)習(xí)筆記——使用JDBC,對數(shù)據(jù)庫進(jìn)行增刪改查(方案二)
工具類BaseDao.java
package?com.accp.jdbc;
import?java.sql.Connection;
import?java.sql.DriverManager;
import?java.sql.PreparedStatement;
import?java.sql.ResultSet;
import?java.sql.ResultSetMetaData;
import?java.sql.SQLException;
import?java.util.ArrayList;
import?java.util.HashMap;
import?java.util.List;
import?java.util.Map;
import?org.apache.log4j.Logger;
public?class?BaseDao?{
//?使用log4j記錄日志
private?static?Logger?logger?=?Logger.getLogger(BaseDao.class);
//?連接驅(qū)動
private?static?final?String?DRIVER?=?"com.microsoft.sqlserver.jdbc.SQLServerDriver";
//?連接路徑
private?static?final?String?URL?=?"jdbc:sqlserver://localhost:1433;databaseName=test";
//?用戶名
private?static?final?String?USERNAME?=?"sa";
//?密碼
private?static?final?String?PASSWORD?=?"sa";
//靜態(tài)代碼塊
static?{
try?{
//?加載驅(qū)動
Class.forName(DRIVER);
}?catch?(ClassNotFoundException?e)?{
e.printStackTrace();
logger.error("加載驅(qū)動失敗",?e);
}
}
/*
?*?獲取數(shù)據(jù)庫連接
?*/
public?Connection?getConnection()?{
Connection?conn?=?null;
logger.debug("開始連接數(shù)據(jù)庫");
try{
//與數(shù)據(jù)庫建立連接
conn=DriverManager.getConnection(URL,?USERNAME,?PASSWORD);
}catch(SQLException?e){
e.printStackTrace();
logger.error("數(shù)據(jù)庫連接失??!",e);
}
logger.debug("數(shù)據(jù)庫連接成功");
return?conn;
}
/*
?*?關(guān)閉數(shù)據(jù)庫連接,注意關(guān)閉的順序
?*/
public?void?close(ResultSet?rs,?PreparedStatement?ps,?Connection?conn)?{
//注意:最后打開的最先關(guān)閉
if(rs!=null){
try{
rs.close();
rs=null;
}catch(SQLException?e){
e.printStackTrace();
logger.error("關(guān)閉ResultSet失敗",e);
}
}
if(ps!=null){
try{
ps.close();
ps=null;
}catch(SQLException?e){
e.printStackTrace();
logger.error("關(guān)閉PreparedStatement失敗",e);
}
}
if(conn!=null){
try{
conn.close();
conn=null;
}catch(SQLException?e){
e.printStackTrace();
logger.error("關(guān)閉Connection失敗",e);
}
}
}
/*
?*?查詢多個對象的方法
?*?
?*?sql:?要執(zhí)行的sql語句
?*?obj:可變參數(shù)列表
?*/
public?List<Map>?queryList(String?sql,Object...?obj){
List<Map>?data=new?ArrayList<Map>();
Connection?conn=getConnection();?//獲得連接
PreparedStatement?ps=null;
ResultSet?rs=null;
try{
//創(chuàng)建PreparedStatement對象
ps=conn.prepareStatement(sql);
//為查詢語句設(shè)置參數(shù)
setParameter(ps,?obj);
//獲得ResultSet結(jié)果集
rs=ps.executeQuery();
//獲得結(jié)果集信息
ResultSetMetaData?rsmd=rs.getMetaData();
//?獲得列的總數(shù)
int?columnCount=rsmd.getColumnCount();
Maprow=null;
//?遍歷結(jié)果集,根據(jù)信息封裝成Map
while(rs.next()){
row=new?HashMap();
for(int?i=0;i<columnCount;i++){
String?columnLabel=rsmd.getColumnLabel(i+1);
row.put(columnLabel,?rs.getObject(columnLabel));
}
data.add(row);
}
}catch(SQLException?e){
e.printStackTrace();
logger.error("數(shù)據(jù)庫操作異常",e);
}finally{
//關(guān)閉連接
close(rs,ps,conn);
logger.debug("釋放資源成功");
}
return?data;
}
/*
?*?查詢一個對象的方法
?*?
?*?sql:?要執(zhí)行的sql語句
?*?obj:可變參數(shù)列表
?*/
public?Mapquery(String?sql,Object...?obj){
Mapdata=null;
Connection?conn=getConnection();?//獲得連接
PreparedStatement?ps=null;
ResultSet?rs=null;
try{
//創(chuàng)建PreparedStatement對象
ps=conn.prepareStatement(sql);
//為查詢語句設(shè)置參數(shù)
setParameter(ps,?obj);
//獲得ResultSet結(jié)果集
rs=ps.executeQuery();
//獲得結(jié)果集信息
ResultSetMetaData?rsmd=rs.getMetaData();
//?獲得列的總數(shù)
int?columnCount=rsmd.getColumnCount();
//?遍歷結(jié)果集,根據(jù)信息封裝成Map
while(rs.next()){
data=new?HashMap();
for(int?i=0;i0){
//循環(huán)設(shè)置參數(shù)
for?(int?i?=?0;?i?<?obj.length;?i++)?{
ps.setObject(i+1,?obj[i]);
}
}
}
}
操作類,進(jìn)行增刪改查 UserDao.java
package?com.accp.jdbc;
import?java.sql.Connection;
import?java.sql.PreparedStatement;
import?java.sql.ResultSet;
import?java.sql.ResultSetMetaData;
import?java.sql.SQLException;
import?java.sql.Statement;
import?java.util.List;
import?java.util.Map;
import?com.accp.entity.User;
public?class?UserDao?extends?BaseDao?{
public?static?void?main(String[]?args)?{
UserDao?user=new?UserDao();
/*??????//查詢id<20的數(shù)據(jù)
user.queryUser();
//查詢單條數(shù)據(jù)
user.queryUserById(10);
//更新數(shù)據(jù)
User?u=new?User();
u.setId(2);
u.setName("張龍");
u.setAge(22);
System.out.println("更新"+user.updateUser(u)+"條數(shù)據(jù)");
//刪除數(shù)據(jù)
System.out.println("刪除"+user.deleteUser(15)+"條數(shù)據(jù)");
//插入數(shù)據(jù)
User?u1=new?User();
u1.setName("張三");
u1.setAge(18);
user.insertUser(u1);??*/
}
//查詢多條信息
public?void?queryUser(){
List<Map>?dataUser=queryList("select?*?from?users?where?id<20");
//遍歷結(jié)果集
for(Mapu:dataUser){
System.out.println(u);
}
}
//查詢單條數(shù)據(jù)
public?void?queryUserById(int?id){
System.out.println(query("select?*?from?users?where?id=?",id));
}
//更新數(shù)據(jù)
public?int?updateUser(User?user){
String?sql="update?users?set?name=?,age=??where?id=?";
return?update(sql,?user.getName(),user.getAge(),user.getId());
}
//刪除數(shù)據(jù)
public?int?deleteUser(int?id){
String?sql="delete?from?users?where?id=?";
return?update(sql,id);
}
//插入數(shù)據(jù),并返回自動增長的的主鍵值
public?void?insertUser(User?user){
Connection?conn=getConnection();?//獲得連接
PreparedStatement?ps=null;
ResultSet?rs=null;
String?sql="insert?into?users?values(?,?)";
try{
//?創(chuàng)建能返回自動生成的主鍵的值的預(yù)編譯對象
ps=conn.prepareStatement(sql,?Statement.RETURN_GENERATED_KEYS);
ps.setString(1,user.getName());
ps.setInt(2,?user.getAge());
int?rows=ps.executeUpdate();
//?獲得自動增長的的主鍵值
rs=ps.getGeneratedKeys();
rs.next();
//獲得id
int?id=rs.getInt(1);
System.out.println("成功添加:"+rows+"條數(shù)據(jù),id是:"+id);
}catch(SQLException?e){
e.printStackTrace();
}finally{
close(rs,ps,conn);
}
}
}
插入測試數(shù)據(jù) InsertTest.java
package?com.accp.jdbc;
import?java.sql.Connection;
import?java.sql.PreparedStatement;
import?java.sql.SQLException;
public?class?InsertTest?extends?BaseDao??{
public?static?void?main(String[]?args)?{
InsertTest?user=new?InsertTest();
user.insertUser();
}
public?void?insertUser()?{
String?sql?=?"insert?into?users?values(?,?)";
Connection?conn?=?getConnection();
PreparedStatement?ps?=?null;
try?{
//?禁止自動提交事務(wù)
conn.setAutoCommit(false);
//?創(chuàng)建能返回自動生成的主鍵的值的預(yù)編譯對象
ps?=?conn.prepareStatement(sql);
//開始時間的毫秒數(shù)
Long?start=System.currentTimeMillis();
for?(int?i?=?0;?i?<?10000;?i++)?{
ps.setString(1,?i+"");
ps.setInt(2,?22);
ps.addBatch();//?添加到批處理命令中
}
ps.executeBatch();//?執(zhí)行批處理
conn.commit();//?提交事務(wù)
//結(jié)束時間的毫秒數(shù)
Long?stop=System.currentTimeMillis();
//得到總耗時
Long?ms=stop-start;?
System.out.println("插入一萬記錄耗時:"+ms+"毫秒");
}?catch?(SQLException?e)?{
e.printStackTrace();
//取消事務(wù)
try{
conn.rollback();
}catch(SQLException?ee){
ee.printStackTrace();
}
}?finally?{
//打開自動提交事務(wù)
try?{
conn.setAutoCommit(true);
}?catch?(SQLException?e)?{
e.printStackTrace();
}
close(null,?ps,?conn);
}
}
}




