學習內容: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 );