JAVA jdbc(數據庫鏈接池)學習筆記(一)

學習內容:java

1.JDBC的含義...mysql

JDBC想必學過JAVA的就不會陌生,JDBC究竟是什麼呢?其實就是由JAVA的一些類和接口構成的API,保存在java.sql和javax.sql..包中的一些API...程序員

2.使用JDBC的緣由...sql

  那麼爲何要使用,這個想必你們也是更爲了解了,一個應用程序若是不和數據庫進行鏈接,那這根本就不算是個應用程序,那麼應用程序是不能直接對數據庫進行操做的,那麼就須要一個輔助工具去鏈接數據庫,從而操做數據庫...那這個輔助的工具就是JDBC了,這個僅限於JAVA應用程序...其實整體的規模就是這樣:應用程序——>JDBC——>(mysql driver——>mysql)數據庫

                       JDBC——>(oracle driver——>oracle)oracle

                       JDBC——>(DB2 driver——>db2)就是這麼簡單的事...多餘的就不羅嗦了...dom

3.如何使用JDBC...eclipse

如何使用JDBC,纔是真正的重點...使用JDBC分爲幾個步驟...ide

我這裏只對連接mysql進行講解...函數

i.首先註冊驅動

Class.forName("com.mysql.Driver");//這種方式是最好的,不會對具體驅動產生依賴...
DriverManager.registerDriver(com.mysql.jdbc.Driver);//會產生兩個相同的驅動,並會對具體驅動產生依賴...
System.setProperty("jdbc.drivers","driver1:driver2");//基本不經常使用,因此能夠不用記,通常就使用第一種就好了...

ii.創建鏈接

Connection conn = DriverManager.getConnection(url, user, password);  

iii.建立執行SQL語句...

Statement st = conn.createStatement();  
st.executeQuery(sql);  
PreparedStatement  
String sql = "select * from table_name where col_name=?";  
PreparedStatement ps = conn.preparedStatement(sql);  
ps.setString(1, "col_value");  
ps.executeQuery();  

iv.處理執行結果...

    ResultSet rs = statement.executeQuery(sql);  
    While(rs.next()){  
    rs.getString(「col_name」);  
    rs.getInt(「col_name」);  
    }  

v.釋放資源...

釋放資源這是必須的,使用close()進行關閉...因爲數據庫的資源是很是珍貴的,所以只要咱們不去使用資源的時候,必定要記得釋放...

先來個例子:仍是例子更加的好理解...

import java.sql.*;//1.引包是必須的...

public class JDBC_1_1 {
    static final String JDBC_DRIVER="com.mysql.jdbc.Driver";
    static final String DB_URL ="jdbc:mysql://localhost:3306/emp";//這個連接是我本機的數據庫emp...emp裏有個表格叫employees....
    /*表格的信息
     *create table employees
     *(
     *    id int not null,
     *    first varchar(255) not null,
     *    last varchar(255) not null,
     *    age int not null
     *);
     */
    static final String USER="root";//登錄數據庫時的用戶名...
    static final String PAS="49681888";登錄時的密碼...
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Connection conn=null;
        Statement stmt=null;//
        try {
            //2.註冊JDBC驅動程序...
            Class.forName("com.mysql.jdbc.Driver");
            //3.打開一個連接...
            System.out.println("Connection database....");
            conn=DriverManager.getConnection(DB_URL,USER,PAS);

            //4.執行一個操做...
            System.out.println("Creating statement");
            stmt=conn.createStatement();
//          String sql;
//          sql="select id,first,last,age from employees"; 這個是查詢操做...
//          ResultSet rs=stmt.executeQuery(sql);
            String sql_1="insert into employees " + "values (7, 'z', 'yh', 20)";//插入操做...
            stmt.executeUpdate(sql_1); 
            
            
            5.提取數據...
//          while(rs.next()){  //rs用來保存sql執行後的結果...
//              int id=rs.getInt("id");
//              int age=rs.getInt("age");
//              String first=rs.getString("first");
//              String last=rs.getString("last");   
//              System.out.println(id+" "+age+" "+first+" "+last);
//          }
            6.清理環境
//          rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("no class");
        }finally{
            if(stmt!=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        System.out.println("Goodbye");
    }

}

其餘操做,好比說刪除啊,更改啊,這個模式基本都差很少...就不進行解釋了...

  注意:若是咱們使用JDBC的時候,必定要檢查檢查本身的的jdk的lib文件夾下有沒有mysql-connector-java-5.1.18-bin.jar這個壓縮文件..若是沒有,那麼程序運行時會出現錯誤...解決方法就是咱們下一個mysql-connector-java-5.1.18-bin.jar這個文件,幾k而已,下載完畢以後直接拷貝到jdk的lib文件夾下便可..

  若是使用的是eclipse,咱們還要導入這個文件...右擊咱們創建的項目文件,而後點擊build path——>configure build path,彈出對話框之後,點擊Libraries——>Add External JARs...找到這個mysql-connector-java-5.1.18-bin.jar文件導入,而後就能夠了...

4.使用JDBC實現CURD操做...什麼是CURD操做呢?其實就是對數據進行更新,刪除等操做...

這裏咱們採用分層操做...這個代碼很長...

首先是User實體...

package JDBC_3;
import java.util.Date;
class User{            //user類..
    private int id;
    private String name;
    private Date birthday;
    private float money;
    public User(){
    }
    public User(int id,String name,Date birthday,float money){
        this.id=id;
        this.name=name;
        this.birthday=birthday;
        this.money=money;
    }
    public int getid(){
        return id;
    }
     public void setId(int id) {  
            this.id = id;  
        }  
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
        public Date getBirthday() {  
            return birthday;  
        }  
        public void setBirthday(Date birthday) {  
            this.birthday = birthday;  
        }  
        public float getMoney() {  
            return money;  
        }  
        public void setMoney(float money) {  
            this.money = money;  
        }  
      
        @Override  
        public String toString(){  
            return "[id="+id+",name="+name+",birthday="+birthday+",money="+money+"]";  
        }  
}

接着是咱們的Dao層,就是接口...

package JDBC_3;

interface UserDao{
    public abstract void addUser(User user);
    public abstract User getUserById(int userid);
    public abstract int update(User user);
    public abstract int delete(User user);
}

而後是實現接口的類...

package JDBC_3;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.ResultSet;
/*
 * JDBC實現crud操做
 * crud操做就是對數據進行增刪改查...
 * */
public class JDBC_3_1_server implements UserDao{
    static final String DB_URL="jdbc:mysql://localhost:3306/emp";
    static final String user_1="root";
    static final String pas="49681888";
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void addUser(User user){
        Connection cn=null;
        PreparedStatement ps=null;
        try {
            cn=DriverManager.getConnection(DB_URL,user_1,pas);
            String sql="insert into userr values(2,'clearlove','1995-01-26',200)";
            //String sql="insert into userr values(?,?,?,?)";這句話是傳參數是未知的,須要咱們進行獲取...
            ps=cn.prepareStatement(sql);
            //這四個函數就是爲了獲取咱們插入的信息...上面採用了直接在sql裏寫入咱們要插入的數據,其實咱們也能夠在主函數裏進行傳參...見下面主函數...
//            ps.setInt(1,user.getid());
//            ps.setString(2,user.getName());
//            ps.setDate(3, new Date(user.getBirthday().getTime()));
//            ps.setFloat(4, 20);
            int count=ps.executeUpdate();
            System.out.println("添加的記錄數"+count);
            ps.close();
            cn.close();
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            
        }finally{
            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally{
                    if(cn!=null){
                        try {
                            cn.close();
                        } catch (SQLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        
    }
    public User getUserById(int userid){
        Connection cn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            cn=DriverManager.getConnection(DB_URL,user_1,pas);
            String sql="select * from userr where id=1";
            //導入sql語句...
            ps=cn.prepareStatement(sql);
            //保存執行sql語句後的結果對象...
            rs=ps.executeQuery();
            ps.close();
            cn.close();
            rs.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(cn!=null){
                try {
                    cn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
    public int update(User user){
        Connection cn=null;
        PreparedStatement ps=null;
        try {
            cn=DriverManager.getConnection(DB_URL,user_1,pas);
            String sql="update userr set name='clearlove',birthday='1994-12-19',money=60 where id=1";
            ps=cn.prepareStatement(sql);
            int count=ps.executeUpdate();
            return count;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                cn.close();
                ps.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return 0;
    }
    public int delete(User user){
        Connection cn=null;
        PreparedStatement ps=null;
        try {
            cn=DriverManager.getConnection(DB_URL,user_1,pas);
            String sql="delete from userr where id=1";
            ps=cn.prepareStatement(sql);
            int count=-1;
            count=ps.executeUpdate();
            return count;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                cn.close();
                ps.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
        }
        return 0;
    }
}

接着是服務層...

package JDBC_3;
class userserves {
    
    private UserDao userDao;
    public userserves(){
        userDao =DaoFactory.getInstance().createUserDao();//經過工廠實例化一個例子。。
        System.out.println("userDao "+userDao);
    }
    
    public void regist(User user){
        if(user==null){
            System.out.println("註冊表信息無效...");
        }else{
            userDao.addUser(user);
        }
    }
    
    public User query(int userId){  
        User user = userDao.getUserById(userId);  
        if(user == null){  
            System.out.println("查詢結果爲空!!");  
        }else{  
            System.out.println(user.getid()+"\t"+user.getName()+"\t"+user.getBirthday()+"\t"+user.getMoney());  
        }  
        return userDao.getUserById(userId);  
    }  
    
    public void update(User user){
        if(user.getid()<0){
            System.out.println("用戶id無效,從新輸入");
        }else{
            userDao.update(user);
        }
    }
    
    public void delete(User user){
        if(user.getid()<0){
            System.out.println("用戶id無效,從新輸入");
        }else{
            userDao.delete(user);
        }
    }
}

定義一個工廠模式來實例化對象UserDao。。。

package JDBC_3;
class DaoFactory{
    private static UserDao userdao=null;
    private static DaoFactory instance= new DaoFactory();
    private DaoFactory(){
        try {
            userdao=(UserDao)Class.forName("JDBC_3.JDBC_3_1_server").newInstance();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
    public static DaoFactory getInstance(){
        return instance;
    }
    public UserDao createUserDao(){
        return userdao;
    }
}

最後是測試類...

package JDBC_3;
import java.sql.Date;
public class JDBC_3_1_ceshi {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        userserves userse=new userserves();
        System.out.println("添加用戶");
        userse.regist(new User()); //這句話咱們也能夠這樣
        //userse.regist(new User(1,"clearlove","1995-01-26",300));這樣寫咱們能夠固定傳參...可是上面的一些代碼就要進行修改了...
    }

}

上面的代碼估計是有點長,可是也不要緊...一名優秀的程序員這點代碼對於咱們來講算什麼呢?其實上面的例子是很好理解的...都是一些基本的東西...

咱們除了上述那種方式能夠對類名進行加載,咱們還可使用proprties...是一種很靈活的方式...

private DaoFactory(){  
        /** 
         * 經過讀取屬性文件來動態的加載Dao層類 
         */  
        Properties prop = new Properties();  
        try{  
            FileInputStream fis = new FileInputStream("src/com/weijia/domain/daoconfig.properties");  
            prop.load(fis);  
            String className = prop.getProperty("userDaoClass");  
            Class<?> clazz = Class.forName(className);  
            userDao = (UserDao)clazz.newInstance();  
            fis.close();  
        }catch(Exception e){  
        }  
    }  

這裏的數據庫就是一個簡單的數據庫...

create table userr
( 
    id int not null,
    name varchar(255) not null,
    birthday Date,
    money float not null
);
相關文章
相關標籤/搜索