JDBC

JDBC

  • Java DataBase Connectivity :Java数据库连接
  • 定义了操作所有关系型数据库的规则接口,由数据库厂商自己编写接口的实现类,即数据库驱动

使用步骤入门

  1. 导入驱动Jar包

    • 复制数据库驱动Jar包到项目的lib目录下
    • lib目录右键选择add as library
  2. 注册驱动

  3. 获取数据库连接对象 Connection

  4. 定义SQL

  5. 获取执行SQL语句的对象 Statement

  6. 执行SQL,接收返回结果

  7. 处理结果

  8. 释放资源

    public static void main(String[] args) {
        Statement stat = null;
        Connection con = null; 
        try {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库连接对象
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC","root","637625");
            //定义SQL语句
            String sql ="update user set username = '秀吉' where id=45";
            //获取执行SQL的对象
             stat = con.createStatement();
            //执行SQL
            int count = stat.executeUpdate(sql);
            //处理结果
            System.out.println(count);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
        throwables.printStackTrace();
         }finally {
            //释放资源
            if(stat != null) {
                try {
                    stat.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(con != null) {
                try {
                    con.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }


    }

JDBC对象详解

  • DriverManager:驱动管理对象

    * 功能

    • 注册驱动:static void registerDriver(Driver driver);

      Class.forName():加载指定类到JVM虚拟机,同时执行类中的静态代码块,

      com.mysql.jdbc.Driver类中的静态代码块执行的即是registerDriver方法注册驱动

      MySQL5以后注册驱动已自带,可省略

    • 获取数据库连接:static connection getConnection(String url,String user,String password);

      * url:数据库地址——jdbc:mysql://ip地址:端口号/数据库名

      * user:用户名

      * password:密码

  • Connection:数据库连接对象

    * 功能

    • 获取执行SQL的对象

      * Statement createStatement()

      * PreparedStatement prepareStatement(String sql)

    • 管理事务

      * 开启事务:void setAutoCommit(boolean autoCommit);

      调用该方法设置参数为false,即开启事务

      • 在执行SQL之前开启事务

      * 提交事务:commit()

      • 在SQL执行完后提交事务

      * 回滚事务:rollback();

      • 在出现任何异常时回滚,即在catch代码块中捕获异常的同时回滚事务
  • Statement:SQL执行对象(静态SQL对象)

    * 功能

    • 执行SQL:

      * boolean execute(String sql);:可以执行任意的SQL语句(不常用)

      * int executeUpdate(String sql);:执行DML(增-insert、改-update、删-delete)语句、DDL(create:创建,alter:修改,drop:删除)语句(不常用)

      • int返回值:SQL语句影响的行数,返回值大于0代表执行成功,反之失败

      * ResultSet executeQuery(String sql);:执行DQL(select)语句,返回结果集

  • ResultSet:结果集对象,封装查询结果

    • boolean next()方法:游标向下移动一行,返回一个布尔值,返回false时,代表光标在最后一行有效数据之后

    • getXxx(参数)方法:获取某一数据类型的数据,Xxx代表数据类型;

      参数:int:代表列的编号,从1开始计算;如:getInt(1);

      ​ String:代表列的名称;如:getString(“name”);

    rs= stm.executeQuery(sql);//执行DQL语句返回结果集
    while(rs.next){//判断结果集光标是否在最后一行末尾
        int id = rs.getInt(1);//以行号获取数据
        String name = rs.getString("name");//以行名称获取数据
        ......
    }
    
  • PreparedStatement:SQL执行对象(预编译SQL对象)

    • SQL注入问题:在拼接sql语句时,若有一些sql的关键字参与字符串的拼接,可能会造成安全问题

    • 为解决SQL注入问题,甲骨文提出PreparedStatement作为SQL执行对象,拼接SQL中参数以?作为占位符存在

    • 使用步骤

      1. 注册驱动

      2. 获取数据库连接对象

      3. 定义SQL

        select * from user where username = ? and password = ?;

        SQL语句中参数以?作为占位符

      4. 获取执行sql语句的对象

        PreparedStatement pstmt = Connection.prepareStatement(String sql);

      5. 给?赋值

        使用setXxx方法(参数1,参数2)

        • 参数1为?的编号,由1开始,参数2为对应参数的值

        • pstmt.setString(1,username);

      6. 执行SQL语句,接受返回结果,不需要传递SQL语句

        rs = pstmt.executeQuery();

      7. 处理结果

      8. 释放资源

数据库连接池

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

  • 标准实现接口:DataSource

    • 获取连接:getConnection();
    • 归还连接:若数据库连接对象Connection由数据库连接池获取,则调用Connection.close()方法,则不会关闭连接而是归还连接到数据库连接池
  • 数据库连接池实现

  • (需要先导入MySQL驱动Jar包)

    • C3P0:

      1. 导入C3P0及其依赖的两个Jar包

        c3p0-"版本号".jar;mchange-commons-java-"版本号".jar

      2. 定义配置文件

        名称:c3p0.properties or c3p0-config.xml

        路径:src/目录之下

      3. 创建数据库连接池对象:ComboPooledDataSource

        DataSource ds = new ComboPooledDataSource();

      4. 获取连接:getConnection();

        Connection conn = ds.getConnection();

    • Druid:

      1. 导入Jar包:druid-"版本号".jar

      2. 定义配置文件:druid.properties

        配置文件名称任意,目录任意,需要手动指定加载

      3. 加载配置文件

        若将配置文件按直接放在src/目录下,可使用getclassloader方法

        Properties pro = new Properties();
        InputStream is = classname.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);
        
      4. 通过工厂类获取数据库连接池对象:DruidDataSourceFactory

        DruidDataSourceFactor.createDataSource(pro)

      5. 获取连接:getConnection()

        Connection conn = ds.getConnection();

JDBC Template

  • Spring框架对JDBC的封装

  • 使用步骤

    1. 导入Jar包(除自身的5个包外,还依赖于数据库连接池与Mysql的驱动包

    2. 创建依赖于数据源的JDBCTemplate对象

      JdbcTemplate template = new JdbcTemplate(DataSource);

    3. 调用JdbcTemplate的方法来完成CRUD操作

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

      template.update(sql,1,"例"):sql为定义的SQL语句,1,"例"为sql语句中?占位符参数表示的值

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

      • 手动实现

      在query方法中可以匿名内部类的形式实现RowMapper接口,重写mapRow方法,将每一行数据的值分别赋值给JavaBean的属性

      List<Emp> list = template.query(sql,new RowMapper<Emp>(){
          @Override
          public Emp map mapRow(ResultSet rs,int i) throws SQLException{
              Emp emp = new Emp();//创建emp对象
              int id = rs.getInt("id");//Result结果集每一条数据的属性取值
              String name = rs.getString("name");
              
              emp.setId(id);//对emp对象的各属性赋值
              emp.setName(name);
              
              return emp;//返回一个emp对象
          }
      });
      
      
      • 自动实现
      List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));//传入JavaBean的class属性,自动实现RowMapper接口
      

      * queryForMap():查询结果,将结果封装为map集合,列名为Key,结果值为value,封装为一个map集合,结果集长度仅为1,

      * queryForList():查询结果,将结果封装为List集合,将每一条记录封装为map集合,再将Map集合装载到List集合中

      * queryForObject():查询结果,将结果封装为对象,一般用于聚合函数的查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值