JDBC相关知识点
概念
java DataBase Connectivity java 數據庫連接 ,java語言操作數據庫
JDBC本質:其實是官方(sum公司)定義的一套操作所有關系類型數據庫的規則,即接口. 各個數據庫廠商去實現這套接口,提供數據庫驅動jar包,我們可以使用這套接口(JDBC)編程. 真正執行的代碼是驅動jar包中的實現類快速入門
public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1.導入驅動包 mysql-connector-java-5.1.37-bin.jar // 復制mysql-connector-java-5.1.37-bin.jar到項目lib文件夾下(沒有可以自己創建) // 右鍵--> Add As Library // 2.注冊驅動Class.forName("com.mysql.jdbc.Driver"); // 3.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "1234"); // 4.定義sqlString sql="update account set balance =500 where id=1;"; // 5.獲取執行sql語句對象 StatemenStatement stmt = conn.createStatement(); // 6.執行sql,接收返回結果int count = stmt.executeUpdate(sql); // 7.處理結果System.out.println(count); // 8.釋放資源stmt.close();conn.close();} }詳解各個對象
DriverManager:
DriverManager: 英 /?dra?v?(r)/ 英 /?m?n?d??(r)/ [拽我麥妮哲]驅動管理對象
功能:
1.注冊驅動:告訴程序該使用哪一個數據庫驅動jar
2.獲取數據庫連接:
方法:static connection.getconnection(string url, string user, string password) 參數:url:指定連接的路徑語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱例子:jdbc:mysql://localhost:3306/db3細節:如果連接的是本機mysql服務器,并且mysql服務默認端口是3306,則url可以簡寫為:jdbc:mysql:///數據庫名稱 user:用戶名 password:密碼Connection:
數據庫連接對象
Connection: 英 /k??nek?n/ [科 耐克神]功能:
1.獲取執行sql對象
2.管理實務
開啟事務:setAutoCommit(boolean aotuCommit):調用該方法色后置參數為false,即開啟事務提交事務:commit()回滾事務:rollback()Statement:
執行sql的對象
Statement: 英 /?ste?tm?nt/ [斯戴特悶特]1.執行:sql
1.boolean execute(String sql):可以執行任意的sql(了解即可) 2.int executeUpdate(String SQL):執行DML(insert/update/delete)語句,DDL(create/alter/drop)語句返回值:影響的行數,可以通過這個影響的行數判斷語句是否執行成功,返回值>0則成功,反之,則失敗 3.Result executeQuery(String sql):執行DQL(select)語句ResultSet:
結果集對象
ResultSet: 英 /r??z?lt/ [瑞饒特 賽特] next():游標向下移動一行getXxx(): 獲取數據Xxx:代表數據類型 如:int getInt() String getString() 參數:1.int :代表列的編號,從1開始 比如:getString(1):獲取第一列的值注意:使用步驟1.游標向下移動一行2.判斷是否有數據3.獲取數據//執行sql語句rs = stat.executeQuery(sql);//循環判斷游標是否是最后一行末尾while (rs.next()){int id = rs.getInt(1);String name = rs.getString("name");int balaance = rs.getInt(3);System.out.println(id+"==="+name+"==="+balaance);}PreparedStatement:
執行sql的對象
英 /pr??pe?d/ 英 /?ste?tm?nt/ [普瑞 派的 斯戴特悶特] 1,sql 注入問題:1.用戶隨便輸入密碼: a' or 'a'='a2.sql:select * from user where username ='fhdsjkf' and password = 'a' or 'a'='a'解決方案:
public static void main(String[] args) {//鍵盤錄入姓名和密碼System.out.println("請輸入用戶名:");Scanner sc=new Scanner(System.in);String name = sc.nextLine();System.out.println("請輸入密碼:");String password = sc.nextLine();boolean flag = opinion(name, password);if (flag){System.out.println("登陸成功");}else {System.out.println("登錄失敗");}}public static boolean opinion(String name ,String password){ if (name==null||password==null){System.out.println("請檢查賬戶或者密碼");return false; }Connection conn=null;PreparedStatement pstmt=null;ResultSet rs=null;try {//使用工具類獲取connection對象conn = Utils.getConnection();String sql="select *from account where name=? and password=?;";//select *from account where name='lisi' or 1=1 and password='1234' ;//獲取Statement對象pstmt = conn.prepareStatement(sql);pstmt.setString(1,name);pstmt.setString(2,password);rs = pstmt.executeQuery();return rs.next();} catch (SQLException throwables) {throwables.printStackTrace();}finally {Utils.close(rs,pstmt,conn);}return false;}抽取jdbc的工具類
JDBCUtils
目的:簡化書寫 分析:1.注冊驅動也抽取2.抽取一個方法獲取連接對象 需求:不想傳遞參數(麻煩那),還得保證工具類的通用性.解決:配置文件jdbc.propertiesurl=user=passwo= JDBC.properties文件:url=jdbc:mysql:///db3 user=root password=1234 driver=com.mysql.jdbc.Driver 3.抽取一個方法釋放資源JDBC工具類:
public class Utils {private static String url;private static String user;private static String password;private static String driver;/*** 文件的讀取,只需要讀取一次即可拿到這些值,使用靜態代碼塊* */static {//讀取資源文件,獲取值try {//1.創建Properties集合類Properties pro = new Properties();//獲取src路徑下的文件的方式:--->ClassLoader 類加載器ClassLoader classLoader = Utils.class.getClassLoader();URL res = classLoader.getResource("jdbc.properties");String path = res.getPath();//2.加載文件pro.load(new FileReader(path));//3.獲取數據,在賦值url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password");driver = pro.getProperty("driver");//4.注冊驅動Class.forName(driver);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 獲取連接* return連接對象**/public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);}/*** 釋放資源*/public static void close(Statement stmt, Connection conn) {if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(ResultSet rs, Statement stmt, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}} }測試工具類:
public class Test002 {//測試工具類public static void main(String[] args) {Connection conn=null;Statement stat=null;ResultSet rs=null;try {//使用工具類的方法conn = Utils.getConnection();//3.獲取statement對象stat = conn.createStatement();//4.定義sql語句String sql="select *from account;";//刪除account表中字段你name=wangwu的所有記錄//5.執行sql語句rs = stat.executeQuery(sql);//6.輸出結果while (rs.next()){int id = rs.getInt(1);String name = rs.getString("name");int balaance = rs.getInt(3);System.out.println(id+"==="+name+"==="+balaance);}} catch (SQLException throwables) {throwables.printStackTrace();}finally{//釋放資源if(rs!=null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(stat!=null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(conn!=null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}} }JDBC控制事務
事務:一個包含多個步驟的業務操作.如果這個業務操作被事務管理,則這個步驟要么同時成功,要么同時失敗 操作開啟事務提交事務回滾事務 使用connection對象來管理事務 開啟事務:setAutoCommit(Boolean autoCommit):調用該方法設置參數為false,即為開啟事務提交事務:commit()回滾事務:rollback()案例:銀行轉賬系統張三給李四轉賬500元,中途手動制造異常,使用事務處理
public static void main(String[] args) throws SQLException {Connection conn=null;PreparedStatement pstmt1=null;PreparedStatement pstmt2=null;try {//獲取連接conn = Utils.getConnection();//開啟事務conn.setAutoCommit(false);//false為開啟事務//定義sqlString sql1="update yinhang set money=money-? where name=?;";//定義張三-500String sql2="update yinhang set money=money+? where name=?;";//定義李四+500//獲取sql對象pstmt1 = conn.prepareStatement(sql1);pstmt2 = conn.prepareStatement(sql2);//設置參數pstmt1.setInt(1,500);pstmt1.setString(2,"zhangsan");pstmt2.setInt(1,500);pstmt2.setString(2,"lisi");pstmt1.executeUpdate();//手動制造異常int i=3/0;pstmt2.executeUpdate();//提交事務conn.commit();} catch (Exception throwables) {if(conn!=null){try {conn.rollback();} catch (SQLException e) {e.printStackTrace();}}throwables.printStackTrace();}finally {Utils.close(pstmt1,conn);Utils.close(pstmt2,null);//實際開發不能這樣寫,只為測試}}數據庫連接池
概念 :其實就是一個容器(集合),存放數據庫連接的容器當容器初始化好,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,從容器中獲取連接對象,用戶訪問完之后,會將連接對象歸還給容器; 好處:節約資源用戶訪問高效 實現:標準接口:DataSource javax.sql包下的方法:獲取連接:getConnection()歸還連接:Connection.close().如果連接對象connection是從連接池中獲取的,那么調用Connection.close()方法則不會再關閉了,而是歸還連接.一般我們不去實現它,有數據庫廠商來實現C3P0:數據庫連接池技術;Druid:數據庫連接池技術,由阿里巴巴提供的C3P0:數據庫連接池技術
步驟:
1導入jar包(兩個)c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
*不要忘記導入數據庫驅動jar包
2.定義配文件:
*名稱:c3p0.properties或者c3p0-config.xml
* 路徑:直接將文件放在src目錄下即可。
3.創建核心對旅數據庫連接池對象EomboPooledDataSource
4.獲取連接:getConnection
Druid:數據庫連接池技術
步驟:
1.導入jar包 druid-1.0.9.jar
2.定義配文件:
*是properties形式的
可以叫任意名稱,可以放在任意目錄下
3.加載配文件。Properties
4.獲取數據庫連接池對象:通過工廠來來獲取DruidDataSourceFactory
5.獲取連接:getConnection
定義一個工具類:
druid.properties文件
url=jdbc:mysql:///db3username=rootpassword=1234driverClassName=com.mysql.jdbc.DriverinitialSize=5maxActive=10maxWait=3000定義一個類 JDBCUtils
提供靜態代碼塊加載配置文件,初始化連接池對象
提供方法
獲取連接的方法:通過數據庫連接池獲取連接
釋放資源
獲取連接池的方法
測試druid工具類
給account表增加一條數據,添加成功則控制臺打印輸出:錄入數據的行數
public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;//給account表添加一條記錄try {//獲取數據conn = JDBCUtils.getConnection();//定義sqlString sql = "insert into account(ID,NAME, password) value (NULL,?,?);";//獲取PreparedStatement對象pstmt = conn.prepareStatement(sql);//給?賦值pstmt.setString(1, "zhangsan");pstmt.setInt(2, 1000);//執行sqlint index = pstmt.executeUpdate();System.out.println(index);} catch (SQLException throwables) {throwables.printStackTrace();} finally {JDBCUtils.close(pstmt,conn);}}總結
- 上一篇: 航天信息金税盘接口 js 调用
- 下一篇: Web前端页面劫持和反劫持