這是連接池的:
鶴山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class BaseDao {
protected Connection conn=null;
protected PreparedStatement ps=null;
protected ResultSet rs=null;
//獲取連接
protected void openConnection(){
try{
//初始化連接池
Context ctx=new InitialContext();
//數(shù)據(jù)源
DataSource ds=(DataSource) ctx.lookup("java:comp/env/jdbc/news");
//獲取連接
conn=ds.getConnection();
}catch(NamingException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
}
//關(guān)閉連接
protected void closeResource(){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
其他類需要使用數(shù)據(jù)庫操作,繼承這個(gè)類就就行了,這是最基礎(chǔ)的。
用這個(gè)類吧.好的話,給我加加分.
import java.sql.*;
/**
* @功能: 一個(gè)JDBC的本地化API連接類,封裝了數(shù)據(jù)操作方法,只用傳一個(gè)SQL語句即可
* @作者: 李開歡
* @日期: 2007/
*/
public class ConnectionDemo {
/*
* 這里可以將常量全部放入另一個(gè)類中,以方便修改
*/
private static Connection conn;
private static Statement ps;
private static ResultSet rs;
private static final String DRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
private static final String URL = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
private static final String USER ="sa";
private static final String PASS = "sa";
public ConnectionDemo() {
// TODO Auto-generated constructor stub
ConnectionDemo.getConnection();
}
public static Connection getConnection(){
System.out.println("連接中...");
try {
Class.forName(ConnectionDemo.DRIVER);
conn = DriverManager.getConnection(ConnectionDemo.URL, ConnectionDemo.USER, ConnectionDemo.PASS);
System.out.println("成功連接");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static Statement getStatement(String sql){
System.out.println("執(zhí)行SQL語句中...");
try {
ps = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
if(sql.substring(0, 6).equals("select")){
rs = ps.executeQuery(sql);
System.out.println("執(zhí)行完查詢操作,結(jié)果已返回ResultSet集合");
}else if(sql.substring(0, 6).equals("delete")){
ps.executeUpdate(sql);
System.out.println("已執(zhí)行完畢刪除操作");
}else if(sql.substring(0, 6).equals("insert")){
ps.executeUpdate(sql);
System.out.println("已執(zhí)行完畢增加操作");
}else{
ps.executeUpdate(sql);
System.out.println("已執(zhí)行完畢更新操作");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ps;
}
public static ResultSet getResultSet(){
System.out.println("查詢結(jié)果為:");
return rs;
}
public static void closeConnection(){
System.out.println("關(guān)閉連接中...");
try {
if (rs != null) {
rs.close();
System.out.println("已關(guān)閉ResultSet");
}
if (ps != null) {
ps.close();
System.out.println("已關(guān)閉Statement");
}
if (conn != null) {
conn.close();
System.out.println("已關(guān)閉Connection");
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ConnectionDemo.getConnection();
String sql = "delete from type where id = 1";
ConnectionDemo.getStatement(sql);
String sql2 = "insert into type values(1,'教學(xué)設(shè)備')";
ConnectionDemo.getStatement(sql2);
String sql1 = "select * from type";
ConnectionDemo.getStatement(sql1);
ResultSet rs = ConnectionDemo.getResultSet();
System.out.println("編號(hào) "+"類 型");
try {
while(rs.next()){
System.out.print(" "+rs.getInt(1)+" ");
System.out.println(rs.getString(2));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ConnectionDemo.closeConnection();
}
}
Java可以使用JDBC對(duì)數(shù)據(jù)庫進(jìn)行讀寫。JDBC訪問一般分為如下流程:
1、加載JDBC驅(qū)動(dòng)程序:
在連接數(shù)據(jù)庫之前,首先要加載想要連接的數(shù)據(jù)庫的驅(qū)動(dòng)到JVM(Java虛擬機(jī)),
這通過java.lang.Class類的靜態(tài)方法forName(String className)實(shí)現(xiàn)。
例如:
try{
//加載MySql的驅(qū)動(dòng)類
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驅(qū)動(dòng)程序類 ,加載驅(qū)動(dòng)失??!");
e.printStackTrace() ;
}
成功加載后,會(huì)將Driver類的實(shí)例注冊(cè)到DriverManager類中。
2、提供JDBC連接的URL
?連接URL定義了連接數(shù)據(jù)庫時(shí)的協(xié)議、子協(xié)議、數(shù)據(jù)源標(biāo)識(shí)。
?書寫形式:協(xié)議:子協(xié)議:數(shù)據(jù)源標(biāo)識(shí)
協(xié)議:在JDBC中總是以jdbc開始
子協(xié)議:是橋連接的驅(qū)動(dòng)程序或是數(shù)據(jù)庫管理系統(tǒng)名稱。
數(shù)據(jù)源標(biāo)識(shí):標(biāo)記找到數(shù)據(jù)庫來源的地址與連接端口。
例如:(MySql的連接URL)
jdbc:mysql://localhost:3306/test?useUnicode=truecharacterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding設(shè)置為
gb2312或GBK,本參數(shù)必須設(shè)置為true 。characterEncoding=gbk:字符編碼方式。
3、創(chuàng)建數(shù)據(jù)庫的連接
?要連接數(shù)據(jù)庫,需要向java.sql.DriverManager請(qǐng)求并獲得Connection對(duì)象,該對(duì)象就代表一個(gè)數(shù)據(jù)庫的連接。
?使用DriverManager的getConnectin(String url,String username,String password )方法傳入指定的欲連接的數(shù)據(jù)庫的路徑、數(shù)據(jù)庫的用戶名和密碼來獲得。
例如:
//連接MySql數(shù)據(jù)庫,用戶名和密碼都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("數(shù)據(jù)庫連接失敗!");
se.printStackTrace() ;
}
4、創(chuàng)建一個(gè)Statement
?要執(zhí)行SQL語句,必須獲得java.sql.Statement實(shí)例,Statement實(shí)例分為以下3種類型:
1、執(zhí)行靜態(tài)SQL語句。通常通過Statement實(shí)例實(shí)現(xiàn)。
2、執(zhí)行動(dòng)態(tài)SQL語句。通常通過PreparedStatement實(shí)例實(shí)現(xiàn)。
3、執(zhí)行數(shù)據(jù)庫存儲(chǔ)過程。通常通過CallableStatement實(shí)例實(shí)現(xiàn)。
具體的實(shí)現(xiàn)方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
5、執(zhí)行SQL語句
Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery 、executeUpdate和execute
1、ResultSet executeQuery(String sqlString):執(zhí)行查詢數(shù)據(jù)庫的SQL語句,返回一個(gè)結(jié)果集(ResultSet)對(duì)象。
2、int executeUpdate(String sqlString):用于執(zhí)行INSERT、UPDATE或DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語句。
具體實(shí)現(xiàn)的代碼:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
6、處理結(jié)果
兩種情況:
1、執(zhí)行更新返回的是本次操作影響到的記錄數(shù)。
2、執(zhí)行查詢返回的結(jié)果是一個(gè)ResultSet對(duì)象。
ResultSet包含符合SQL語句中條件的所有行,并且它通過一套get方法提供了對(duì)這些行中數(shù)據(jù)的訪問。
使用結(jié)果集(ResultSet)對(duì)象的訪問方法獲取數(shù)據(jù):
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1); // 此方法比較高效(列是從左到右編號(hào)的,并且從列1開始)
}
7、關(guān)閉JDBC對(duì)象
操作完成以后要把所有使用的JDBC對(duì)象全都關(guān)閉,以釋放JDBC資源,關(guān)閉順序和聲明順序相反:
1、關(guān)閉記錄集
2、關(guān)閉聲明
3、關(guān)閉連接對(duì)象
if(rs != null){ // 關(guān)閉記錄集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 關(guān)閉聲明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 關(guān)閉連接對(duì)象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
Java程序向數(shù)據(jù)庫中插入數(shù)據(jù),代碼如下:
//首先創(chuàng)建數(shù)據(jù)庫,(access,oracle,mysql,sqlsever)其中之一,其中access,sqlsever需要配置數(shù)據(jù)源(odbc);//然后再eclipse中創(chuàng)建類(ConnDb,Test,TestBean)ConnDb功能為連接數(shù)據(jù)庫,查詢,插入,刪除,修改數(shù)據(jù)的類,Test為含有main方法的測(cè)試類,TestBean為數(shù)據(jù)表中的字段屬性及set,get方法//以下是ConnDb代碼:package db;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;public class ConnDb {public Connection startConn(Connection conn){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection("jdbc:odbc:數(shù)據(jù)庫","用戶名", "密碼"); } catch (Exception e) { System.out.println("連接數(shù)據(jù)庫時(shí)出現(xiàn)錯(cuò)誤"); } return conn; } public ArrayList executeQuery(String sql){ Connection conn = null; Statement stmt = null; ResultSet rs = null; ArrayList list = new ArrayList(); try { conn = startConn(conn); stmt = conn.createStatement(); rs = stmt.executeQuery(sql);//sql為sql語句例如"select * from 表名",從main方法中傳進(jìn)來,這里用的是ArrayList 類將查詢結(jié)果存儲(chǔ)起來 while(rs.next()){ TestBean tb = new TestBean(); tb.setTid(rs.getString("tid")); tb.setTname(rs.getString("tname")); tb.setTinfo(rs.getString("tinfo")); list.add(tb); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ closeConn(rs,stmt,conn); } return list; } public void executeUpdate(String sql){ Connection conn = null; Statement stmt = null; try { conn = startConn(conn); stmt = conn.createStatement(); stmt.executeUpdate(sql); } catch (SQLException e) { System.out.println("修改,插入或者刪除數(shù)據(jù)庫數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤!"); }finally{ closeConn(stmt,conn); } } public void closeConn(ResultSet rs,Statement stmt,Connection conn){ try { if(rs != null){ rs.close(); } if(stmt != null){ stmt.close(); } if(conn != null){ conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("關(guān)閉數(shù)據(jù)庫的時(shí)候發(fā)生錯(cuò)誤!"); } } public void closeConn(Statement stmt,Connection conn){ try { if(stmt != null){ stmt.close(); } if(conn != null){ conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("關(guān)閉數(shù)據(jù)庫的時(shí)候發(fā)生錯(cuò)誤!"); } }}
import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class inensshow extends JFrame {
private Connection connection;
private Statement statement;
private ResultSet resultSet;
private ResultSetMetaData rsMetaData;
//GUI變量定義
private JTable table;
private JTextArea inputQuery;
private JButton submitQuery;
public inensshow()
{
//Form的標(biāo)題
super( "輸入SQL語句,按查詢按鈕查看結(jié)果。" );
String url = "jdbc:mysql://localhost:3306/web";
String username = "inens";
String password = "inens";
//加載驅(qū)動(dòng)程序以連接數(shù)據(jù)庫
try {
Class.forName( "org.gjt.mm.mysql.Driver" );
connection = DriverManager.getConnection(
url, username, password );
}
//捕獲加載驅(qū)動(dòng)程序異常
catch ( ClassNotFoundException cnfex ) {
System.err.println(
"裝載 JDBC/ODBC 驅(qū)動(dòng)程序失敗。" );
cnfex.printStackTrace();
System.exit( 1 ); // terminate program
}
//捕獲連接數(shù)據(jù)庫異常
catch ( SQLException sqlex ) {
System.err.println( "無法連接數(shù)據(jù)庫" );
sqlex.printStackTrace();
System.exit( 1 ); // terminate program
}
//如果數(shù)據(jù)庫連接成功,則建立GUI
//SQL語句
String test="SELECT * FROM data";
inputQuery = new JTextArea( test, 4, 30 );
submitQuery = new JButton( "查詢" );
//Button事件
submitQuery.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
getTable();
}
}
);
JPanel topPanel = new JPanel();
topPanel.setLayout( new BorderLayout() );
//將"輸入查詢"編輯框布置到 "CENTER"
topPanel.add( new JScrollPane( inputQuery), BorderLayout.CENTER );
//將"提交查詢"按鈕布置到 "SOUTH"
topPanel.add( submitQuery, BorderLayout.SOUTH );
table = new JTable();
Container c = getContentPane();
c.setLayout( new BorderLayout() );
//將"topPanel"編輯框布置到 "NORTH"
c.add( topPanel, BorderLayout.NORTH );
//將"table"編輯框布置到 "CENTER"
c.add( table, BorderLayout.CENTER );
getTable();
setSize( 500, 300 );
//顯示Form
show();
}
private void getTable()
{
try {
//執(zhí)行SQL語句
String query = inputQuery.getText();
statement = connection.createStatement();
resultSet = statement.executeQuery( query );
//在表格中顯示查詢結(jié)果
displayResultSet( resultSet );
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
}
}
private void displayResultSet( ResultSet rs )
throws SQLException
{
//定位到達(dá)第一條記錄
boolean moreRecords = rs.next();
//如果沒有記錄,則提示一條消息
if ( ! moreRecords ) {
JOptionPane.showMessageDialog( this,
"結(jié)果集中無記錄" );
setTitle( "無記錄顯示" );
return;
}
Vector columnHeads = new Vector();
Vector rows = new Vector();
try {
//獲取字段的名稱
ResultSetMetaData rsmd = rs.getMetaData();
for ( int i = 1; i = rsmd.getColumnCount(); ++i )
columnHeads.addElement( rsmd.getColumnName( i ) );
//獲取記錄集
do {
rows.addElement( getNextRow( rs, rsmd ) );
} while ( rs.next() );
//在表格中顯示查詢結(jié)果
table = new JTable( rows, columnHeads );
JScrollPane scroller = new JScrollPane( table );
Container c = getContentPane();
c.remove(1);
c.add( scroller, BorderLayout.CENTER );
//刷新Table
c.validate();
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
}
}
private Vector getNextRow( ResultSet rs,
ResultSetMetaData rsmd )
throws SQLException
{
Vector currentRow = new Vector();
for ( int i = 1; i = rsmd.getColumnCount(); ++i )
currentRow.addElement( rs.getString( i ) );
//返回一條記錄
return currentRow;
}
public void shutDown()
{
try {
//斷開數(shù)據(jù)庫連接
connection.close();
}
catch ( SQLException sqlex ) {
System.err.println( "Unable to disconnect" );
sqlex.printStackTrace();
}
}
public static void main( String args[] )
{
final inensshow app =
new inensshow();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
app.shutDown();
System.exit( 0 );
}
}
);
}
}
------------------------------------------------------------
這次在WIN98中就不好使了。因?yàn)镸ysql的驅(qū)動(dòng)程序沒有也沒能加入到CLASSPATH 當(dāng)中,但是JSP卻可以使用(JSP的98驅(qū)動(dòng)加載詳見Jsp與Mysql連接查錯(cuò)文章),所以這次我是在XPServer中測(cè)試的。