JDBC学习笔记

JDBC学习笔记大全

概念 JDBC Java Database Connection Java操作数据库


JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。
各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套
接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

2. 快速入门:

步骤:
  1. 导入驱动jar包
  2. 复制到项目目录libs下
  3. add as library
  4. 注册驱动
  5. 获取数据库连接对象 Connection
  6. 定义sql语句
  7. 获取执行sql语句的对象Statement
  8. 执行sql, 接受返回结果
  9. 处理返回结果
  10. 释放资源

3. 详解各个对照

  1. DriverManager:驱动管理对象
  • 功能:
    1. 注册驱动
      static void registerDriver(Driver driver) 注册与给定的驱动程序 DriverManager 。
      写代码使用:Class.forName(“com.mysql.jdbc.Driver”);

    2. 获取数据库的连接:

      • 方法:static Connection getConnection(String url, String user, String password)
      • 参数:
      • url: 指定的连接路径
      • 语法:jdbc:mysql://ip地址(域名):端口/数据库名称?时间区域
      • 例子:
        • jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
        • user: 用户名
        • password: 密码
  1. Connection:数据库连接对象
    1. 功能:
      1. 获取执行sql的对象
        • Statement createStatement()
        • PreparedStatement prepareStatement(String sql)
      2. 管理事务
        1. 开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false即开启事务
        2. 提交事务:void commit()
        3. 回滚事务:void rollback()
      3. Statement:执行sql对象
        1. 执行sql
        2. boolean execute(String sql) 一般不使用
        3. int executeUpdate(String sql) :执行DML(insert,update,delete)语句、DDL(create,alter,drop)
          返回值是所影响的行数
        4. ResultSet executeQuery(String sql) 查询语句(DQL)
  • 增删改模板
Connection conn = null;
Statement stmt = null;
try{
       String sql = "insert into user values(20010002, 'lisi', '男')";
      //2. 获取connection 对象
       conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?serverTimezone=UTC", "root", "Zongmin1998");
       //3. 获取sql statement 对象
       stmt = conn.createStatement();
       int count = stmt.executeUpdate(sql);
       System.out.println(count);
       if (count>0){
            System.out.println("添加成功");
         }else{
             System.out.println("添加失败");
            }
        }finally {
            if(stmt!=null){
                try {
                    stmt.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }

        }
  1. ResultSet:结果集对象,封装查询结果
    1. next(): 游标向下移动一行,如果返回flase表示没有数据了,如果是true则有数据
    2. getXxx(参数): 获取数据
      • Xxx代表数据类型 如int getInt() String getString()
        • 参数:
          1. int:列的编号 如getString(1) 获取第一列的值
          2. String:列的名称 如getString(“name”) 获取名称为name的列的值
  • 注意:
    • 使用步骤:
      1. 游标向下一行
      2. 判断是否有数据
      3. 获取数据
      //判断是否到末尾
      while (result.next()){
      String s1 = result.getString(1);
      String s2 = result.getString(2);
      String s3 = result.getString(3);
      System.out.println(s1+"----"+s2+"----"+s3);
      }

      • 练习
        • 需求
          1. 通过键盘录入用户名和密码
          2. 判断用户是否登录成功
            • select * from user where username = “” and password = “”;
            • 如果这个sql查询成功,则返回成功,否则,不成功
        • 步骤
          1. 创建数据库表user

  1. PreparedStatement:
    1. sql 注入问题: 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接

      1. 输入用户随便
      2. select * from user where username = ‘sdsadafe’ and password = ‘password’ or ‘a’ = ‘a’
    2. 解决sql注入问题: 使用PreperStatement对象来解决

    3. 预编译的sql: 使用?作为占位符

    4. 步骤:

      1. 导入驱动jar包
      2. 注册驱动
      3. 获取数据库连接对象 Connection
      4. 定义sql语句
        • 定义sql用占位符:select* from user where username = ? and password = ?;
      5. 获取执行sql语句的对象PrepereStatement Connection.prepereStatement(String sql)
      6. 给?赋值:
        • 方法:setXxx(参数1,参数2)
          • 参数1:?的位置
          • 参数2:?的值
      7. 执行sql, 接受返回结果,不需要传递sql语句
      8. 处理返回结果
      9. 释放资源
  • 注意:后期都用PrepereStatement对象来完成sql的所有操作
抽取JDBC工具类: JDBCUtils
  • 目的:简化书写
  • 分析:
    1. 注册驱动
    2. 抽取一个方法连接对象
      • 需求:不想传递参数,保证工具类的通用性。
      • 解决:配置文件
        jdbc.properties
        url=
        user=
        password=
    3. 抽取一个方法释放资源

JDBC控制事务

  1. 事物:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么一起成功,要么一起失败
  2. 操作:
    1. 开启事务
    2. 提交事物
    3. 回滚事务
  3. 使用Connection对象来管理事务
    • 在执行sql之前开启事务
    • setAutoComit(false)
    • 提交事务:commit():当所有的sql都执行完成后提交事务
    • 回滚事务
      • 在catch(){} 中回滚事务

数据库连接池

  • 概念:其实就是一个容器(集合),存放数据库连接的容器
    当系统初始化好后,容器就被创建,容器中会口语一些连接对象,当用户访问时,
    会从连接池中获取对象,当用户离开后,刚连接对象放回连接池

  • 好处:

    1. 节省资源
    2. 用户访问高效
  • 实现:

    1. 标准接口:DataSource java.sql包下
      1. 方法:
        • 获取连接:getConnection()
        • 归还连接:如果连接对象Connection是从连接池中节能的,
          那么调用close()方法,则不会关闭连接对象,而是归还连接
    2. 一般我们不去实现它,有数据库厂商来实现
      1. C3P0: 数据库连接池技术
      2. Druid:数据库国连接池技术实现, 由阿里巴巴提供的
  • C3P0: 数据库连接池技术

    • 步骤:
      1. 导入jar包:c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
      2. 定义配置文件
        • 名称:c3p0.properties 或者 c3p0-config.xml
        • 路径:直接将文件放在src目录下即可
      3. 创建核心对象:数据库连接池对象 CombopooleDataSourse
      4. 获取连接:getConnection
  • Duid: 数据库连接技术

    • 步骤
      1. 导入jar包:druid-1.0.9.jar mysql-connnector-java-8.0.11.jar
        2. 定义配置文件
        * 名称:druid.properties(可以任意设置
        * 内容:
        driverClassName=com.mysql.cj.jdbc.Driver
        url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&user=root&password=Zongmin1998
        initialSize=5
        maxActive=10
        maxWait=3000
        * 路径:直接将文件放在src目录下即可
        3. 加载配置文件
        4. 获取连接对象:通过一个工厂类来获取 DruidDataSourceFactory
        5. 获取连接:getConnection
    • 定义工具类
      1. 定义一个JDBCUtils
      2. 提供静态代码块加载文件,初始化连接池对象
      3. 提供方法
        1. 获取连接方法:通过数据库连接池获取连接
        2. 释放连接
        3. 获取连接池方法

Spring JDBC:JDBC Template

  • Spring框架对JDBC的简单封装。提供了一个JDBC Template对象简化对JDBC开发
  • 步骤:
    1. 导入jar包
    2. 创建JdbcTemplate对象。依赖于数据源DataSource
      • JdbcTemplate template = new JdbcTemplate(ds);
    3. 调用JdbcTemplate的方法来完成CRUD的操作
      • update(): 执行DML语句。增删改语句
      • queryForMap(): 查询结果,并将结果封装成map集合
        • 注意这个方法查询的结果集长度只能为1, 将列名作为key,将值作为value,并封装成一个map集合
      • queryForlist(): 查询结果,并将结果封装成list集合
        • 注意:将每一条记录封装成一个map集合,再将map集合封装到list集合中
      • query(): 查询结果,并将结果封装为JavaBean对象
        • query的参数:RowMapper
          • 一般使用BeanPropertyRowMap实现类。可以完成数据到JavaBean的自动封装
          • new BeanPropertyRowMap<类型>(类型.class)
      • queryForObject: 查询结果,并将结果封装为对象
        • 一般用于聚合函数的查询
    4. 练习:
      • 需求:
        1. 修改数据
        2. 添加一条记录
        3. 删除刚刚添加的记录
        4. 查询id为1的记录,将其封装为map集合
        5. 查询所有记录,将其封装为list集合
        6. 查询所有记录, 将其封装成为Emp对象
        7. 查询总记录数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值