JDBC学习汇总
概念
JDBC:JDBC是Java提供的一套用来操作数据库的接口
通过Java代码操作数据库
1.确定数据库是可以正常使用(MySQL服务是否正常开启)
2.确定MySQL的账号和密码是正确的
3.确定MySQL版本和MySQL驱动版本匹配
4.在工程(module)上右键创建一个目录并将驱动包放在此目录中
5.在jar包上右键-->add as library
获取Connection方式一
connect(String url,java.util.Properties info)
url: mysql的连接地址
jdbc:mysql://localhost:3306/atguigu
jdbc:mysql:协议
localhost:mysql服务器的地址
3306:端口号
atguigu:库的名字
@Testpublic void test() throws SQLException {//1.创建Driver对象Driver driver = new com.mysql.jdbc.Driver();//全类名:包含包名在内的类的全名称//2.调用方法--获取Connection对象(有了该对象才能操作数据库)String s = "jdbc:mysql://localhost:3306/myemployees";Properties p = new Properties();p.setProperty("user","root");//账号,key不能随便写p.setProperty("password","123123");//密码,key不能随便写Connection connect = driver.connect(s,p);System.out.println(connect);}
Properties
1.Properties是Hashtable的子类
2.Properties中的key,value默认是String类型
3.常用Properties读取配置文件
//首先在项目中创建一个文件,文件名为jdbc.properties
//文件内容如下:
user=root
password=123321//程序如下:@Testpublic void test() throws IOException {//1.创建Properties对象Properties p = new Properties();//2.创建流FileInputStream fis = new FileInputStream("jdbc.properties");//3.加载流--将流加载到Properties中p.load(fis);//4.通过Properties读取文件中的内容String user = p.getProperty("user");String password = p.getProperty("password");System.out.println(user + "-----" + password);//5.关闭资源fis.close();}
获取Connection方式二:通过DriverManager
@Testpublic void test2() throws SQLException {//1.创建Driver对象Driver driver = new com.mysql.jdbc.Driver();//2.将driver注册到DriverManager中DriverManager.registerDriver(driver);//获取Connection对象String url = "jdbc:mysql://localhost:3306/myemployees";Connection connection = DriverManager.getConnection(url,"root","123123");System.out.println(connection);}
方式二的优化
@Testpublic void test3() throws ClassNotFoundException, SQLException {//1.让driver类中的静态代码块执行Class.forName("com.mysql.jdbc.Driver");//2.获取connection对象String url = "jdbc:mysql://localhost:3306/myemployees";Connection connection = DriverManager.getConnection(url,"root","123123");System.out.println(connection);}
获取Connection方式三(最终方式)
//首先在项目中创建一个文件,文件名为jdbc.properties
//文件内容如下:
user=root
password=123321//程序如下:@Testpublic void test4() throws ClassNotFoundException, SQLException, IOException {String className = "";String url = "";String user = "";String password = "";//读取配置文件//1.创建Properties对象Properties p = new Properties();//2.创建流FileInputStream fis = new FileInputStream("jdbc.properties");//3.加载流--将流加载到Properties中p.load(fis);//4.通过Properties读取文件中的内容user = p.getProperty("user");password = p.getProperty("password");url = p.getProperty("url");className = p.getProperty("className");System.out.println(user + "---" + password + "---" + url + "---" + className);//5.关闭资源fis.close();//1.让driver类中的静态代码块执行Class.forName(className);//2.获取connection对象Connection connection = DriverManager.getConnection(url,user,password);System.out.println(connection);}
JDBCUtils工具类
//首先在项目中创建一个文件,文件名为jdbc.properties
//文件内容如下:
user=root
password=123321
url=jdbc:mysql://localhost:3306/myemployees
className=com.mysql.jdbc.Driver//----------------------------------
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;/*
* 工具类
* */
public class JDBCUtils {private static String className;private static String url;private static String user;private static String password;static {FileInputStream fis = null;try {//读取配置文件//1.创建Properties对象Properties p = new Properties();//2.创建流fis = new FileInputStream("jdbc.properties");//3.加载流--将流加载到Properties中p.load(fis);//4.通过Properties读取文件中的内容user = p.getProperty("user");password = p.getProperty("password");url = p.getProperty("url");className = p.getProperty("className");System.out.println(user + "---" + password + "---" + url + "---" + className);}catch (Exception e){e.printStackTrace();//打印异常信息//将编译时异常转为运行时异常---终止程序的运行throw new RuntimeException(e.getMessage());//e.getMessage():获取异常信息}finally {if (fis != null) {//5.关闭资源try {fis.close();} catch (IOException e) {throw new RuntimeException(e);}}}}//获取Connection对象public static Connection getConnection(){try {//1.让driver类中的静态代码块执行Class.forName(className);//2.获取connection对象Connection connection = DriverManager.getConnection(url,user,password);
// System.out.println(connection);return connection;}catch (Exception e){e.printStackTrace();throw new RuntimeException(e.getMessage());}}//关闭资源public static void close(Connection connection, PreparedStatement ps) {if (connection != null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}if (ps != null){try {ps.close();} catch (SQLException e) {e.printStackTrace();}}}
}
向表中插入数据
@Testpublic void test() throws SQLException {//1.获取Connection对象Connection connection = JDBCUtils.getConnection();//2.sql语句//?:占位符String sql = "insert into student(id,name,sid) values(?,?,?)";//3.对SQL预编译//调用PrepareStatement返回PrepareStatement对象,有了该对象就可以给占位符赋值PreparedStatement ps = connection.prepareStatement(sql);//4.给占位符赋值/** setInt(int parameterIndex,int x)* parameterIndex:第几个占位符* */ps.setInt(1,10);ps.setString(2,"longge");ps.setInt(3,1000);//5.执行sql语句int result = ps.executeUpdate();//executeUpdate:只是用来执行增,删,改System.out.println("共有" + result + "行数据受到影响");//6.关闭资源JDBCUtils.close(connection,ps);}
更改表中数据
/** 修改数据库中数据* */@Testpublic void test1() throws SQLException {//1.获取Connection对象Connection connection = JDBCUtils.getConnection();//2.sql语句String sql = "update student set id=? where name=?";//3.预编译PreparedStatement ps = connection.prepareStatement(sql);//3.1给占位符赋值ps.setInt(1,9);ps.setString(2,"longge");//3.2执行sql语句ps.executeUpdate();//4.关闭资源JDBCUtils.close(connection,ps);}
删除表中数据
/** 删除数据库中数据* */@Testpublic void test2() throws SQLException {//1.获取Connection对象Connection connection = JDBCUtils.getConnection();//2.sql语句String sql = "delete from student where id = ?";//3.预编译PreparedStatement ps = connection.prepareStatement(sql);//3.1给占位符赋值ps.setInt(1,9);//3.2执行sql语句ps.executeUpdate();//4.关闭资源JDBCUtils.close(connection,ps);}
查询表中的一条数据
/** 查询表中的一条数据* */@Testpublic void test() throws SQLException {//1.获取Connection对象Connection connection = JDBCUtils.getConnection();//2.sql语句String sql = "select id,name,sid from student where id = ?";//3.预编译PreparedStatement ps = connection.prepareStatement(sql);//4.给占位符赋值ps.setInt(1,3);//5.执行sql语句ResultSet rs = ps.executeQuery();//executeQuery():执行查询的语句//6.通过ResultSet遍历数据while (rs.next()){//next():如果有数据结果为true//7.获取对应的字段中的数据//getInt(String columnLabel):通过字段的名字获取对应的值int id = rs.getInt("id");String name = rs.getString("name");int sid = rs.getInt("sid");System.out.println(id + "=" + name + "=" + sid);}//8.关闭资源JDBCUtils.close(connection,ps,rs);}
查询表中所有数据(查询一条数据的修改式)
/** 查询表中的所有数据* */@Testpublic void test2() throws SQLException {//1.获取Connection对象Connection connection = JDBCUtils.getConnection();//2.sql语句String sql = "select id,name,sid from student";//3.预编译PreparedStatement ps = connection.prepareStatement(sql);//5.执行sql语句ResultSet rs = ps.executeQuery();//executeQuery():执行查询的语句//6.通过ResultSet遍历数据while (rs.next()){//next():如果有数据结果为true//7.获取对应的字段中的数据//getInt(String columnLabel):通过字段的名字获取对应的值int id = rs.getInt("id");String name = rs.getString("name");int sid = rs.getInt("sid");System.out.println(id + "=" + name + "=" + sid);}//8.关闭资源JDBCUtils.close(connection,ps,rs);}
查询表中的所有数据(调用类的方法)
@Testpublic void test3() throws SQLException {List<Student> students = getStudents();for (Student student : students) {System.out.println(student);}}/** 自定义一个方法。调用此方法就可以获取表中所有的数据* */public List<Student> getStudents() throws SQLException {//创建一个集合用来存放对象List<Student> list = new ArrayList<>();Connection connection = JDBCUtils.getConnection();String sql = "select id,name,sid from student";PreparedStatement ps = connection.prepareStatement(sql);ResultSet rs = ps.executeQuery();while (rs.next()){//next():如果有数据结果为trueint id = rs.getInt("id");String name = rs.getString("name");int sid = rs.getInt("sid");//封装Student s = new Student(id,name,sid);//将对象放入到集合中list.add(s);}//8.关闭资源JDBCUtils.close(connection,ps,rs);//返回集合return list;}
事务
import com.atguigu.jdbc2.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*#事务:#一组逻辑操作单元,使数据从一种状态变换到另一种状态#案例:# AA给CC转账1000元try{事务开启AA减去1000元的操作;System.out.println(1/0);CC加上1000元的操作;事务提交}catch(Exception e){事务回滚;}finally{允许事务提交}遇到的问题:可能会发生AA的操作成功但是CC的操作失败解决思路:将AA和CC的操作看成一个整体看成一个整体要么都成功要么都失败CREATE TABLE account(NAME VARCHAR(20),balance INT);
* */
public class Account {public static void main(String[] args) {//获取Connection对象Connection connection = JDBCUtils.getConnection();PreparedStatement ps = null;try {//============开启事务---禁止自动提交===============connection.setAutoCommit(false);//sql语句String sql = "update account set balance=? where name=?";//预编译ps = connection.prepareStatement(sql);//给占位符赋值//AA减去1000ps.setInt(1, 1000);ps.setString(2, "aa");//执行sql语句ps.executeUpdate();
// System.out.println(1 / 0);//CC加上1000ps.setInt(1, 3000);ps.setString(2, "cc");//执行sql语句ps.executeUpdate();//=========事务---提交=====connection.commit();} catch (Exception e) {//======事务---回滚====try {connection.rollback();} catch (SQLException ex) {throw new RuntimeException(ex);}e.printStackTrace();} finally {//允许事务提交try {connection.commit();} catch (SQLException e) {e.printStackTrace();}//关闭资源JDBCUtils.close(connection, ps);}}
}
数据库连接池
package com.atguigu.jdbc3;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.jupiter.api.Test;import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;/*
* 数据库连接池:Druid
* */
public class DruidDemo {/** 方式一:* */@Testpublic void test() throws SQLException {//1.创建数据库连接池对象DruidDataSource dataSource = new DruidDataSource();//2.给属性赋值dataSource.setUsername("root");//mysql账号dataSource.setPassword("123123");//mysql密码dataSource.setDriverClassName("com.mysql.jdbc.Driver");//Driver类的全类名dataSource.setUrl("jdbc:mysql://localhost:3306/myemployees");//3.获取Connection对象Connection connection = dataSource.getConnection();System.out.println(connection);//4.关闭资源connection.close();}/** 方式二:* */@Testpublic void test2() throws Exception {Properties p = new Properties();FileInputStream fis = new FileInputStream("druid.properties");p.load(fis);//加载流//1.创建数据库的连接对象DataSource dataSource = DruidDataSourceFactory.createDataSource(p);//2.获取数据库连接对象Connection connection = dataSource.getConnection();System.out.println(connection);//3.关闭connection.close();}
}
不能插入中文问题
url=jdbc:mysql://localhost:3306/myemployees?characterEncoding=utf8
相关文章:
JDBC学习汇总
概念 JDBC:JDBC是Java提供的一套用来操作数据库的接口 通过Java代码操作数据库 1.确定数据库是可以正常使用(MySQL服务是否正常开启) 2.确定MySQL的账号和密码是正确的 3.确定MySQL版本和MySQL驱动版本匹配 4.在工程(module&#…...
HarmonyOS—UI开发性能提升的推荐方法
注:本文转载自HarmonyOS官网文档 开发者若使用低性能的代码实现功能场景可能不会影响应用的正常运行,但却会对应用的性能造成负面影响。本章节列举出了一些可提升性能的场景供开发者参考,以避免应用实现上带来的性能劣化。 使用数据懒加载 开…...
英文科技论文写作与发表-常见英语写作困扰(第3章)
1.常见英语写作困扰 英语写作应该是越精炼越好。写完一个句子,建议尝试删除某个或某些单词,如果删除后句子意义基本不变,就应该删除。 1.1 所有格 使用所有格可以省去至少一个单词(of),如:Kangs book T…...
video标签自动播放音视频并绘制波形图
html中的<video>标签可以用来播放常见的音视频格式,支持的格式包括:MP3、Ogg、WAV、AAC、MP4、WebM、AVI等,当然支持的格式也和浏览器和操作系统有关。这里以一个可以自动播放音视频并绘制波形图的页面为例说明一下<video>标签的用法。 vid…...
Netty—EventLoop
文章目录 一、EventLoopGroup 是什么?🤔️二、NioEventLoop 有哪些重要组成部分?🔍三、NioEventLoop 的 thread 在何时启动?三、 run() 方法中线程在干嘛? 一、EventLoopGroup 是什么?…...
[极客大挑战 2019]FinalSQL(bypass盲注)
这里是数字型注入,选择一个序号 fuzz ?id1这里过滤了很多东西 使用fuzzSQL字典,这是我自己定义编写的一个fuzz字典,内容较少 select from information . tables whereand " or | & union columns updatexml extractvalue databa…...
如何实现小程序与h5页面间的跳转
接到新需求,要在小程序页面内点击按钮实现跳转h5,一开始没接触过,还挺头疼的,但真正做起来,也就那么一回事啦,废话少说,直接上 1. 配置域名 先登录小程序开发平台,将页面需要跳转的…...
企业架构LNMP学习笔记9
nginx配置文件定义php-fpm服务: 编写测试文件: vim /usr/local/nginx/html/index.php 内容: <?phpphpinfo(); 在nginx的配置文件中配置: 修改配置文件,告知nginx如果收到.php结尾的请求,交由给php-…...
华为OD机试 - 二维伞的雨滴效应(Java JS Python)
题目描述 普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。 1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输…...
【HttpRunnerManager】搭建接口自动化测试平台操作流程
一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和配置、mysql 安装和配置 2. python: django 配置、uwsgi 配置 二、我搭建的环境 1. Centos7 (配置 rabbitmq、mysql 、Supervisord) 2. python 3.6.8 (配置 django、uwsgi&am…...
【C++】STL-常用算法-常用查找算法
0.前言 1.find #include <iostream> using namespace std;// 常用查找算法 find #include<vector> #include<algorithm>//查找 内置数据类型 void test01() {vector<int>v;for (int i 0; i < 10; i){v.push_back(i);}//查找 容器中 是否有 5 这个元…...
vue3 webpack打包流程及安装 (1)
npm run build 也可以打包 如果没有特殊需求 可以使用 效果其实是差不多的 --------------------------------------------------------------------------------------------------------------------------------- webpack网址 : 起步 | webpack 中文文档 (docsc…...
【C++】内联函数 ① ( 内联函数引入 | 内联函数语法 )
文章目录 一、内联函数引入1、内联函数引入2、代码示例 - 宏代码片段 与 内联函数 二、内联函数语法1、内联函数语法说明2、代码示例 - 内联函数基本语法 一、内联函数引入 1、内联函数引入 " 内联函数 " 是 C 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率…...
聊聊springboot的ConfigurationProperties的绑定
序 本文主要研究一下springboot的ConfigurationProperties的绑定 ConfigurationPropertiesBindingPostProcessor org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java /*** {link BeanPostProcessor} to bind {link PropertySo…...
Mysql和Oracle的语法区别?
Mysql和Oracle是两种不同的关系型数据库。 MySQL通常在中小型应用程序、Web应用程序和小型企业中广泛使用,因为它易于学习和部署,而且成本较低。 Oracle数据库通常用于大型企业和复杂的企业级应用程序,因为它提供了高度可扩展性、高可用性…...
F - LIS on Tree
F - LIS on Tree (atcoder.jp) 问题描述:树上LIS。 普通LIS。O(n * n)。 void solve() {int n; cin>>n;vector<int> f(n 1),a(n1);for(int i 1; i < n; i) {cin>>a[i];f[i] 1;for(int j 1; j < i; j) {if(a[i] > a[j]) f[i] max…...
2023 年全国大学生数学建模B题目-多波束测线问题
B题目感觉属于平面几何和立体几何的问题,本质上需要推导几何变换情况,B题目属于有标准答案型,没太大的把握不建议选择,可发挥型不大。 第一问 比较简单,就一个2维平面的问题,但有点没理解,这个…...
qt creater11 翻译国际化教程教程:
先出效果图。 闲聊几句:qt这个翻译很方便,能直接导出项目里所有文字。 具体步骤如下: 在Qt中,我们可以使用QTranslator类来实现多语言切换。以下是一般步骤: 1. 在你的源代码中,所有需要翻译的字符串都…...
【AWS实验 】在 AWS Fargate 上使用 Amazon ECS 部署应用程序
文章目录 实验概览目标实验环境任务 1:连接到实验命令主机任务 2:将应用程序容器化任务 3:构建 Web2048 容器任务 4:创建 Amazon ECR 存储库并推送 Docker 映像任务 5:创建 ECS 集群任务 6:测试应用程序总结…...
matlab几种求解器的选择fsolve-sole-vpasolve
文章目录 fsolvesolvevpasovle总结vpasovle的结果fsovle的结果 fsolve 求数值解 result_xfsolve(my_fun,x0,options)参数: my_fun:待求解函数,作为一个.m文件 x0:初始值,向量,可以仅仅指定其中的几项solve 强大的求解器。在方程组中求解析…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
