JDBC基础

一,JDBC概述

1.为什么要使用JDBC

1.1没有JDBC

1.2有了JDBC后

2.JDBC的概念

* A: JDBC概念和数据库驱动程序
* a: JDBC概述
* JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,
可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
* JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
* JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,
设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
* 我们使用的是mysql的驱动mysql-connector-java-5.1.39-bin.jar
* b: 总结
* JDBC是java提供给开发人员的一套操作数据库的接口

* 数据库驱动就是实现该接口的实现类

* B: JDBC原理
* a: 描述
* Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动
* DBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!
每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

2.1.JDBC和数据库驱动的关系

  • 接口(JDBC)与实现(驱动jar包)的关系

二,开发第一个JDBC程序

2.开发第一个JDBC程序

3.1开发步骤

  • 注册驱动(要引入驱动jar包)

  • 获得连接

  • 创建执行sql语句的对象

  • 执行sql语句,处理结果

  • 关闭资源

3.2代码实现

3.2.1 数据库的准备

3.2.2代码实现

      public static void main(String[] args) throws SQLException {        //注册驱动        DriverManager.registerDriver(new Driver());        String url = "jdbc:mysql://localhost:3306/day10";        String user = "root";        String password = "123456";        //获得连接        Connection connection = DriverManager.getConnection(url, user, password);        //创建执行sql语句对象        Statement statement = connection.createStatement();        //执行sql,处理结果        String sql = "select *from user";        ResultSet resultSet = statement.executeQuery(sql);        while (resultSet.next()) {            System.out.println(resultSet.getObject(1));            System.out.println(resultSet.getObject(2));            System.out.println(resultSet.getObject(3));            System.out.println(resultSet.getObject(4));                    }        //关闭资源        if(resultSet != null){            resultSet.close();                    }                if(statement  != null){            statement .close();        }                if(connection != null){            connection.close();        }        ​    }
  1. Decompiler

3.单元测试介绍

  1. 介绍:JUnit是一个Java语言的单元测试框架。属于第三方工具,一般情况下需要导入jar包,不过,多数Java开发环境 已经集成了JUnit作为单元测试工具

  2. 编写测试类,简单理解可以用于取代java的main方法

  3. 在测试类方法上添加注解@Test

  4. 注解修饰的方法要求:public void 方法名() {…} ,方法名自定义建议test开头,没有参数。

  5. 添加eclipse中集成的Junit库,鼠标点击“@Test”,使用快捷键“ctrl + 1”,点击“Add Junit …”

    ​ 结果:

  1. 使用:选中方法右键,执行当前方法;选中类名右键,执行类中所有方法(方法必须标记@Test)

  1. 常见使用错误,如果没有添加“@Test”,使用“Junit Test”进行运行,将抛异常

单元测试需要注意的地方:

三,JDBC API详解

1.java.sql.Drivermanager

1.1 registerDriver(Driver driver) ;注册驱动,Driver类中包含一个静态代码块

  static {    try {        java.sql.DriverManager.registerDriver(new Driver());    } catch (SQLException E) {        throw new RuntimeException("Can't register driver!");    }}
  • 翻阅源码发现,通过API的方式注册驱动,Driver会new两次,所有推荐这种写法:

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

1.2 getConnection(String url, String user, String password) ;与数据库建立连接

2.java.sql.Connection接口

  • 接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。

2.1createStatement() ;创建执行sql语句对象

2.2prepareStatement(String sql) ;创建预编译执行sql语句的对象

3.java.sql.Statement接口

  • 接口的实现在数据库驱动中

  • 操作sql语句,并返回相应结果对象

3.1 Statement; 执行sql语句对象

  • ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。

  • int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。

  • boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回的是ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;

4.java.sql.ResultSet接口

4.1封装结果集,查询结果表的对象

  • 提供一个游标,默认游 指向结果集第一行之前。

  • 调用一次next(),游标向下移动一行。

  • 提供一些get方法。

4.2ResultSet接口常用API

  • boolean next() ;将光标从当前位置向下移动一行

  • int getInt(int colIndex)以int形式获取ResultSet结果集当前行指定列号值

  • int getInt(String colLabel)以int形式获取ResultSet结果集当前行指定列名值

  • float getFloat(int colIndex)以float形式获取ResultSet结果集当前行指定列号值

  • float getFloat(String colLabel)以float形式获取ResultSet结果集当前行指定列名值

  • String getString(int colIndex)以String 形式获取ResultSet结果集当前行指定列号值

  • String getString(String colLabel)以String形式获取ResultSet结果集当前行指定列名值

  • Date getDate(int columnIndex); 以Date 形式获取ResultSet结果集当前行指定列号值

  • Date getDate(String columnName);以Date形式获取ResultSet结果集当前行指定列名值

  • void close()关闭ResultSet 对象

四.JDBC操作数据库练习

1.增删改查

  public class CrudDemo {​    // 查询id为1的用户​    @Test    public void fun01() throws ClassNotFoundException, SQLException {​        // 注册驱动        Class.forName("com.mysql.jdbc.Driver");​        String url = "jdbc:mysql://localhost:3306/web10";        String user = "root";        String password = "123456";        // 创建连接        Connection connection = DriverManager.getConnection(url, user, password);        // 创建执行sql语句对象        Statement statement = connection.createStatement();        // 执行sql语句,处理结果        String sql = "select *from user where id = 1";        ResultSet resultSet = statement.executeQuery(sql);​        while (resultSet.next()) {            System.out.println(resultSet.getInt("id"));            System.out.println(resultSet.getString("username"));            System.out.println(resultSet.getString("password"));            System.out.println(resultSet.getString("nickname"));​        }​        // 关闭资源​        if (resultSet != null) {            resultSet.close();        }​        if (statement != null) {            statement.close();        }​        if (connection != null) {            connection.close();        }​    }​    // 向user表插入一条数据 (null,"liliu","11111","老李")    @Test    public void fun02() throws ClassNotFoundException, SQLException {        // 1.注册驱动        Class.forName("com.mysql.jdbc.Driver");        // 2.创建连接        String url = "jdbc:mysql://localhost:3306/web10";        String user = "root";        String password = "123456";        Connection connection = DriverManager.getConnection(url, user, password);        // 3.创建执行sql语句的对象        Statement statement = connection.createStatement();        // 4.执行sql语句,处理结果        String sql = "insert into user values(null,'liliu','111111','老李')";        int i = statement.executeUpdate(sql);        // 5.关闭资源​        if (statement != null) {            statement.close();        }​        if (connection != null) {            connection.close();        }​    }​    // 把id为4的用户密码改成666666    @Test    public void fun03() throws ClassNotFoundException, SQLException {​        // 1.注册驱动        Class.forName("com.mysql.jdbc.Driver");        // 2.创建连接        String url = "jdbc:mysql://localhost:3306/web10";        String user = "root";        String password = "123456";​        Connection connection = DriverManager.getConnection(url, user, password);        // 3.创建执行sql语句对象​        Statement statement = connection.createStatement();        // 4.执行sql语句,处理结果        String sql = "update user set password = '666666' where id = 4";        statement.executeUpdate(sql);        // 5.关闭资源​        if (statement != null) {            statement.close();        }​        if (connection != null) {            connection.close();        }​    }​    // 把id为4的用户删除​    @Test    public void fun04() throws ClassNotFoundException, SQLException {        // 1.注册驱动        Class.forName("com.mysql.jdbc.Driver");        // 2.创建连接        String url = "jdbc:mysql://localhost:3306/web10";        String user = "root";        String password = "123456";​        Connection connection = DriverManager.getConnection(url, user, password);        // 3.创建执行sql语句对象        Statement statement = connection.createStatement();        // 4.执行sql语句        String sql = "delete from user where id = 4";        statement.executeUpdate(sql);        // 5.关闭资源​        if (statement != null) {            statement.close();        }​        if (connection != null) {            connection.close();        }​    }​}

2.JDBC工具类的抽取

  • 创建配置文件,配置文件在src目录下,扩展名是properties

​ 配置文件:

  • 工具类实现

      public class JdbcUtils {    static String url;    static String user;    static String password;    static String driver;    //注册驱动    static{    try {        //读取配置文件        //InputStream is = new File=InputStream("src/jdbc.properties");        //InputStream is = JdbcUtil.class.getClassLoader.getResourceAsStream("jdbc.properties");        //Properties properties = new Properties();        //properties.load(is);        //url = properties.getProperty("url");        //user = properties.getProperty("user");        //password = properties.getProperty("password");        //driver = properties.getProperty("driver");        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");        url = bundle.getString("url");        user = bundle.getString("user");        password = bundle.getString("password");        driver = bundle.getString("driver");        Class.forName(driver );    } catch (Exception e) {        e.printStackTrace();    }            }​    //获得连接    public static Connection getConnection() throws SQLException{    Connection connection = DriverManager.getConnection(url, user, password);​        return connection;                }        //关闭资源​    public static void release(ResultSet resultSet,Statement statement,Connection connection){        if(resultSet != null){        try {            resultSet.close();        } catch (SQLException e) {            e.printStackTrace();        }    }            if(statement != null){        try {            statement.close();        } catch (SQLException e) {            e.printStackTrace();        }​    }            if(connection != null){                  try {                connection.close();            } catch (SQLException e) {                e.printStackTrace();            }        }      }    }

五,实现一个用户登录功能

1.需求

在控制台输入用户名和密码,查询数据库,如果数据库存在当前用户,显示登录成功!

如果数据库不存在当前用户,显示登录失败!

3.代码实现

  • Client.java

  public class Client {        public static void main(String[] args) {                try {            Scanner scanner = new Scanner(System.in);            System.out.println("请输入用户名:");            String username = scanner.nextLine();                        System.out.println("请输入密码:");            String password = scanner.nextLine();                        DoLogin service = new DoLogin();            User user = service.findUser(username,password);            if(user != null){                System.out.println("登录成功!");            }else{                System.err.println("密码错误!");            }        } catch (Exception e) {            e.printStackTrace();        }    }}
  • DoLogin

  public class DoLogin {​    public User findUser(String username, String password) {        Connection connection = null;        User user = null;        PreparedStatement statement = null;        ResultSet resultSet = null;        try {            connection = JdbcUtils.getConnection();            String sql = "select *from user where username =? and password =?";                        statement = connection.prepareStatement(sql);                        statement.setString(1, username);            statement.setString(2, password);                        resultSet = statement.executeQuery();                                    while (resultSet.next()) {                  user = new User();                int id = resultSet.getInt("id");                String username1 = resultSet.getString("username");                String password1 = resultSet.getString("password");                String nickname = resultSet.getString("nickname");                                user.setId(id);                user.setUsername(username1);                user.setPassword(password1);                user.setNickname(nickname);                                            }        } catch (SQLException e) {            e.printStackTrace();        }finally{            JdbcUtils.release(resultSet, statement, connection);        }                    return user;    }}

六,SQL注入问题解决:preparedStatement

1.preparedStatement概述

预编译对象, 是Statement对象的子类。

特点:

  • 性能要高

  • 会把sql语句先编译,格式固定好,

  • sql语句中的参数会发生变化,过滤掉用户输入的关键字。

2.用法

2.1通过connection对象创建
  • prepareStatement(String sql) ;创建prepareStatement对象

  • sql表示预编译的sql语句,如果sql语句有参数通过?来占位

2.2过setxxx方法来指定参数
  • setxxx(int i,Obj obj); i 指的就是问号的索引(指第几个问号,从1开始),xxx是类型(eg:int,String,Long)

2.3实例
          String sql = "select *from user where username =? and password =?";        //创建prepareStatement        statement = connection.prepareStatement(sql);        //设置参数        statement.setString(1, username);        statement.setString(2, password);                resultSet = statement.executeQuery();

作业

1.使用JDBC实现对数据库的增删改查操作。

2.封装JDBCUtils

3.登录案例

JDBC概念和数据库驱动程序操作基础相关推荐

  1. JDBC完成对数据库数据操作(增,删,改,查)

    写在前面 虽然在实际开发中关于这些操作都不会让我们去写,但是掌握这代码的逻辑编写对我们使用框架有一定的帮助. 学习JDBC:请关注专栏--JDBC学习--内容详细 相关文章: JDBC总述 JDBC连 ...

  2. jdbc连接oracle查询数据库,JDBC连接Oracle数据库,并操作数据库,查询表

    JDBC连接Oracle数据库 protected void doPost(HttpServletRequest request, HttpServletResponse response) thro ...

  3. mysql er概念_数据库ER图基础概念

    ER图分为实体.属性.关系三个核心部分.实体是长方形体现,而属性则是椭圆形,关系为菱形. ER图的实体(entity)即数据模型中的数据对象,例如人.学生.音乐都可以作为一个数据对象,用长方体来表示, ...

  4. 【数据库设计】概念设计-数据库ER图基础概念

    原文链接 : http://blog.csdn.net/belen_xue/article/details/52763629 ER图分为实体.属性.关系三个核心部分.实体是长方形体现,而属性则是椭圆形 ...

  5. JDBC操作1:实现对数据库crud操作

    目录 1. JDBC概念 1.1 什么是JDBC 1.2 JDBC实现形式 1.3 jdbc操作API介绍 1.4 jdbc操作步骤(固定) 2. JDBC实现对数据库crud操作 2.1 第一步 加 ...

  6. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  7. 【JDBC】JDBC 简介 ( JDBC 概念 | JDBC 本质 | 使用 JDBC 操作数据库的好处 | JDBC 提供的 API 组件 )

    文章目录 一.JDBC 概念 二.JDBC 本质 三.使用 JDBC 操作数据库的好处 四.JDBC 提供的 API 组件 一.JDBC 概念 JDBC 全称 Java DataBase Connec ...

  8. 数据库应用——MySQL基础知识和操作数据库

    这里写目录标题 初识MySQL 什么是数据库 数据库分类 MySQL简介 安装MYSQL win10安装 安装SQLyog 连接数据库 linux安装 使用Navicat Premium连接数据库 操 ...

  9. Java -- JDBC 学习--通过Statement进行数据库更新操作

    通过 JDBC 向指定的数据表中插入一条记录. 1. Statement: 用于执行 SQL 语句的对象 1). 通过 Connection 的 createStatement() 方法来获取 2). ...

  10. JDBC数据库查询操作

    以下是按正常的数据库查询操作(没有做优化),代码如下: package com.test.main;import java.sql.Connection; import java.sql.Result ...

最新文章

  1. python视频延迟严重_【Python】改善 VideoCapture 的影像延迟
  2. grub-和grub-troubleshootting
  3. java代码如何能运行起来_Java代码如何运行
  4. 用Javascript隐藏超级链接的真实地址
  5. 正在被巨大数据中心吞噬的全球电力,谷歌脸书和比特币的“源”罪
  6. HTML基础-张晨光-专题视频课程
  7. windows 下 latex graphviz 字体设置
  8. Python爬虫要违法了吗?小编告诉大家:守住规则,大胆去爬
  9. 前端输入框错误提示_WEB/APP开发基础之旅--前端、服务器端、数据库综合开发案例...
  10. 基于ASP.NET AJAX技术开发在线RSS阅读器(下篇)
  11. 得力考勤机excel密码_考勤机
  12. MacBook M1芯片 安装Centos8 教程(无界面安装)
  13. mermaid与flowchart.js绘制流程图分支结构试验
  14. 解决无法下载/502 com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+
  15. mysql存储过程算四分位
  16. 微信域名防拦截的最新方案,域名防举报投诉原理
  17. AI时代的产品经理,应该注意什么?
  18. SQL笔记——嵌套查询
  19. Ubuntu系统下安装Sailfish的SDK
  20. 大数据是什么?大数据可以做什么?大数据实际做了什么?大数据要怎么做?

热门文章

  1. flash 图片有描边 html,Flash遮罩制作线条逐渐显示的汽车轮廓动画效果
  2. 前端——》antdv根据拼音过滤select选择器的选项
  3. Visual Studio使用ILDasm反汇编工具查看托管模块
  4. 5.16 BScroll页面切换滑动失效,点击事件冒泡(未绑定click也会监听click),transition-group动画特例,BScroll未激活不允许任何事件调用,类的实例和对象
  5. 《工业设计史》第七章:艺术变革与现代设计
  6. 【第一讲】APK应用程序的解包、修改、编辑、打包及应用(转)
  7. SPSS卡方检验结果解读详解
  8. 学习微机原理与接口这一篇就够了
  9. 免费下载道客巴巴文档的方法
  10. 泛微OA中怎么导入html模板,如何在OA系统中设置模板标题