JDBC笔记

JDBC(java操作数据库java database connectivity)

  • 一套统一的java代码可以操作所有的关系型数据库。
  • sun公司定义的接口,数据库厂商提供实现类(数据库驱动)。

DriverManager:驱动管理对象

  • 注册驱动:mysql5以上会自动注册驱动,可省略,告诉程序该使用哪一个数据库驱动jar

    • Class.forName("com.mysql.cj.jdbc.Driver");
      

      通过查看Driver发现在这个类里存在静态代码块

      static {
          try {
              DriverManager.registerDriver(new Driver());
          } catch (SQLException var1) {
              throw new RuntimeException("Can't register driver!");
          }
      }
      

      被try包住那一行注册驱动。

  • 获取数据库连接

  • Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","root");
    
    • url:指定连接的路径( jdbc:mysql://ip地址(域名):端口号/数据库名 ) name:用户名 password:密码 (如果连接本机url可以简写为jdbc:mysql:///数据库名)

Connection:数据库连接对象

  • 获取执行sql的对象
    • createStatement()
    • preparedStatement(String url)
  • 管理事务
    • 开启事务:setAutoCommit(boolean autoCommit) :设置为false 则开启事务
    • 提交事务:commit()
    • 回滚事务:rollback()

Statement(静态sql):执行sql的对象

  • boolean excute(String sql) :可以执行任意sql
  • int executeUpdate(String sql) 执行DML语句(增(insert)删(delete)改(update)表中的数据),DDL语句,增(create)删(drop)改(alter)表。(返回值是影响的行数)
  • 练习:增删该记录,查询

ResultSet executeQuery(String sql):执行DQL,返回结果集对象

  • next方法:游标向下移动一行(但是只能获取莫一列的数据)

  • gewXXX(参数),XXX是数据类型 如:int getInt(); String getString();

    • int:从1开始
    • String:列的名称
  • PreparedStatement(动态sql):执行sql,更加强大

    • sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题。
      • 1:输入用户随便,密码:a’ or ‘a’=‘a’;
      • 2:sql : select * from user username=’"+username+"’ and password=’"+password+"’;
    • 预编译的SQL:参数使用?作为占位符。
    • 步骤:
      • sql的参数使用?作为占位符,select * from username=? and password=?;
      • 获取执行sql语句的对象:PreparedStatement—>Connection.prepareStatement(String sql);
      • 给?赋值:setXXX(参数1,参数2);参数1:?的位置 参数2:?的值
  • 抽取JDBC工具类

  • 目的:简化书写

  • 分析:

    • 注册驱动也抽取
    • 抽取一个方法获取连接对象/*
      • 需求:不想传递参数(麻烦),还得保证工具类的通用性
      • 解决:配置文件()
      • */
    • 抽取一个方法释放资源
  • 事务转账案例

    • 使用Connection对象管理事务
      • setAutoCommit():开启事务
      • commit():提交事务
      • rollBack():回滚事务
  • 数据库连接池

    • 数据库连接池

      • 存放数据库连接的容器(集合)

      • 1.节约资源,用户访问高效

      • 标准接口:DataSource javax.sql包下的

        • 1.方法:

          • 获取连接:getConnection()
          • 归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接。
        • 一般我们不去实现它,由数据库厂商实现

          • C3P0:数据库连接池技术

            • 导入jar包( 俩个?三个? )
            • 定义配置文件:
              • 名称:c3p0.properties或者c3p0-config.xml
              • 路径:直接将文件放在src目录下即可
            • 创建数据库连接池对象:ComboPooledDataSource
            • 获取连接:getConnection
          • Druid:数据库连接池技术,由阿里巴巴提供的

            • 导入jar包:druid-1.0.9.jar

            • 定义配置文件:

              • 是properties形式的

              • driverClassName=com.mysql.cj.jdbc.Driver
                url=jdbc:mysql:///db
                username=root
                password=root
                
                #初始化连接数
                initialSize=5
                #最大连接数
                maxActive=10
                #最大等待时间
                maxWait=3000
                
              • 可以叫任意名称,可以放在任意目录下

            • 加载配置文件。Properties

            • //加载配置文件
              Properties pro = new Properties();
              InputStream is = 类名.class.getClassLoader().getResourceAsStream("druid.properties");
              pro.load(is);
              
            • 获取数据库连接池对象:通过工厂来获取:DruidDataSourceFactory

            • DataSource ds = DruidDataSourceFactory.createDataSource(pro);
              
            • 获取连接:getConnection

            • Connection conn = ds.getConnection();
              
      • 定义工具类

        • 使用静态代码块加载配置文件,初始化连接对象
        • 提供方法
          • 获取连接方法:通过数据库连接池获取连接
          • 释放资源
          • 获取连接池方法
        import com.alibaba.druid.pool.DruidDataSourceFactory;
        
        import javax.sql.DataSource;
        import java.io.IOException;
        import java.sql.Connection;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.sql.Statement;
        import java.util.Properties;
        
        /**
         * @author long
         * @date 19-4-19 - 下午5:13
         * Druid工具类
         */
        public class DruidUtils {
            //1.定义成员变量
            private static DataSource ds;
            static{
                //加载配置文件
                Properties pro = new Properties();
                try {
                    pro.load(DruidUtils.class.getResourceAsStream("druid.properties"));
                    ds = DruidDataSourceFactory.createDataSource(pro);
                } catch (IOException e) {
                    System.out.println("加载配置时出现错误");
                } catch (Exception e) {
                    System.out.println("获取连接池时出现错误");
                }
            }
        
            /**
             * 获取连接
             */
            public static Connection getConnection() throws SQLException {
                return ds.getConnection();
            }
        
            /**
             * 释放资源
             */
            public static void close(Statement stmt,Connection conn){
                if(null!=stmt) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        System.out.println("关闭执行SQL对象时出现问题");
                    }
                }
                if(null!=conn) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        System.out.println("关闭连接对象时出现问题");
                    }
                }
            }
            public static void close(ResultSet rs,Statement stmt, Connection conn){
                if(null!=rs) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        System.out.println("关闭集合时出现问题");
                    }
                }
                if(null!=stmt) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        System.out.println("关闭执行SQL对象时出现问题");
                    }
                }
                if(null!=conn) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        System.out.println("关闭连接对象时出现问题");
                    }
                }
            }
            /**
             * 获取连接池的方法
             */
            public static DataSource getDataSource(){
                return ds;
            }
        }
        
  • Spring JDBC :JDBC Template

    • Spring框架对JDBC的简单封装,提供了一个JDBCTemplate带向简化JDBC的开发

    • 步骤

      • 1.导入jar包

      • 2.创建JDBCTemple对象,依赖于数据源DataSource

        • JdbcTemplate template = new JdbcTemplate(ds);

      • 3.调用JdbcTemplate的方法来完成CRUD(增删改查)

        • update() :执行DML语句。增删改语句

          queryForMap() :查询结果将结果集封装为map集合

          queryForList() :查询结果将结果集封装为list集合

          query() :查询结果,将结果封装为JavaBean对象

          queryForObject() :查询结果,将结果封装为对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值