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 强大的求解器。在方程组中求解析…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
