JDBC的基本使用
JDBC
JAVA Database Connectivity java 數據庫連接
- 為什么會出現JDBC
SUN公司提供的一種數據庫訪問規則、規范, 由于數據庫種類較多,并且java語言使用比較廣泛,sun公司就提供了一種規范,讓其他的數據庫提供商去實現底層的訪問規則。 我們的java程序只要使用sun公司提供的jdbc驅動即可。
使用JDBC的基本步驟
JDBC 工具類構建
資源釋放工作的整合
驅動防二次注冊
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Driver 這個類里面有靜態代碼塊,一上來就執行了,所以等同于我們注冊了兩次驅動。 其實沒這個必要的。
//靜態代碼塊 —> 類加載了,就執行。 java.sql.DriverManager.registerDriver(new Driver());
使用properties配置文件
在src底下聲明一個文件 xxx.properties ,里面的內容吐下:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
在工具類里面,使用靜態代碼塊,讀取屬性
static{
try {
//1. 創建一個屬性配置對象
Properties properties = new Properties();
InputStream is = new FileInputStream(“jdbc.properties”); //對應文件位于工程根目錄
}
?
數據庫的CRUD sql
-
insert
INSERT INTO t_stu (NAME , age) VALUES (‘wangqiang’,28)
INSERT INTO t_stu VALUES (NULL,'wangqiang2',28)// 1. 獲取連接對象conn = JDBCUtil.getConn();// 2. 根據連接對象,得到statementst = conn.createStatement();//3. 執行添加String sql = "insert into t_stu values(null , 'aobama' , 59)";//影響的行數, ,如果大于0 表明操作成功。 否則失敗int result = st.executeUpdate(sql);if(result >0 ){System.out.println("添加成功");}else{System.out.println("添加失敗");} -
delete
DELETE FROM t_stu WHERE id = 6
// 1. 獲取連接對象conn = JDBCUtil.getConn();// 2. 根據連接對象,得到statementst = conn.createStatement();//3. 執行添加String sql = "delete from t_stu where name='aobama'";//影響的行數, ,如果大于0 表明操作成功。 否則失敗int result = st.executeUpdate(sql);if(result >0 ){System.out.println("刪除成功");}else{System.out.println("刪除失敗");} -
query
SELECT * FROM t_stu
// 1. 獲取連接對象conn = JDBCUtil.getConn();// 2. 根據連接對象,得到statementst = conn.createStatement();// 3. 執行sql語句,返回ResultSetString sql = "select * from t_stu";rs = st.executeQuery(sql);// 4. 遍歷結果集while (rs.next()) {String name = rs.getString("name");int age = rs.getInt("age");System.out.println(name + " " + age);} -
update
UPDATE t_stu SET age = 38 WHERE id = 1;
// 1. 獲取連接對象conn = JDBCUtil.getConn();// 2. 根據連接對象,得到statementst = conn.createStatement();//3. 執行添加String sql = "update t_stu set age = 26 where name ='qyq'";//影響的行數, ,如果大于0 表明操作成功。 否則失敗int result = st.executeUpdate(sql);if(result >0 ){System.out.println("更新成功");}else{System.out.println("更新失敗");}
使用單元測試,測試代碼
定義一個類, TestXXX , 里面定義方法 testXXX.
添加junit的支持。
右鍵工程 — add Library — Junit — Junit4
在方法的上面加上注解 , 其實就是一個標記。
@Test
public void testQuery() {
…
}
光標選中方法名字,然后右鍵執行單元測試。 或者是打開outline視圖, 然后選擇方法右鍵執行。
Dao模式
Data Access Object 數據訪問對象
新建一個dao的接口, 里面聲明數據庫訪問規則
/*** 定義操作數據庫的方法*/public interface UserDao {/*** 查詢所有*/void findAll();}新建一個dao的實現類,具體實現早前定義的規則
public class UserDaoImpl implements UserDao{@Overridepublic void findAll() {Connection conn = null;Statement st = null;ResultSet rs = null;try {//1. 獲取連接對象conn = JDBCUtil.getConn();//2. 創建statement對象st = conn.createStatement();String sql = "select * from t_user";rs = st.executeQuery(sql);while(rs.next()){String userName = rs.getString("username");String password = rs.getString("password");System.out.println(userName+"="+password);}} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, st, rs);}}}
直接使用實現
@Test
public void testFindAll(){
UserDao dao = new UserDaoImpl();
dao.findAll();
}
Statement安全問題
Statement執行 ,其實是拼接sql語句的。 先拼接sql語句,然后在一起執行。
String sql = "select * from t_user where username='"+ username +"' and password='"+ password +"'";UserDao dao = new UserDaoImpl();dao.login("admin", "100234khsdf88' or '1=1");SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1' 前面先拼接sql語句, 如果變量里面帶有了 數據庫的關鍵字,那么一并認為是關鍵字。 不認為是普通的字符串。 rs = st.executeQuery(sql);PrepareStatement
該對象就是替換前面的statement對象。
相比較以前的statement, 預先處理給定的sql語句,對其執行語法檢查。 在sql語句里面使用 ? 占位符來替代后續要傳遞進來的變量。 后面進來的變量值,將會被看成是字符串,不會產生任何的關鍵字。
String sql = "insert into t_user values(null , ? , ?)";ps = conn.prepareStatement(sql);//給占位符賦值 從左到右數過來,1 代表第一個問號, 永遠你是1開始。ps.setString(1, userName);ps.setString(2, password);?
總結:
JDBC入門
抽取工具類 ###
Statement CRUD ###
演練crud
Dao模式 ###
聲明與實現分開
PrepareStament CRUD ###
預處理sql語句,解決上面statement出現的問題
總結
- 上一篇: linux系统下deepin eclip
- 下一篇: 特斯拉裁员细节曝光 将有3000多名员工