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

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&#xff1a;JDBC是Java提供的一套用来操作数据库的接口 通过Java代码操作数据库 1.确定数据库是可以正常使用&#xff08;MySQL服务是否正常开启&#xff09; 2.确定MySQL的账号和密码是正确的 3.确定MySQL版本和MySQL驱动版本匹配 4.在工程&#xff08;module&#…...

HarmonyOS—UI开发性能提升的推荐方法

注&#xff1a;本文转载自HarmonyOS官网文档 开发者若使用低性能的代码实现功能场景可能不会影响应用的正常运行&#xff0c;但却会对应用的性能造成负面影响。本章节列举出了一些可提升性能的场景供开发者参考&#xff0c;以避免应用实现上带来的性能劣化。 使用数据懒加载 开…...

英文科技论文写作与发表-常见英语写作困扰(第3章)

1.常见英语写作困扰 英语写作应该是越精炼越好。写完一个句子&#xff0c;建议尝试删除某个或某些单词&#xff0c;如果删除后句子意义基本不变&#xff0c;就应该删除。 1.1 所有格 使用所有格可以省去至少一个单词&#xff08;of&#xff09;,如&#xff1a;Kangs book T…...

video标签自动播放音视频并绘制波形图

html中的<video>标签可以用来播放常见的音视频格式&#xff0c;支持的格式包括:MP3、Ogg、WAV、AAC、MP4、WebM、AVI等&#xff0c;当然支持的格式也和浏览器和操作系统有关。这里以一个可以自动播放音视频并绘制波形图的页面为例说明一下<video>标签的用法。 vid…...

Netty—EventLoop

文章目录 一、EventLoopGroup 是什么&#xff1f;&#x1f914;️二、NioEventLoop 有哪些重要组成部分&#xff1f;&#x1f50d;三、NioEventLoop 的 thread 在何时启动&#xff1f;三、 run() 方法中线程在干嘛&#xff1f; 一、EventLoopGroup 是什么&#xff1f;&#x1f…...

[极客大挑战 2019]FinalSQL(bypass盲注)

这里是数字型注入&#xff0c;选择一个序号 fuzz ?id1这里过滤了很多东西 使用fuzzSQL字典&#xff0c;这是我自己定义编写的一个fuzz字典&#xff0c;内容较少 select from information . tables whereand " or | & union columns updatexml extractvalue databa…...

如何实现小程序与h5页面间的跳转

接到新需求&#xff0c;要在小程序页面内点击按钮实现跳转h5&#xff0c;一开始没接触过&#xff0c;还挺头疼的&#xff0c;但真正做起来&#xff0c;也就那么一回事啦&#xff0c;废话少说&#xff0c;直接上 1. 配置域名 先登录小程序开发平台&#xff0c;将页面需要跳转的…...

企业架构LNMP学习笔记9

nginx配置文件定义php-fpm服务&#xff1a; 编写测试文件&#xff1a; vim /usr/local/nginx/html/index.php 内容&#xff1a; <?phpphpinfo(); 在nginx的配置文件中配置&#xff1a; 修改配置文件&#xff0c;告知nginx如果收到.php结尾的请求&#xff0c;交由给php-…...

华为OD机试 - 二维伞的雨滴效应(Java JS Python)

题目描述 普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。 1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输…...

【HttpRunnerManager】搭建接口自动化测试平台操作流程

一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和配置、mysql 安装和配置 2. python: django 配置、uwsgi 配置 二、我搭建的环境 1. Centos7 &#xff08;配置 rabbitmq、mysql 、Supervisord&#xff09; 2. python 3.6.8 &#xff08;配置 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网址 &#xff1a; 起步 | 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应用程序和小型企业中广泛使用&#xff0c;因为它易于学习和部署&#xff0c;而且成本较低。 Oracle数据库通常用于大型企业和复杂的企业级应用程序&#xff0c;因为它提供了高度可扩展性、高可用性…...

F - LIS on Tree

F - LIS on Tree (atcoder.jp) 问题描述&#xff1a;树上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题目感觉属于平面几何和立体几何的问题&#xff0c;本质上需要推导几何变换情况&#xff0c;B题目属于有标准答案型&#xff0c;没太大的把握不建议选择&#xff0c;可发挥型不大。 第一问 比较简单&#xff0c;就一个2维平面的问题&#xff0c;但有点没理解&#xff0c;这个…...

qt creater11 翻译国际化教程教程:

先出效果图。 闲聊几句&#xff1a;qt这个翻译很方便&#xff0c;能直接导出项目里所有文字。 具体步骤如下&#xff1a; 在Qt中&#xff0c;我们可以使用QTranslator类来实现多语言切换。以下是一般步骤&#xff1a; 1. 在你的源代码中&#xff0c;所有需要翻译的字符串都…...

【AWS实验 】在 AWS Fargate 上使用 Amazon ECS 部署应用程序

文章目录 实验概览目标实验环境任务 1&#xff1a;连接到实验命令主机任务 2&#xff1a;将应用程序容器化任务 3&#xff1a;构建 Web2048 容器任务 4&#xff1a;创建 Amazon ECR 存储库并推送 Docker 映像任务 5&#xff1a;创建 ECS 集群任务 6&#xff1a;测试应用程序总结…...

matlab几种求解器的选择fsolve-sole-vpasolve

文章目录 fsolvesolvevpasovle总结vpasovle的结果fsovle的结果 fsolve 求数值解 result_xfsolve(my_fun,x0,options)参数: my_fun:待求解函数&#xff0c;作为一个.m文件 x0:初始值&#xff0c;向量&#xff0c;可以仅仅指定其中的几项solve 强大的求解器。在方程组中求解析…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...