1、JDBC操做步驟java
1.加載數據庫驅動程序:各個數據庫都會提供JDBC的驅動程序開發包,直接把JDBC操做所須要的開發包(通常爲*.jar或*.zip)直接配置到classpath路徑便可。mysql
2.鏈接數據庫:根據各個數據庫的不一樣鏈接的地址也不一樣,此鏈接地址將由數據庫廠商提供,通常在使用JDBC鏈接數據庫的時候都要求用戶輸入數據庫鏈接的用戶名和密碼,用戶在取得鏈接以後才能夠對數據庫進行查詢或更新的操做。android
3.使用語句進行數據庫操做:數據庫操做分爲更新和查詢兩種操做,除了可使用標準的SQL語句以外,對於各個數據庫也可使用其本身提供的各類命令。sql
4.關閉數據庫鏈接:數據庫操做完畢以後須要關閉鏈接以釋放資源。數據庫
2、配置數據庫的驅動程序app
1.下載驅動:http://www.mysql.com/downloads/connector/j/性能
2.配置環境變量:在classpath中添加驅動路徑(例如個人路徑是D:\mysql-connector-java-5.1.21-bin.jar;);this
3、加載驅動url
[java] view plain copyspa
- public class connector {
- public static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; //定義MySQL數據庫驅動程序
- public static void main(String[] args) {
- try {
- Class.forName(DBDRIVER); //加載驅動程序
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
4、鏈接及關閉數據庫
1.使用DriverManager類進行鏈接操做,DriverManager類的經常使用方法:
(1)經過鏈接地址鏈接數據庫
public static Connection getConnection(String url) throws SQLException
(2)經過鏈接地址鏈接數據庫同時輸入用戶名和密碼
public static Connection getConnection(String url, String user, String password) throws SQLException
2.DriverManager說明:
(1)在DriverManager中,提供的主要操做是獲得一個數據庫的鏈接,getConnection()方法就是取得鏈接對象,此方法返回的類型是Connection對象,無論使用那種方式鏈接,都必須提供一個數據庫的鏈接地址,若是在鏈接數據庫的時候須要用戶名和密碼,則還須要將用戶名和密碼設置上。MySQL數據庫的鏈接地址格式以下:jdbc:mysql://IP地址:端口號/數據庫名稱
(2)數據庫鏈接地址的形式由三部分組成:
a.jdbc協議:JDBC URL中的協議老是jdbc;
b.子協議:驅動程序名和數據庫鏈接機制(這種機制可由一個或多個驅動程序支持)的名稱,例如:mysql;
c.子名稱:一種標識數據庫的方法。必須遵循"/主機名:端口/子協議"的標準URL命名約定,例如://localhost:3306/Joywy.
3.Connection
經過DriverManager取得Connection對象以後,實際上就表示數據庫鏈接上了,鏈接上數據庫以後就能夠進行數據庫的更新及查詢操做,可是操做的最後數據庫的鏈接必須關閉。
鏈接數據庫代碼以下:
[java] view plain copy
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
-
- public class ConnectionDemo{
- //定義MySQL驅動程序
- public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
- //定義MySQL數據庫的鏈接地址
- public static final String DBURL = "jdbc:mysql://localhost:3306/xiaowei";
- //MySQL數據庫的鏈接用戶名
- public static final String DBUSER = "root";
- //MySQL數據庫的鏈接密碼
- public static final String DBPASS = "android";
- public static void main(String[] args){
- //數據庫鏈接
- Connection con = null;
- try{
- //加載驅動
- Class.forName(DBDRIVER);
- }catch(ClassNotFoundException e){
- e.printStackTrace();
- }
- try{
- con = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
- }catch(SQLException e){
- e.printStackTrace();
- }
- System.out.println(con);
- try{
- //數據庫關閉
- con.close();
- }catch(SQLException e){
- e.printStackTrace();
- }
- }
- }
5、數據庫操做
1.Statement接口
此接口經過使用Connection接口中的createStatement()方法實例化,此接口定義了一下方法:
No. |
方法 |
類型 |
描述 |
1 |
Int executeUpdate(String sql)throws SQLException |
普通 |
執行數據庫更新的SQL語句,例如:INSERT、UPDATE、DELETE等語句,返回更新的記錄數 |
2 |
ResultSet executeQuery(String sql)throws SQLException |
普通 |
執行數據庫查詢操做,返回一個結果集對象 |
3 |
void addBatch(String sql)throws SQLException |
普通 |
增長一個待執行的SQL語句 |
4 |
int[] executeBatch()throws SQLException |
普通 |
批量執行SQL語句 |
5 |
void close()throws SQLException |
普通 |
關閉Statement操做 |
6 |
Boolean execute(String sql)throws SQLException |
普通 |
執行SQL語句 |
2.ResultSet接口
使用SQL中的SELECT語句能夠將數據庫的所有結果查詢出來,在JDBC的操做中數據庫的全部查詢記錄將使用ResultSet進行接收,並使用ResultSet顯示內容。
3.PreparedStatement接口
PreparedStatement接口是Statement的子接口,屬於預處理操做,與直接使用Statement不一樣的是,PreparedStatement在操做時,是先在數據表之中準備好一條SQL語句,可是此SQL語句的具體內容暫時不設置,而是以後再進行設置,以插入數據爲例,使用PreparedStatement插入數據時,數據表中的指針首先指向最後一條數據以後,可是裏面的內容是不知道的,而是等待用戶分別設置的。
注意:設置日期格式的問題,在PreparedStatement中定義了setData(),此方法能夠設置日期內容,可是此方法使用時,後面的Data類型變量是java.sql.Data,而不是java.util.Data,因此若是要想將一個java.util.Data類型的內容變爲java.sql.Date類型的內容應該使用以下的語句形式:
[java] view plain copy
- String birthday = "2007-08-27" //生日
- java.util.Date temp = null; //聲明一個Date對象
- //經過SimpleDataFormat類將一個字符串變爲java.util.Date類型
- temp = new SimpleDataFormat("yyyy-MM-dd").parse(birthday);
- //經過java.util.Data取出具體的日期數,並將其變爲java.sql.Data類型
- java.sql.Data bir = new java.sql.Data(temp.getTime());
代碼以下:
DBHelper.java
[java] view plain copy
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.List;
-
-
- public class DBHelper {
- public static final String DBDRIVER = "com.mysql.jdbc.Driver";
- public static final String DBURL = "jdbc:mysql://localhost:3306/test";
- public static final String DBUSER = "root";
- public static final String DBPASS = "1111";
-
- public static Connection getConnection(){
- Connection conn = null;
- try {
- Class.forName(DBDRIVER);
- conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return conn;
- }
-
- public static void save(){
- Connection con = getConnection();
- String sql = "insert into Info values(?, ?, ?)";
- PreparedStatement psmt = null;
- try {
- psmt = con.prepareStatement(sql);
- psmt.setString(1, "123");
- psmt.setString(2, "12");
- psmt.setInt(3, 3);
- int count = psmt.executeUpdate();
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(psmt != null){
- try {
- psmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if(con != null){
- try {
- con.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
-
- public static void delete(){
- Connection con = getConnection();
- String sql = "delete from Info where id=?";
- PreparedStatement psmt = null;
- try {
- psmt = con.prepareStatement(sql);
- psmt.setString(1, "10330070");
- int count = psmt.executeUpdate();
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(psmt != null){
- try {
- psmt.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if(con != null){
- try {
- con.close();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
-
- public static void update(){
- Connection con = getConnection();
- String sql = "update Info set age = ? where id = ?";
- PreparedStatement psmt = null;
- try {
- psmt = con.prepareStatement(sql);
- psmt.setInt(1, 22);
- psmt.setString(2, "111313");
- int count = psmt.executeUpdate();
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(psmt != null){
- try {
- psmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if(con != null){
- try {
- con.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
-
- public static List<Info> query(){
- List<Info> list = new ArrayList<Info>();
- Connection con = getConnection();
- String sql = "select * from Info";
- PreparedStatement psmt = null;
- ResultSet rs = null;
-
- try {
- psmt = con.prepareStatement(sql);
- rs = psmt.executeQuery();
-
- while(rs.next()){ //依次取出數據
- Info info = new Info();
- info.setId(rs.getString("id"));
- info.setPass(rs.getString("pass"));
- info.setAge(rs.getInt("age"));
- System.out.println(info.getId() +"\t" + info.getPass() + "\t" + info.getAge());
- list.add(info);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- if(rs != null){
- try {
- rs.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if(psmt != null){
- try {
- psmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if(con != null){
- try {
- con.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- return list;
- }
-
- public static void main(String[] args){
- System.out.println(query().get(0).getAge());
-
- }
- }
Info.java
[java] view plain copy
- public class Info {
- private String id;
- private String pass;
- private int age;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getPass() {
- return pass;
- }
- public void setPass(String pass) {
- this.pass = pass;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
注:
(1)通常來講,我會習慣使用PreparedStatement對數據庫進行操做。PreparedStatement是預編譯方式的,在執行SQL語句的時候效率就要高一些,還有就是PreparedStatement能夠更好地避免SQL注入問題;在拼接sql語句時,採用PreparedStatement能夠有效地減小出錯的概率;PreparedStatement是Statement的一個子類,理所固然地PreparedStatement對Statement有必定的擴展,在性能方面有必定的提升。
(2)在開發中是不能直接使用"SELECT * FROM user",由於這樣在查詢的時候並不能明確的表示要取的內容是什麼,因此開發中查詢時確定要明確地寫出須要查找的列。