名词解释

数据库

  • 当前阶段学习数据库,主要学习的是如何对数据进行增删改查操作.

    SQL

    Structured Query Language: 结构化查询语言, 通过此语言让程序员和数据库软件进行交流

    DBMS

    DataBaseManagementSystem: 数据库管理系统(数据库软件)

  • 常见的几种DBMS:

    • MySQL: Oracle公司产品, 08年被Sun公司收购, 09年Sun公司被Oracle收购. 开源产品 , MaraDB实际上就是MySQL的一个分支使用方式和MySQL一样. 市占率排名第一
    • Oracle: Oracle公司产品, 闭源产品 ,性能最强 价格最贵, 市占率排名第二
    • SQLServer: 微软公司产品, 闭源产品 , 市占率第三
    • DB2: IBM公司产品
    • SQLite: 轻量级数据库, 安装包几十K ,只具备最基础的增删改查功能. :::info 以下了解即可,实际项目中其实都是直接建立依赖,使用框架即可 :::

      JDBC

  • 定义:JavaDataBaseConnectivity: Java数据库链接

  • 学习JDBC主要学习的就是如何通过Java语言和MySQL数据库进行链接并执行SQL语句.
  • JDBC是Sun公司提供的一套专门用于Java语言和数据库进行链接的API(Application Programma Interface应用程序编程接口)
  • 使用JDBC的原因 : Sun公司为了避免Java程序员,每一种数据库软件都学习一套全新的方法,通过JDBC接口将方法名定义好, 让各个数据库厂商根据此接口中的方法名写各自的实现类(就是一个jar文件, 称为数据库的驱动) ,这样Java程序员只需要掌握JDBC接口中方法的调用,即可访问任何数据库软件.

    链接数据库

  1. 创建Maven工程
  2. 在工程的pom.xml文件中 添加MySQL驱动的依赖坐标
  3. 创建cn.tedu.Demo01.java文件 添加以下代码
  4. 建立连接步骤 :

    1. 创建链接对象 异常抛出
    2. 创建执行SQL语句的对象
    3. 执行SQL语句 execute执行
    4. 关闭资源
      1. //1.创建链接对象 异常抛出
      2. Connection conn =
      3. DriverManager.getConnection("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false",
      4. "root","root");
      5. System.out.println("链接对象:"+conn);
      6. //2.创建执行SQL语句的对象
      7. Statement s = conn.createStatement();
      8. //3.执行SQL语句 execute执行
      9. s.execute("create table jdbct1(age int)");
      10. //4.关闭资源
      11. conn.close();
      12. System.out.println("执行完成!");

      Statement接口的方法

      Statement是执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。
  5. s.execute(“所有的SQL语句“);

  • 此方法可以执行任意SQL语句, 但建议执行DDL(数据库相关和表相关的SQL语句)
  1. int row = s.executeUpdate(“增删改的SQL语句“);
  • 此方法用来执行增删改相关的SQL语句, 返回值表示生效的行数
  1. ResultSet rs = s.executeQuery(“查询的SQL语句“);
  • 此方法用来执行查询相关的SQL语句,返回值ResultSet叫做结果集对象,查询到的数据都装在此对象中
  1. 遍历结果集对象
    1. while (rs.next()){
    2. //获取游标指向的这条数据的某个字段的值,通过字段名获取
    3. String name = rs.getString("name");
    4. double sal = rs.getDouble("sal");
    5. //通过查询回来数据的位置获取数据
    6. String name=rs.getString(1);
    7. double sal=rs.getDouble(2);
    8. System.out.println(name+"\t"+":"+sal+"\t");
    9. }

    DBCP

  • DataBaseConnectionPool, 数据库连接池
  • 作用: 将连接重用,从而提高执行效率
  • image.png

    创建连接

    1. public class DBUtils {
    2. private static DruidDataSource ds;
    3. static {
    4. /*创建连接池对象*/
    5. ds=new DruidDataSource();
    6. /*设置数据库连接信息 URL 用户名 ,密码*/
    7. ds.setUrl("jdbc:mysql://localhost:3306/empdb?
    8. characterEncoding=utf8&serverTimezone=Asia
    9. /Shanghai&useSSl=false");
    10. ds.setUsername("root");
    11. ds.setPassword("root");
    12. /*设置初始连接量*/
    13. ds.setInitialSize(3);
    14. /*设置最大连接量*/
    15. ds.setMaxActive(5);
    16. }
    17. public static Connection getCoon() throws SQLException {
    18. /*从连接池中获取连接 异常抛出*/
    19. Connection conn=ds.getConnection();
    20. System.out.println("连接对象:"+conn);
    21. return conn;
    22. }
    23. }
    24. //创建对象
    25. try (Connection coon=DBUtils.getCoon()) {
    26. //插入内容
    27. } catch (SQLException throwables) {
    28. throwables.printStackTrace();
    29. }

    PreparedStatement接口

    PreparedStatement接口是Statement接口的子接口,使用它的好处有三个
    一:简化代码,便于sql语句的书写.
    二:有效的禁止sql语句的注入,例如:用户名和密码,使用PreparedStatement接口的方法,可防止不正确的输入登陆成功,提高数据库系统的安全性.
    三:最大可能的提高了效率.

    预编译的SQL执行对象

  • 此对象可以将编译SQL语句的时间点提前,提前后可以将SQL语句逻辑部分提前锁死, 用户输入的内容将不能影响原有SQL语句的逻辑部分,从而解决了SQL注入的问题

  • 如果SQL语句中存在变量,则必须使用PreparedStatement,解决SQL注入问题, 而且可以提高开发效率(避免了拼接字符串)
  • 如果SQL语句中没有变量,可以使用Statement或PreparedStatement

    原理 :

  1. 创建SQL语句的时候,所有的变量用问号代替,然后每个问号对应自己的编号,会在后面重新赋值,
  2. 通过执行conn.prepareStatement(sql)方法,获取PreparedStatement对象,并且将sql语句传进去.
  • 编译SQL语句的时间点从之前执行时,提前到了创建对象时,好处是此时编译用户输入的内容还不在sql语句里面,只是将原有的语句进行编译,此时可以将原有的sql语句的逻辑部分锁死
  1. 把?替换成我要设置的值.通过小标去获取,
  • 此时替换时只能以值的形式添加到原有SQL语句中,因为逻辑部分已经编译好 已经锁死,这样用户输入的内容则不会影响原有SQL语句的逻辑。
  1. 通过调用ps.executeQuery()方法,执行SQL语句代码,获取返回值内容,对其进行操作.
    1. /*通过PreparedStatement解决SQL注入问题*/
    2. String sql ="select count(*) from user where username=? and password =?";
    3. /*编译SQL语句的时间点从之前执行时,提前到了创建对象时,
    4. 好处是此时编译用户输入的内容还不在sql语句里面,只是将原有的语句进行编译,
    5. 此时可以将原有的sql语句的逻辑部分锁死*/
    6. PreparedStatement ps= conn.prepareStatement(sql);
    7. /*把?替换成变量 1和2代表的是?的位置
    8. 此时替换时只能以值的形式添加到原有SQL语句中,因为逻辑部分已经编译好 已经锁死,
    9. 这样用户输入的内容则不会影响原有SQL语句的逻辑。*/
    10. ps.setString(1,username);
    11. ps.setString(2,password);
    12. //执行修改后的代码
    13. ResultSet rs =ps.executeQuery();