当前位置: 首页 > 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 产…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...