vue專案開發自定義步驟條,自定義高亮
用Java程式碼操作資料庫,增 刪 改 查
package cn.itcast.demo2; import org.junit.Test; import java.sql.*; public class Demo2 { /** * 連線資料庫,得到Connection就算成功! * 對資料庫做 增 刪 改 */ @Test public void fun1() throws ClassNotFoundException, SQLException { /** * 一.得到Connection * 1.準備四大引數 * 2.載入驅動類 * 3.得到Connection */ //準備四大引數 String driverClassName = "com.mysql.jdbc.Driver"; //jdbc協議的格式!jdbc:廠商的名稱:子協議(由廠商自己來規定) //對mysql而言,它的子協議結構://主機:埠號/資料庫名稱 String url = "jdbc:mysql://localhost:3306/mydb3"; String username = "root"; String password = "1234"; //載入驅動類 Class.forName(driverClassName); //使用DriverManager,以及剩下的3個引數,得到Connection Connection con = DriverManager.getConnection(url,username,password); /** * 二.對資料庫做 增 刪 改 * 1.同過Connection物件建立Statement * > Statement 語句傳送器,它的功能就是向資料庫傳送sql語句! * 2.呼叫它的 int executeUpdate(String sql) , 它可以傳送DML DDL */ //1.通過Connection得到Statement物件 Statement stmt = con.createStatement(); //2.使用Statement傳送sql語句! // String sql = "INSERT INTO stu VALUES('ITCAST_0005', 'wangWu', 88, 'male')"; // String sql = "UPDATE stu SET name='zhaoLiu',age=22," + // "gender='female' WHERE number='ITCAST_0005'"; String sql = "delete from stu"; int r = stmt.executeUpdate(sql); System.out.println(r); } /** * 執行查詢 */ @Test public void fun2() throws ClassNotFoundException, SQLException { /** * 一.得到Connection * 二.得到Statement 傳送select語句 * 三.對查詢返回的"表格"進行解析 */ /* * 一.得到連線 * 1.準備四大連結引數 */ String driverClassName = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/exam"; String username = "root"; String password = "1234"; /* * 2.載入驅動類 */ Class.forName(driverClassName); /* * 3.通過剩下的三個引數呼叫DriverManage的getConnection(),得到連線 */ Connection con = DriverManager.getConnection(url,username,password); /* * 二.得到Statement,執行select語句 * 1.得到Statement物件 Connection的createStatement()方法 */ Statement stmt = con.createStatement(); /* * 2.呼叫Statement的 ResultSet rs = executeQuery(String querySql) */ ResultSet rs = stmt.executeQuery("select * from emp"); /* * 三.解析ResultSet * 1.把行游標移動到第一行,可以呼叫next()方法完成 */ while (rs.next()){//把游標向下移動一行 並判斷下一行是否存在 int empno = rs.getInt(1);//通過列編號來獲取該列的值 String ename = rs.getString("ename");//通過列名稱來獲取該列的值 double sal = rs.getDouble("sal"); System.out.println(empno + "," + ename + "," + sal); } /* * 四.關閉資源 * 倒關 */ rs.close(); stmt.close(); con.close();//這個東西必須要關,,不關就死!! } }
-
程式碼的規範應該向下面這樣寫:
@Test //規範化 public void fun3() throws Exception { Connection con = null;//定義引用 Statement stmt = null; ResultSet rs = null; try { /** * 一.得到連線 */ String driverClassName = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/exam"; String username = "root"; String password = "5879"; Class.forName(driverClassName); con = DriverManager.getConnection(url, username, password);//例項化 /** * 二.建立Statement. * */ stmt = con.createStatement(); String sql = "select * from emp"; rs = stmt.executeQuery(sql); //檢視一共有多少行資料 rs.last();//把游標移到最後一行 System.out.println(rs.getRow());//列印行數 rs.beforeFirst();//從第一行開始顯示 /** * 三.迴圈遍歷rs,列印其中資料 * * getString() 和 getObject()是通用的 */ // while (rs.next()){ // System.out.println(rs.getObject(1) + "," + rs.getString("ename") + "," + rs.getDouble("sal")); // } //不知到有多少行多少列和列名稱就用迴圈遍歷 int count = rs.getMetaData().getColumnCount(); while (rs.next()){//迴圈遍歷行 for (int i = 1; i <count ; i++) {//遍歷列 System.out.print(rs.getObject(i)); if(i < count) { System.out.print(", "); } } System.out.println(); } }catch(Exception e){ throw new RuntimeException(e); }finally{ //關閉 if(rs !=null)rs.close(); if(stmt !=null)stmt.close(); if(con !=null)con.close(); } }
PreparedStatement
它是Statement介面的子介面;
-
強大之處:
- 防SQL攻擊;
- 提高程式碼的可讀性、可維護性;
- 提高效率!
-
學習PreparedStatement的用法:
- 如何得到PreparedStatement物件:
- 給出SQL模板!
- 呼叫Connection的PreparedStatement prepareStatement(String sql模板);
- 呼叫pstmt的setXxx()系列方法sql模板中的?賦值!
- 呼叫pstmt的executeUpdate()或executeQuery(),但它的方法都沒有引數。
package cn.itcast.demo3;
import org.junit.Test;
import java.sql.*;
/**
-
PreapredStatement
-
防SQL攻擊
/
public class Demo3 {
/*-
登入
-
使用username和password去查詢資料
-
若查出結果即,說明正確!返回true
-
若查詢不出來結果,說明使用者名稱跟或密碼錯誤,返回false
-
@param username
-
@param password
-
@return
/
public boolean login(String username,String password) throws Exception {
/*- 得到Connection
- 二.得到Statement
- 三.得到ResultSet
- 四.對ResultSet判斷,rs.next()返回的是什麼,我們就返回什麼
*/
//準備四大引數
String driverClassName = “com.mysql.jdbc.Driver”;
String url = “jdbc:mysql://localhost:3306/mydb3”;
String mysqlUsername = “root”;
String mysqlPassword = “1234”;
//載入驅動類
Class.forName(driverClassName);
//得到Connection
Connection con = DriverManager.getConnection(url,mysqlUsername,mysqlPassword);
//得到Statement
Statement stmt = con.createStatement();//給出sql語句,呼叫stmt的executeQuery(),得到ResyltSet
String sql = “select * from t_user where username=’” + username + “’ and password = '” + password + “’”;
System.out.println(sql);
ResultSet rs = stmt.executeQuery(sql);
return rs.next();
}
/**
- SQL攻擊!
- @throws Exception
*/
@Test
public void fun1() throws Exception {
//select * from t_user where username=‘username’ and password = ‘password’
String username = "a’ or ‘a’=‘a ";
String password = "a’ or ‘a’='a ";
boolean bool = login (username,password);
System.out.println(bool);
}
public boolean login2(String username,String password) throws Exception {
/**
* 得到Connection
* 二.得到Statement
* 三.得到ResultSet
* 四.對ResultSet判斷,rs.next()返回的是什麼,我們就返回什麼
*/
//準備四大引數
String driverClassName = “com.mysql.jdbc.Driver”;
String url = “jdbc:mysql://localhost:3306/mydb3”;
String mysqlUsername = “root”;
String mysqlPassword = “1234”;
//載入驅動類
Class.forName(driverClassName);
//得到Connection
Connection con = DriverManager.getConnection(url,mysqlUsername,mysqlPassword);/** * 一.得到PreparedStatement * 1.給出sql模板,所有的引數使用?來替代 * 2.呼叫Connection方法,得到PreparedStatement */ String sql ="select * from t_user where username=? and password=?"; PreparedStatement pstmt = con.prepareStatement(sql); /** * 二.為引數賦值 */ pstmt.setString(1, username);//給第一個問號賦值,值為username pstmt.setString(2, password);//給第二個問號賦值,值為password ResultSet rs =pstmt.executeQuery();//呼叫查詢方法,向資料庫傳送查詢語句 return rs.next();
}
@Test
public void fun2() throws Exception {
//select * from t_user where username=‘username’ and password = ‘password’
String username = “zhangSan”;
String password = “123”;
boolean bool = login2 (username,password);
System.out.println(bool);
}
} -
- 如何得到PreparedStatement物件:
-
預處理的原理
- 伺服器的工作:
- 校驗sql語句的語法!
- 編譯:一個與函式相似的東西!
- 執行:呼叫函式
- PreparedStatement:
- 前提:連線的資料庫必須支援預處理!幾乎沒有不支援的!
- 每個pstmt都與一個sql模板繫結在一起,先把sql模板給資料庫,資料庫先進行校驗,再進行編譯。執行時只是把引數傳遞過去而已!
- 若二次執行時,就不用再次校驗語法,也不用再次編譯!直接執行!
- 伺服器的工作:
JdbcUtils工具類
-
JdbcUtils的作用
你也看到了,連線資料庫的四大引數是:驅動類、url、使用者名稱,以及密碼。這些引數都與特定資料庫關聯,如果將來想更改資料庫,那麼就要去修改這四大引數,那麼為了不去修改程式碼,我們寫一個JdbcUtils類,讓它從配置檔案中讀取配置引數,然後建立連線物件。 -
JdbcUtils程式碼
package cn.itcast.demo3;import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; /** * v1.0 */ public class JdbcUtils { private static Properties props = null; //只在JdbcUtils類載入時執行一次 static { //給props進行初始化,即載入dbconfig.properties檔案到props物件中 try { //載入配置檔案 InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbconfig.properties"); props = new Properties(); props.load(in); }catch (IOException e){ throw new RuntimeException(e); } //載入驅動類 try { Class.forName(props.getProperty("driverClassName")); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } //獲取連線 public static Connection getConnection() throws SQLException { //得到Connection return DriverManager.getConnection( props.getProperty("url"), props.getProperty("username"), props.getProperty("password") ); } }
dbconfig.properties(自定配置檔案)
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8
username=root
password=5879