JDBC API 允許用戶訪問任何形式的表格數據,尤其是存儲在關係數據庫中的數據。
執行流程:
•連接數據源,如:數據庫。
•為數據庫傳遞查詢和更新指令。
•處理數據庫響應並返回的結果。
JDBC 架構
分為雙層架構和三層架構。
雙層
作用:此架構中,Java Applet 或應用直接訪問數據源。
條件:要求Driver 能與訪問的數據庫交互。
機制:用戶命令傳給數據庫或其他數據源,隨之結果被返回。
部署:數據源可以在另一台機器上,用戶通過網絡連接,稱為C/S配置(可以是內聯網或互聯網)。
三層
側架構特殊之處在於,引入中間層服務。
流程:命令和結構都會經過該層。
吸引:可以增加企業數據的訪問控制,以及多種類型的更新;另外,也可簡化應用的部署,並在多數情況下有性能優勢。
歷史趨勢: 以往,因性能問題,中間層都用C 或C++ 編寫,隨著優化編譯器(將Java 字節碼轉為高效的特定機器碼)和技術的發展,如EJB,Java 開始用於中間層的開發這也讓Java 的優勢突顯出現出來,使用Java 作為服務器代碼語言,JDBC隨之被重視。
JDBC 編程步驟
加載驅動程序:
Class.forName(driverClass)//加載MySql驅動Class.forName("com.mysql.jdbc.Driver")//加載Oracle驅動Class.forName("oracle.jdbc.driver.OracleDriver")
獲得數據庫連接:
複製代碼代碼如下:
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/imooc", "root", "root");
創建Statement/PreparedStatement對象:
複製代碼代碼如下:
conn.createStatement();
conn.prepareStatement(sql);
完整實例
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class DbUtil { public static final String URL = "jdbc:mysql://localhost:3306/imooc "; public static final String USER = "liulx"; public static final String PASSWORD = "123456"; public static void main(String[] args) throws Exception { //1.加載驅動程序Class.forName("com.mysql .jdbc.Driver"); //2. 獲得數據庫連接Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); //3.操作數據庫,實現增刪改查Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess"); //如果有數據,rs.next()返回true while(rs.next()){ System.out.println(rs.getString("user_name" )+" 年齡:"+rs.getInt("age")); } }}
增刪改查
public class DbUtil { public static final String URL = "jdbc:mysql://localhost:3306/imooc"; public static final String USER = "liulx"; public static final String PASSWORD = "123456"; private static Connection conn = null ; static{ try { //1.加載驅動程序Class.forName("com.mysql.jdbc.Driver"); //2. 獲得數據庫連接conn = DriverManager.getConnection(URL, USER, PASSWORD); } catch ( ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static Connection getConnection(){ return conn; }}//模型package liulx.model;import java.util. Date;public class Goddess { private Integer id; private String user_name; private Integer sex; private Integer age; private Date birthday; //注意用的是java.util.Date private String email; private String mobile; private String create_user; private String update_user; private Date create_date; private Date update_date; private Integer isDel; //getter setter方法。 。 。 }//---------dao層--------------package liulx.dao;import liulx.db.DbUtil;import liulx.model.Goddess;import java. sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.List;public class GoddessDao { //增加public void addGoddess( Goddess g) throws SQLException { //獲取連接Connection conn = DbUtil.getConnection(); //sql String sql = "INSERT INTO imooc_goddess(user_name, sex, age, birthday, email, mobile,"+ "create_user, create_date, update_user , update_date, isdel)" +"values("+"?,?,?,?,?,?,?,CURRENT_DATE(),?,CURRENT_DATE(),?)"; //預編譯PreparedStatement ptmt = conn. prepareStatement(sql); //預編譯SQL,減少sql執行//傳參ptmt.setString(1, g.getUser_name()); ptmt.setInt(2, g.getSex()); ptmt.setInt(3, g.getAge()); ptmt.setDate(4, new Date(g.getBirthday().getTime())); ptmt.setString(5, g.getEmail()); ptmt.setString(6, g.getMobile ()); ptmt.setString(7, g.getCreate_user()); ptmt.setString(8, g.getUpdate_user()); ptmt.setInt(9, g.getIsDel()); //執行ptmt.execute( ); } public void updateGoddess(){ //獲取連接Connection conn = DbUtil.getConnection(); //sql, 每行加空格String sql = "UPDATE imooc_goddess" + " set user_name=?, sex=?, age= ?, birthday=?, email=?, mobile=?,"+ " update_user=?, update_date=CURRENT_DATE(), isdel=? "+ " where id=?"; //預編譯PreparedStatement ptmt = conn.prepareStatement( sql); //預編譯SQL,減少sql執行//傳參ptmt.setString(1, g.getUser_name()); ptmt.setInt(2, g.getSex()); ptmt.setInt(3, g. getAge()); ptmt.setDate(4, new Date(g.getBirthday().getTime())); ptmt.setString(5, g.getEmail()); ptmt.setString(6, g.getMobile() ); ptmt.setString(7, g.getUpdate_user()); ptmt.setInt(8, g.getIsDel()); ptmt.setInt(9, g.getId()); //執行ptmt.execute(); } public void delGoddess(){ //獲取連接Connection conn = DbUtil.getConnection(); //sql, 每行加空格String sql = "delete from imooc_goddess where id=?"; //預編譯SQL,減少sql執行PreparedStatement ptmt = conn.prepareStatement(sql); //傳參ptmt.setInt(1, id); //執行ptmt.execute(); } public List<Goddess> query() throws SQLException { Connection conn = DbUtil.getConnection (); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess"); List<Goddess> gs = new ArrayList<Goddess>(); Goddess g = null; while( rs.next()){ g = new Goddess(); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); gs.add(g); } return gs; } public Goddess get(){ Goddess g = null; //獲取連接Connection conn = DbUtil.getConnection(); //sql, 每行加空格String sql = "select * from imooc_goddess where id=?"; //預編譯SQL,減少sql執行PreparedStatement ptmt = conn.prepareStatement(sql); //傳參ptmt.setInt(1, id); //執行ResultSet rs = ptmt.executeQuery(); while(rs.next( )){ g = new Goddess(); g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age") ); g.setSex(rs.getInt("sex")); g.setBirthday(rs.getDate("birthday")); g.setEmail(rs.getString("email")); g.setMobile(rs. getString("mobile")); g.setCreate_date(rs.getDate("create_date")); g.setCreate_user(rs.getString("create_user")); g.setUpdate_date(rs.getDate("update_date")); g.setUpdate_user(rs.getString("update_user")); g.setIsDel(rs.getInt("isdel")); } return g; }}