WEB03_Day01(中)-MySQL运行机制、JDBC

一、MySQL运行机制(扩展)

  客户端和MySQL服务端建立连接,连接通讯机制:“半双工”,指的是某一个时刻,要么发送数据,要么接收数据,不能同时进行操作执行。当用户书写SQL语句发送给MySQL服务端,如果开启了缓冲功能,并且之前做过一致的查询功能时,则直接从查询缓存中命中查询结果,返回给客户端查询结果。如果没有开启查询缓存功能或者当前是一个新的查询业务逻辑时,执行时会进入(解析器、解析树、预处理器、新解析树)对SQL语句进行词法和语法的分析。当正确的情况,会通过查询优化器生成执行计划,然后通过查询执行引擎和存储引擎进行交货,从数据库中获取当前需要进行查询的数据结果,会将该结果返回给客户端,如果开启了查询缓存,那么同样的也会在查询缓存中进行存储一份。

二、JDBC

2.1 概述:

  JDBC:Java DataBase Connectivity(Java数据库连接),JDBC是Sun公司提供的一套API,使用JDBC技术可以实现Java和数据库之间的交互。

  Java程序员,在未来工作过程中,可能项目会用到MySQL、Oracle、SQL Server等等数据库,不同的数据库厂商提供不同的链接方案,为了避免程序员需要链接不同的数据库时都需要学习新的API使用,所以SUN公司设计了JDBC技术,该接口对外暴露了各大数据库厂商需要实现的业务逻辑,只需要程序员调用JDBC中所提供的相关API方法就可以链接不同的数据库。

2.2 使用JDBC技术连接MySQL数据库

  • 创建Maven项目,打包方式为jar包

  • 在项目的pom.xml文件中需要进行导入MySQL的驱动包

 <!-- 连接MySQL数据库的依赖 -->
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.15</version>
 </dependency>
  • 在项目下创建cn.tedu.jdbc包,包下创建JdbcTest01

    • 加载驱动

    • 获取连接对象

    • 创建命令对象

    • 执行sql

    • 关闭资源

 package cn.tedu.jdbc;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.Statement;
 
 public class JdbcTest01 {
 
  public static void main(String[] args) throws Exception{
  /*
  * JDBC连接MySQL步骤:
  * 1.加载驱动
  * 2.获取连接对象
  * 3.创建命令对象
  * 4.执行sql
  * 5.关闭资源
  */
  /*
  * 1.加载驱动
  * MySQL是一个Oracle厂商所提供的应用程序,
   * 需要让JVM加载该应用程序,所以当前第一步需要
   * 进行加载驱动,在5.*以后的版本以后可以省略不写
  */
  Class.forName("com.mysql.cj.jdbc.Driver");
 
  /*
  * 2.获取连接对象
  * url组成部分说明:
  * localhost表示本地ip
  * 3306表示mysql服务器的端口号
  * URL和参数拼接参数使用?
   * 参数与参数之间拼接使用&
  */
  Connection conn =
  DriverManager.getConnection("jdbc:mysql://localhost:3306/newdb3?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true",
  "root","root");
 
  /*
  * 3.获取命令对象
  * Statement命令对象提供了可以进行执行sql的execute()方法
   * 该方法的返回值是一个boolean类型的数据,
   * 如果返回值为true,表示执行的是一个查询的sql语句
   * 如果返回值为false,表示执行的是一个增删改的sql语句
  *
  */
  Statement stat = conn.createStatement();
 
  /*
  * 4.执行sql
  */
  boolean b = stat.execute("SELECT 'Hello World!!!'");
 
  System.out.println(b);
 
  //5.关闭资源
  conn.close();
 
 
  }
 
 }
  • 测试结果:

 true

2.3 经常出现的错误

  • 数据库的用户名或密码错误

 Access denied for user 'root'@'localhost' (using password: YES)
  • url格式不正确

 No suitable driver found for jdbc:mysql//localhost:
  • 驱动的类全限定名不正确

 java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Dirver
  • sql语句错误

 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELEC 'Hello World!!!'' at line 1

2.4 Statement命令对象执行SQL语句的方法

  • execute()该方法可以执行任意的sql语句,但是推荐使用该方法执行数据库相关的和数据表相关的sql语句

  • executeUpdate()该方法可以进行执行增删该的sql语句

  • executeQuery()该方法可以进行执行查询的sql语句

2.5 单元测试

  • 定义:单元测试就是对软件中的最基本的模块进行测试。

  • 应用场景:项目中往往会涉及到不同业务逻辑之间的调用,后期的项目说写会进行分包分类,不同的包中类书写不同业务功能的代码逻辑,然后不同类中的代码逻辑片段需要实现调用。每当实现其中一个业务逻辑时往往不会继续去书写后面需要完成的逻辑,而是需要对于当前所书写的逻辑加以测试,在确保当前业务逻辑正确的情况下,再继续开发后面的业务逻辑。

使用步骤:

  • 在项目的pom.xml文件中导入junit的jar包

<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.13</version>
 </dependency>
  • 新建单元测试包及其测试类

  • 使用junit工具包中所提供的的相关注解

package cn.tedu.test;
 
 import org.junit.Test;
 
 /**
   * 单元测试
  * @author Administrator
  *
  */
 public class MyTest {
 
  @Test
  public void insert() {
  System.out.println("插入数据");
  }
 
  @Test
  public void select() {
  System.out.println("查询数据");
  }
 
  @Test
  public void update() {
  System.out.println("更新数据");
  }
 
  @Test
  public void delete() {
  System.out.println("删除数据");
  }
 
 }

2.6 增加数据

package cn.tedu.jdbc;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.Statement;
 import org.junit.Test;
 
 public class JdbcTest02 {
 
  /**
   * 新增数据
  */
  @Test
  public void insert() throws Exception{
  System.out.println("开始新增数据...");
  //1.省略加载驱动
  //2.获取连接对象
  String url = "jdbc:mysql://localhost:3306/newdb3?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
  String userName = "root";
  String password = "root";
  Connection conn = DriverManager.getConnection(url,userName,password);
  //3.创建命令对象
  Statement stat = conn.createStatement();
  //4.执行sql 建议sql中关键字大写
  String sqlStr = "INSERT INTO emp(empno,ename,job,sal) VALUES(12,'包佳奇','人事',1000)";
  //返回值为执行sql后受影响的行数
  int nums = stat.executeUpdate(sqlStr);
  System.out.println(nums);
 
  //5.关闭资源
  conn.close();
  System.out.println("结束新增数据!!!");
  }
 
 }

测试结果:

开始新增数据...
 1
 结束新增数据!!!

面试题补充:

 /**
  * 面试题1.0
  * 请写一个方法 可以用来判断传递进的Char字符
  * 在被判断的String中存在的次数
  * abcbb
  *
  * 面试题2.0
  * 可以判断一个字符或一个字符串在 被判断的字符串中存在的次数
  * str中存在的次数
  * xabcabcabc   "abc"
  *
  * */
 public class Test {
 
  public static void main(String[] args) {
 // int count= GetCharCount("ascss", 's');
 // System.out.println(count);
  int count= GetStrCount("xabcabcabc", "x");
  System.out.println(count);
  }
  /**
  *   str 代表被判断的字符串
  *   c   代表判断字符串
  *         返回值 int 类型
  * */
  public static int GetStrCount(String str,String c)
  {
  //1.判空
  if(str==null||c==null)  return 0;
  //2.将被判断的字符串转换为char数组
  char[] strArr = str.toCharArray();
  //获取被判断的字符串长度
  int strArrLength = strArr.length;
  //外层循环是当前被判断的字符数组长度
  int count=0;
  for (int i = 0; i < strArr.length; i++) {
  StringBuilder builder=new StringBuilder();
  //内层就是判断的字符长度
  for (int j = 0; j < c.length(); j++) {
  //防止内存溢出
  if ((i+j)>=strArrLength) {
  //终止循环
  break;
  }
  builder.append(strArr[i+j]);
  }
  //
  if (builder.toString().equals(c)) {
  count++;
  }
  }
  return count;
 
  }
 
  /**
  * str 代表需要被判断的字符串内容
  * c   代表以什么字符进行判断
  * 返回值 代表当前 c在str中存在的次数 , 如果返回 为-1 则没有字符内容
  * */
  public static int GetCharCount(String str,char c)
  {
  //1.判空
  if(str==null||c ==' ') return -1;
  //2.将当前str转换成Char[]
  char[] strArr= str.toCharArray();
  int cLength =1;
  //如果当前 字符的长度 大于StrArr的长度
  if(cLength>strArr.length)
  {
  //返回-1
  return -1;
  }
  //3.循环遍历 并进行判断 和计数
  int count=0;
  for (int i = 0; i < strArr.length; i++) {
  //依次判断数组中的元素 是否有与c 相等的
  if (strArr[i]==c) {
  //计数
  count++;
  }
  }
  if (count ==0) {
  count=-1;
  }
  return count;
  }
 }
 
 
posted @ 2021-09-10 16:10  Coder_Cui  阅读(471)  评论(0编辑  收藏  举报