码迷,mamicode.com
首页 > 数据库 > 详细

JDBC连接数据库

时间:2020-07-11 09:17:46      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:本质   服务器   reg   word   类加载   lan   字符   resultset   本机   

JDBC

  • 概念:Java DataBase Connectivity,java数据库连接,java语言操作数据库

  • JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口.各个数据库产商去实现这个接口,提供数据库确定jar包.这套接口编程,真正执行的是驱动jar包的实现类

  • 快速入门

    • 步骤
      1. 将驱动jar包导入
        1. 复制jar包到lib目录下(目录自定义)
        2. 右键->Add as library
      2. 注册驱动
      3. 获取数据库连接对象Connection
      4. 定义SQL语句
      5. 获取执行sql语句的对象Statement
      6. 执行sql,接收返回结果
      7. 处理结果
      8. 释放资源
  • 详解各个对象

    • DriverManager:驱动管理对象
      • 功能
        1. 注册驱动:告诉程序该使用哪一个数据库驱动jar包(在mysql-connection-java5.0之后可以不需要注册驱动)
          • static void registerDriver(Driver driver):注册用户给定的驱动程序DriverManager.
          • 写代码时使用:Class.forName("com.mysql.jdbc.Driver");将该类加载入内存.通过查看源码发现,在com.mysql.jdbc.Driver类中存在静态代码块.静态代码块在程序执行时自动执行,那么可以看到加载类时真正运行的是java.sql.DriverManager.registerDriver(new Driver());这句话
          static {
           try {
           java.sql.DriverManager.registerDriver(new Driver());
           } catch (SQLException E) {
           throw new RuntimeException("Can‘t register driver!");
           }
          }
          
        2. 获取数据库连接
          • static Connection getConnection(String url, String user, String password):尝试建立与给定数据库URL的连接。
          • 参数
            • url:指定连接的路径
              • 语法:jdbc : mysql://ip地址或域名:端口号/数据库名称
            • user:用户名
            • password:密码
            • 细节:如果连接的是本机的mysql服务器,并且mysql的端口是默认的3306,那么url可以简写为jdbc : mysql:///数据库名称
    • Connection:数据库连接对象
      • 功能
        1. 获取执行sql的对象
          • Statement createStatement()
          • PreparedStatement prepareStatement(String sql)
        2. 管理事务
          • 开启事务:void setAutoCommit(boolean autoCommit)调用该方法,设置参数为false,即开启事务
          • 提交事务:void commit()
          • 回滚事务:void rollback()
    • Statement:执行sql的对象
      1. 执行sql
        1. boolean execute(String sql):可以执行任意的sql.
        2. int executeUpdate(String sql):执行DML(insert,delete,update),DDL(create,alter,drop)语句,返回值是影响的行数
        3. ResultSet excuteQuery(String sql):执行DQL语句(select)
          • 返回一个结果集对象
    • ResultSet:结果集对象(也是一个资源,最终要释放)
      • 封装查询结果.
        • boolean next():游标向下移动一行,判断当前是否是最后一行末尾(是否有数据),如果是,则返回false(没有数据),如果不是则返回true(有数据)
        • getXxx(参数):获取数据
          • Xxx:代表数据类型,如int getInt()
          • 参数
            • int:代表列的编号,从1开始
            • String:代表列的名称.
        • 使用步骤
          1. 游标向下移动一行(游标最初位于第一条数据的上方)
          2. 判断是否有数据
          3. 获取数据
         //循环判断游标是否是最后一行末尾
        while (resultSet.next()){
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            int balance=resultSet.getInt("balance");
            System.out.println("id---"+id+"---name---"+name+"---balance---"+balance);
        }
        
      • 练习:定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回
        1. 定义一个employee类
        2. 定义一个方法,public List<Emp> findAll()
        3. 实现方法 select * from emp;
    • PreparedStatement:执行sql的对象
      • sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串拼接,会造成安全性问题
        • 输入随便,密码输入a‘ or ‘a‘ = ‘a,成功查询
      • 解决sql注入问题,使用PrepearedStatement对象
      • PreparedStatement:用于执行预编译的SQL语句
      • 预编译SQL:参数使用?作为占位符
      • 使用方法
        • 定义sql语句时,SQL的参数使用?作为占位符,例如: select * from user where username = ? and password = ?
        • 获取执行sql的语句的对象(PreparedStatment):Connection.preparedStatment(String sql)
        • 给?赋值:setXxx(参数1,参数2)
          • 参数1:?的位置编号,从1开始
          • 参数2:?的值
        • 执行sql:接受返回结果,不需要传递SQL语句
      • 注意:后期都会使用PreparedStatment来完成增删改查的操作
        • 可以防止sql注入
        • 效率更高
  • 总结

    • 使用JDBC连接数据库的步骤
      1. 注册驱动:Class.forName("com.mysql.jdbc.Driver");
      2. 定义sql语句:String sql;
      3. 获取连接对象:DriverManager.getConnection("jdbc : mysql://ip地址或域名:端口号/数据库名称", "账户", "密码");
      4. 获取sql的执行对象:statement=connection.createStatement();
      5. 执行sql语句
        • statement.executeUpdate(sql); 执行DML(insert,delete,update),DDL(create,alter,drop)语句,返回值是影响的行数
        • statment.excuteQuery(sql):执行DQL语句(select),返回一个ResultSet结果集合
        • statment.excute(sql):执行所有的sql语句,返回boolean值
      6. 处理结果
        • 如果是遍历ResultSet,则循环判断resultSet.next(),封装一个对象,并使用集合接收

抽取JDBC工具类:JDBCUtils

  • 目的:简化书写
  • 分析
    1. 注册驱动
    2. 抽取一个方法获取连接
      • 不传递参数,使用配置文件jdbc.properties
    3. 抽取一个方法获取资源

JDBC控制事务

  1. 事务:一个包含多个步骤的业务操作,如果这个业务被事务管理,则这多个步骤要么同时成功,要么同时失败.
  2. 操作
    1. 开启事务
    2. 提交事务
    3. 回滚事务
  3. 使用Connection对象来管理事务
    1. 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数false,即开启事务
      • 在执行sql之前开启事务
    2. 提交事务:commit()
      • 当所有sql都执行完成后提交事务
    3. 回滚事务:rollback()
      • 在catch中回滚事务(异常处理时写一个Exception,抛出一个大的异常,无论出现什么情况都要回滚事务)

JDBC连接数据库

标签:本质   服务器   reg   word   类加载   lan   字符   resultset   本机   

原文地址:https://www.cnblogs.com/acknowledge/p/13282159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!