当前位置: 首页 > news >正文

JDBC8.0+

首先创建工程,导入jar包

1.注册驱动

//注册驱动//利用反射,较为灵活Class.forName("com.mysql.cj.jdbc.Driver");/**问题:会注册俩次驱动* 解决方案:只触发静态代码块* 触发静态代码块:*      类加载机制:类加载的时候,会触发静态代码块*      加载【class文件->jvm虚拟机的class对象】*      连接【验证(检查文件类型)->准备(静态变量默认值)->解析(触发静态代码块)】*      初始化(静态属性赋真实值)* 触发类加载:*      1.new关键字*      2.调用静态方法*      3.调用静态属性*      4.接口1.8 default默认实现*      5.反射*      6.子类触发父类*      7.程序的入口main*///DriverManager.registerDriver(new Driver());//换了个版本就不行了,不灵活//new Driver();

2.获取数据库连接

//1.
Connection conn = DriverManager.getConnection(url, username, password);
//2.Properties info = new Properties();info.put("user","root");info.put("password","root");Connection connection1 = DriverManager.getConnection();
//3.//参数:jdbc:数据库软件名://ip:port/数据库?key=value&key=value//例如: jdbc:mysql://localhost:3306/table1?user=root&password=rootConnection connection2 = DriverManager.getConnection();

核心属性

  1. 数据库软件所在的主机的ip地址:localhost | 127.0.0.1
  2. 数据库软件所在的主机的端口号 :3306
  3. 所连接的具体库
  4. 连接的账号 username
  5. 连接的密码 password
  6. 可选的信息

url        语法:[mysql,oracle]://ip地址|主机名:port端口号/数据库名

            例如:"jdbc:mysql://127.0.0.1:3306/table1"

3.定义sql

Statement stmt = conn.createStatement();
//conn是获取的数据库连接

作用:可以发送sql语句到数据库,并返回结果

SQL分类:

  • DDL(容器创建,修改,删除)
  • DML(插入,修改,删除)
  • DQL(查询)
  • DCL(权限控制)
  • TPL事务控制语言)
 int   executeUpdate(String sql);

执行DML、DDL语句
 返回值:DML语句影响的行数;DDL语句执行后,执行成功也可能返回0;

 ResultSet   executeQuery(sql);

执行DQL语句
 返回值:ResultSet结果集对象;

4.发送sql语句

//发送sql语句ResultSet resultSet = stmt.executeQuery(sql);

5.处理数据

boolean flag = resultSet.next();
//逐行获取数据
resultSet,get类型(String columnLabel | int columnIndex);//columnLabel :列名 如果有别名,写别名//columnIndex : 列的下角标获取  从左向右  从1开始

6.关闭资源

        //释放资源resultSet.close();stmt.close();conn.close();

优化

preparedstatment(利用预编译)

作用:防止sql注入攻击

  1. 编写SQL语句结果        不包含动态值的部分的语句,动态之部分使用占位符  ?  替代  注意:  ?  只能替代动态值
  2. 创建preparedStatement,并传入动态值
  3. 动态值  占位符  赋值  ?  单独赋值即可
  4. 发送SQL语句即可,并获取返回结构
        String sql = "select * from t_user where account = ? and password = ?;";PreparedStatement preparedStatement = connection.prepareStatement(sql);//单独的占位符进行赋值/*** 参数1:index  占位符的位置  从左向右数 从1开始  账号  ? 1* 参数2:object  占位符的值  可以设置为任何类型的数据,避免了我们拼接和类型更加丰富*/preparedStatement.setObject(1,account);preparedStatement.setObject(2,password);

练习(增删查改)

package com.ln.jdbc;import com.mysql.cj.util.DnsSrv;
import org.junit.Test;import java.sql.*;
import java.util.*;public class StatementUserLogin {@Testpublic void testInsert() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1","root","@950908964xLN,");String sql = "insert into 用户(uid,username,money) values (?,?,?);";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setObject(1,3);preparedStatement.setObject(2,"小美");preparedStatement.setObject(3,2000);int i = preparedStatement.executeUpdate();if(i>0){System.out.println("ok");}else{System.out.println("error");}preparedStatement.close();connection.close();}@Testpublic void testUpdate() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1","root","@950908964xLN,");String sql = "update 用户 set username=? where uid = ?;";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setObject(1,"小强");preparedStatement.setObject(2,"2");int i = preparedStatement.executeUpdate();if(i>0){System.out.println("修改成功");}else{System.out.println("修改失败");}preparedStatement.close();connection.close();}@Testpublic void testDelete() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1","root","@950908964xLN,");String sql = "delete from 用户 where uid=?;";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setObject(1,2);int i = preparedStatement.executeUpdate();if(i>0){System.out.println("ok");}else{System.out.println("error");}preparedStatement.close();connection.close();}@Testpublic void testSelect() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1","root","@950908964xLN,");String sql = "select uid,username,money from 用户;";PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet = preparedStatement.executeQuery();List<Map>list = new ArrayList<>();//装的是当前结果集列的信息对象(可以获得列的名称和数量)ResultSetMetaData metaData = resultSet.getMetaData();//有了这个之后可以水平遍历列int columnCount = metaData.getColumnCount();while(resultSet.next()){Map map = new HashMap();/**map.put("id",resultSet.getInt("uid"));map.put("username",resultSet.getString("username"));map.put("money",resultSet.getInt("money"));list.add(map);*///注意要从1开始,并且小于等于columnCountfor (int i = 1; i <= columnCount; i++) {//获取指定列下角标的值Object value = resultSet.getObject(i);//获取指定列下角标的列的名称String columnLabel = metaData.getColumnLabel(i);map.put(columnLabel,value);}list.add(map);}System.out.println("list = " + list);resultSet.close();preparedStatement.close();connection.close();}}

连接池

首先安装jar包

  1. 创建一个druid连接池对象
  2. 设置连接池参数
  3. 获取连接【通用方法,所有连接池都一样】
  4. 回收连接【通用方法,所有连接池都一样】
//连接池对象
DruidDataSource dataSource = new DruidDataSource();//设置参数
//必须  连接数据库驱动类的全限定符【注册驱动】 | url | user | password
dataSource.seUrl("jdbc:mysql://localhost:3306/tabe1");
dataSource.setUsername("账号");
dataSource.setPassword("密码");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
//非必须  初始化连接数量,最大的连接数量
dataSource.setInitialSize();//初始化连接数量
dataSource.setMaxActive();//最大的数量//获取连接
Connection connection = dataSource.getConnection();//回收连接
connection.close();

相关文章:

JDBC8.0+

首先创建工程&#xff0c;导入jar包 1.注册驱动 //注册驱动//利用反射&#xff0c;较为灵活Class.forName("com.mysql.cj.jdbc.Driver");/**问题&#xff1a;会注册俩次驱动* 解决方案&#xff1a;只触发静态代码块* 触发静态代码块&#xff1a;* 类加载机制&…...

聊聊常见的IO模型 BIO/NIO/AIO 、DIO、多路复用等IO模型

文章目录 一、前言1. 什么是IO模型2. 为什么需要IO模型 二、常见的IO模型1. 同步阻塞IO&#xff08;Blocking IO&#xff0c;BIO&#xff09;2. 同步非阻塞IO&#xff08;Non-blocking IO&#xff0c;NIO&#xff09;3. 异步非阻塞IO&#xff08;Asynchronous IO&#xff0c;AI…...

Linux- 网络编程初探

原始套接字&#xff08;Raw Socket&#xff09; 原始套接字&#xff08;Raw Socket&#xff09;是一种提供较低级别网络访问的套接字。通过使用原始套接字&#xff0c;应用程序可以直接发送或接收网络层如IP的数据包&#xff0c;或者传输层如TCP、UDP的段&#xff0c;而无需通…...

AVLoadingIndicatorView - 一个很好的Android加载动画集合

官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …...

我想设计一套游戏的奖励系统,有什么值得注意的?

游戏上&#xff1a; 游戏成就系统的价值 游戏中的成就可以延长游戏时间&#xff0c;让玩家不仅仅是将游戏通关&#xff0c;而是必须完成游戏内所有挑战及发现秘密&#xff0c;这些成就可以与游戏本身的目标一致&#xff0c;也可以独立于游戏的主要或次要目标之外&#xff0c;…...

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中非常有用的一个命令&#xff0c;cherry是樱桃的意思&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到…...

QT5|C++|通过创建子线程方式实现进度条更新

背景&#xff1a; 一开始是通过在主线程中写一个for循环&#xff0c;每次加1后睡眠1s进行进度条更新。但这样写的结果是 --> 无法动态显示进度条进度。后通过上一篇文章 [ QT5|C|通过信号槽机制实现进度条更新 ] 中的写信号槽机制实现。实现后 考虑了下有没有其他方式实现&a…...

基于mediasoup的webrtc server,性能压测时发现带宽利用率偏低(40%)

基于mediasoup的webrtc server&#xff0c;进行性能压测时发现&#xff0c;在1gbps的网络条件下&#xff0c;带宽利用率在40%(400Mbps)时&#xff0c;就会出现过高丢包率的(packet loss > 10%)的情况。这个结果是合理的吗&#xff1f;如果不合理&#xff0c;要如何提升性能&…...

Ubuntu Redis开机自启动服务

1. 建立service文件 sudo vim /etc/systemd/system/redis-server.service2. redis service文件 [Unit] DescriptionAdvanced key-value store Afternetwork.target Documentationhttp://redis.io/documentation, man:redis-server(1)[Service] Typenotify ExecStart/usr/bin/…...

Stm32_标准库_呼吸灯_按键控制

Stm32按键和输出差不多 PA1为LED供给正电&#xff0c;PB5放置按键&#xff0c;按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…...

MySQL作业:索引、视图、存储、函数

学生表&#xff1a;Student (Sno, Sname, Sex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score) …...

漫谈:C语言 C++ 所有编程语言 =和==的麻烦

这次不只是C语言很麻拐&#xff0c;是所有编程语言都很麻拐了。 赋值和比较是编程语言最基本的操作之二&#xff0c;C和所有类C语言都使用“”和“”来分别表示赋值和比较。 数学上等号“”是个单一的概念&#xff0c;含义是“相等”&#xff0c;左右两边是等价的&#xff0c;很…...

十五、异常(1)

本章概要 异常概念基本异常 异常参数 异常捕获 try 语句块异常处理程序终止与恢复 Java 的基本理念是“结构不佳的代码不能运行”。 改进的错误恢复机制是提高代码健壮性的最强有力的方式。错误恢复在我们所编写的每一个程序中都是基本的要素&#xff0c;但是在 Java 中它显得…...

Redis 哨兵模式搭建教程

一、介绍 本文实战搭建一主两从三哨兵&#xff0c;通过使用哨兵模式&#xff0c;可以有效避免某台服务器的 Redis 挂掉出现的不可用问题&#xff0c;保障系统的高可用。 本文通过虚拟机搭建的三台 Centos7 服务器进行测试&#xff0c;使用的 Redis 版本为 6.25。 二、准备环…...

【C++】gnustl_static 与 c++_shared 的区别

参考&#xff1a;GNU与cSTL的区别与联系-爱代码爱编程​ gnustl_static 与 c_shared 的区别&#xff1a; 不同版本的 STL TSL是一个与STL兼容的多线程支持库。 STLport是一个可移植、高度兼容的STL实现。 SGI STL是最早的STL实现之一&#xff0c;对STL的发展起到了重要的作用…...

怎样选择第三方检测机构获取功能测试报告?

数字化时代&#xff0c;软件给人们的生活带来了越来越多的便利&#xff0c;产品功能测试也成为了软件开发方在研发时的重要环节&#xff0c;这关系到用户使用产品的体验感。所以做好软件功能测试对把控产品质量有着很大影响&#xff0c;通过有效的功能测试能够发现系统潜在的问…...

【@PostConstruct、 @Autowired与构造函数的执行顺序】

PostConstruct、 Autowired与构造函数的执行顺序 一、PostConstruct介绍二、Spring框架中在bean初始化和销毁时候执行实现方式三、项目验证1.MyServiceImpl2.测试结果3. 项目源码 最近对同事代码进行codeReview时候发现用PostConstruct注解&#xff0c;特地对此注解执行顺序进行…...

用vite搭建vue3+ts项目

一、环境搭建 1&#xff1a;首先vite环境安装 npm init vite 或者 yarn init vite 2&#xff1a;输入项目的名字,在这里用vue3_test ? Project name: › vite-project 3&#xff1a;选择项目类型&#xff0c;这里选择Vuets 4&#xff1a;出现下图&#xff0c;初始化基本…...

前端求职指南

简历求职指南 为什么没有面试&#xff1f; 1、简历写的不好 2、简历投递不好 简历的定义是什么&#xff1f; 是求职者向未来雇主展示自己专业技能和职业素养的自我推销工具&#xff0c;以找到工作为目的。 什么时候改简历&#xff1f; 每半年或一年更新一次工作中的成长 再工…...

datax同步数据翻倍,.hive-staging 导致的问题分析

一、背景 有同事反馈 Datax 从 Hive 表同步数据到 Mysql 数据翻倍了。通过查看 Datax 任务日志发现&#xff0c;翻倍的原因是多读取了 .hive-staging_xx 开头的文件。接下里就是有关 .hive-staging 的分析。 二、环境 Hive 版本 2.1.1 三、分析 3.1 .hive-staging_hive 产…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...