文章目錄
一、添加JDBC驅動包
二、使用JDBC簡單步驟
- 1、註冊驅動`
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- 2、建立連接
Connection conn=(Connection) DriverManager.getConnection("jdbc:mysql://localhost/數據庫名", "root", "daq");
- 3、創建statement----跟數據庫打交道,一定需要這個對象
st = conn.createStatement();
- 4、執行sql 查詢,得到結果集ResultSet
String sql = "select * from t_stu";
ResultSet rs = st.executeQuery(sql);
- 5、遍歷查詢每一條記錄
while(rs.next()){
int id=rs.getInt("cid");
String name =rs.getString("cname");
String desc =rs.getString("cdesc");
System.out.println("cid"+id +"cname"+name +"cdesc"+desc);
}
- 6、關閉,釋放資源
新建一個包放置適房資源的工具類,在JDBC釋放資源時調用即可
public class JDBCUtil {
/**
* @param args
* @deprecated 釋放資源
*/
public static void release(ResultSet rs,Statement st,Connection conn){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs){
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs=null;
}
}
private static void closeSt(Statement st){
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st=null;
}
}
private static void closeConn(Connection conn){
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn=null;
}
}
三、JDBC工具類(修改原有代碼)
- 查看源代碼,有一段靜態代碼塊(類加載的時候就會執行),所以等同於說註冊了兩次驅動,其實驅動只需要註冊一次就夠了。
- 1、註冊驅動(防止二次註冊)
改成以下代碼即可
Class.forName("com.mysql.jdbc.Driver");
引號裏面是Driver的全路徑
- 2、在工具類中加方法getconn()
static String url="jdbc:mysql://localhost/daq";
static String name="root";
static String password="daq";
/**
* 獲取連接對象
* @return
*/
public static Connection getconn() {
Connection conn = null;
try {
// 1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
conn = (Connection) DriverManager.getConnection(
url, name, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
- 使用properties配置文件
1.創建properties
在src下面新建一個**jdbc.properties** 文件
寫入:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/daq
name=root
password=daq
2.讀取properties
在JDBCUtil工具類中添加靜態代碼塊,保證工具類一加載,就可以讀取配置文件。
static String driverClass = null;
static String url = null;
static String name = null;
static String password = null;
static {
try {
// 1.創建一個屬性配置對象
Properties properties = new Properties();
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 導入輸入流
properties.load(is);
// 讀取屬性
driverClass =properties.getProperty("driverClass");
url =properties.getProperty("url");
name =properties.getProperty("name");
password =properties.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
四、JDBC的CRUD
- insert(插入)
INSERT INTO t_stu VALUES (NULL,'wangqiang2',28)
// 1. 獲取連接對象
conn = JDBCUtil.getconn();
// 2. 根據連接對象,得到statement
st = 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. 根據連接對象,得到statement
st = conn.createStatement();
//3. 執行添加
String sql = "delete from stu where name='XXX'";
//影響的行數, ,如果大於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. 根據連接對象,得到statement
st = conn.createStatement();
// 3. 執行sql語句,返回ResultSet
String sql = "select * from 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. 根據連接對象,得到statement
st = 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("更新失敗");
}
- 補充:單元測試junit
- 定義一個類, TestXXX , 裏面定義方法 testXXX.
- 添加junit的支持。
右鍵工程 --- add Library --- Junit --- Junit4
- 在方法的上面加上註解 , 其實就是一個標記。
@Test
public void testQuery() {
...
}
- 光標選中方法名字,然後右鍵執行單元測試。 或者是打開outline視圖, 然後選擇方法右鍵執行。
五、DAO模式
- Data Access Object 數據訪問對象
- 1、新建一個dao的接口, 裏面聲明數據庫訪問規則
/**
* 定義操作數據庫的方法
*/
public interface UserDao {
/**
* 查詢所有
*/
void findAll();
}
- 2、新建一個dao的實現類,具體實現早前定義的規則
public class UserDaoImpl implements UserDao{
@Override
public 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();
}
六、JDBC 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);
七、PreparStatement CRUD
- 該對象就是替換前面的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);
- PreparStatement的添加,刪除,更新,