JDBC

为什么要学习JDBC

我们首先可以这么想一下如果没有jdbc那么我们在工作学习中间会遇见什么样的问题?如果你需要Java连接MySQL数据库那么你必须去了解MySQL的驱动ApI,并且专门为Java连接MySQL写一个程序,如果你使用Java连接Oracle的数据库,这个时间你又需要去了解Oracle的数据库驱动的API,也需要写一个Java连接Oracle的程序。这样子是不是非常的麻烦。而且我们发现Java连接数据库有非常相似的一些操作,如果有一个规则可以让我们去既可以操作MySQL的数据库又可以去操作Oracle的数据库是不是可以大大的提高代码的复用度,jdbc就是这样的一套规范。所有学习并且掌握jdbc对于我们是非常有必要的。

什么是JDBC

JDBC规范定义接口,具体的实现由各大数据库的厂商去实现。

JDBC是Java访问数据库的标准规范,真正的怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通讯格式写好自己数据库的驱动。所有我们只需要调用接口中的方法即可,数据库驱动由数据库厂商提供

使用JDBC的好处

  1. 程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用去了解类是如何实现的。
  2. 使用同一套Java代码,进行一小部分的修改就可以去访问其他JDBC支持的数据库

在这里插入图片描述

JDBC开发中使用的包

在这里插入图片描述

JDBC核心API

在这里插入图片描述
链接: 点击进入MySQL驱动下载.
链接: 点击进入Oracle驱动下载.

JDBC开发步骤

开发前要导入数据库的jar包
第一步:加载驱动
第二步:获得连接
第三步:基本操作
第四步:释放资源

详细解各个对象
1.DriverManager

功能:
1.1注册驱动:告诉程序使用哪一个数据库驱动jar

static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
			写代码使用:  Class.forName("com.mysql.jdbc.Driver");
			通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
			static {
					try {
					     java.sql.DriverManager.registerDriver(new Driver());
					     } catch (SQLException E) {
					  throw new RuntimeException("Can't register driver!");
					    }
    				}
 注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

1.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:密码 
2. Connection:数据库连接对象

. 功能:

   			1. 获取执行sql 的对象
   			 Statement createStatement()
   			 PreparedStatement prepareStatement(String sql)  
   			2. 管理事务:
   			* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
   			* 提交事务:commit() 
   			* 回滚事务:rollback() 
3. Statement:执行sql的对象
   			1. boolean execute(String sql) :可以执行任意的sql 了解 
   			2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
   				* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
   			3. ResultSet executeQuery(String sql)  :执行DQL(select)语句
4. ResultSet:结果集对象,封装查询结果
   	* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
   	* getXxx(参数):获取数据
   		* Xxx:代表数据类型   如: int getInt() ,	String getString()
   		* 参数:
   			1. int:代表列的编号,1开始   如: getString(1)
   			2. String:代表列名称。 如: getDouble("balance")
5. PreparedStatement:执行sql的对象
1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
   1.1 输入用户随便,输入密码:a' or 'a' = 'a
   1.2 sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 
2. 解决sql注入问题:使用PreparedStatement对象来解决
3. 预编译的SQL:参数使用?作为占位符
     给?赋值:
   		* 方法: setXxx(参数1,参数2)
   		* 参数1:?的位置编号 从1 开始
   		* 参数2:?的值
注意:后期都会使用PreparedStatement来完成增删改查的所有操作
	1. 可以防止SQL注入
	2. 效率更高
抽取JDBC工具类 : JDBCUtils
* 目的:简化书写
   * 分析:
   	1. 注册驱动也抽取
   	2. 抽取一个方法获取连接对象
   		* 需求:不想传递参数(麻烦),还得保证工具类的通用性。
   		* 解决:配置文件
   			jdbc.properties
   				url=
   				user=
   				password=
   	3. 抽取一个方法释放资源

   * 代码实现:
   	public class JDBCUtils {
       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 = JDBCUtils.class.getClassLoader();
               URL res  = classLoader.getResource("jdbc.properties");
               String path = res.getPath();
               System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
               //2. 加载文件
              // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
               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);
       }
   
       /**
        * 释放资源
        * @param stmt
        * @param conn
        */
       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();
               }
           }
       }
   
   
       /**
        * 释放资源
        * @param stmt
        * @param conn
        */
       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();
               }
           }
       }
   
   }
JDBC控制事务:
1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2. 操作:
	1. 开启事务
	2. 提交事务
	3. 回滚事务
3. 使用Connection对象来管理事务
	* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
		* 在执行sql之前开启事务
	* 提交事务:commit() 
		* 当所有sql都执行完提交事务
	* 回滚事务:rollback() 
		* 在catch中回滚事务
public class JDBCDemo10 {

   	    public static void main(String[] args) {
   	        Connection conn = null;
   	        PreparedStatement pstmt1 = null;
   	        PreparedStatement pstmt2 = null;
   	
   	        try {
   	            //1.获取连接
   	            conn = JDBCUtils.getConnection();
   	            //开启事务
   	            conn.setAutoCommit(false);
   	
   	            //2.定义sql
   	            //2.1 张三 - 500
   	            String sql1 = "update account set balance = balance - ? where id = ?";
   	            //2.2 李四 + 500
   	            String sql2 = "update account set balance = balance + ? where id = ?";
   	            //3.获取执行sql对象
   	            pstmt1 = conn.prepareStatement(sql1);
   	            pstmt2 = conn.prepareStatement(sql2);
   	            //4. 设置参数
   	            pstmt1.setDouble(1,500);
   	            pstmt1.setInt(2,1);
   	
   	            pstmt2.setDouble(1,500);
   	            pstmt2.setInt(2,2);
   	            //5.执行sql
   	            pstmt1.executeUpdate();
   	            // 手动制造异常
   	            int i = 3/0;
   	
   	            pstmt2.executeUpdate();
   	            //提交事务
   	            conn.commit();
   	        } catch (Exception e) {
   	            //事务回滚
   	            try {
   	                if(conn != null) {
   	                    conn.rollback();
   	                }
   	            } catch (SQLException e1) {
   	                e1.printStackTrace();
   	            }
   	            e.printStackTrace();
   	        }finally {
   	            JDBCUtils.close(pstmt1,conn);
   	            JDBCUtils.close(pstmt2,null);
   	        }
   	
   	
   	    }
   	
   	}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值