JDBC基础

文章目录

  • 创建依赖
  • 基本步骤
    • 案例
      • 1. statement案例(不常用):
      • 2.prepared 案例(常用)
      • 3.prepared curd 案例(获取列信息)
      • 5.事务一致性(转账)

创建依赖

各个版本有各个的依赖包,想MySQL8.0 和MySQL5.0 应该下载对应的依赖包
在这里插入图片描述
在idea项目当中创建文件夹libs来放相关的依赖,将依赖放进去后,右击,增加到此项目当中(如图一),加载完成之后会有三角形的这个依赖包可以打开,如图二所示:
图一:
在这里插入图片描述

图二:
在这里插入图片描述

基本步骤

 * TODO: 步骤总结 (6)*    1. 注册驱动*    2. 获取连接*    3. 创建statement或者Prepared*    4. 发送SQL语句,并获取结果*    5. 结果集解析*    6. 关闭资源

1.注册驱动

// 方法1:
DriverManager.registerDriver(new Driver());// 这个驱动会创建两次
//方法2:利用反射机制-推荐
Class.forName("com.mysql.cj.jdbc.Driver");

2.获取链接

获取链接的有三个参数的,两个参数的,一个参数的。接下来一个一个介绍

// 三个参数
public static Connection getConnection(String url,String user, String password)
//两个参数      
public static Connection getConnection(String url,java.util.Properties info)
// 一个参数
public static Connection getConnection(String url)

三个参数的:

/**
这里有三个参数,具体在这里详细描述【】——》带这个的是你需要里面需要填的东西。
第一个参数:(String URL: 连接数据库地址) 连接数据库地址模仿下列的写法 jbdc:【数据库名】://【域名或ip地址】:【端口号】/【数据库名】
其实还可以有其他的参数:
第二个参数:(String user: 连接数据库用户名)
第三个参数:连接数据库用户对应的密码
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");

数据库URL语法:

(1)链接Oracle数据库 ip 127.0.0.1 端口号:3306 数据库名:db
jdbc:oracle :// 127.0.0.1  : 3306 / db(2)链接Mysql数据库 ip 本机 端口号:3306 数据库名:day01
jdbc:mysql://localhost:3306/day01(3) 当前电脑的省略写法! 注意:本机和端口3306jdbc:mysql://localhost:3306/day01相当于jdbc:mysql:///day01

两个参数的:

String URL : 写法还是jdbc的三个参数的写法!
Properties : 就是一个参数封装容器!至少要包含 user / password key!存储连接账号信息!(就是properties配置文件需要自己写)

一个参数的:

String URL: URl可以携带目标地址,可以通过?分割,在后面key=value&key=value形式传递参数
jdbc:mysql:///day01?user=root&password=123456

  1. 创建statement/prepared

他们的区别就在于statement,只能给字符串,可以形成SQL注入,而prepared可以给一个方法传入参数,则可以防止注入。

1.statement:

Statement statement = connection.createStatement();

2.prepared

//创建preparedStatement//TODO 需要传入SQL语句结构//TODO 要的是SQL语句结构,动态值的部分使用 ? ,  占位符!//TODO ?  不能加 '?'  ? 只能替代值,不能替代关键字和容器名
String sql = "select * from t_user where account = ? and password = ? ;";
PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值//给占位符赋值! 从左到右,从1开始!/**
*  int 占位符的下角标
*  object 占位符的值
*/
preparedStatement.setObject(2,password);preparedStatement.setObject(1,account);
  1. 发送SQL语句,并获取结果

1.statement 获取

/**
这里举例:写了一个sql 语句 
*/
String sql = "select id,account,password,nickname from t_user ;";ResultSet resultSet =  statement.executeQuery(sql);
  1. prepared的获取(方法一样)
ResultSet resultSet = preparedStatement.executeQuery();

resultSet的返回值:

ResultSet 结果集对象 = executeQuery(DQL语句)
int 响应行数 = executeUpdate(非DQL语句)

5.结果集解析

/**** TODO:1.需要理解ResultSet的数据结构和mysql可视化工具查询出来的是一样,需要在脑子里构建结果表!* TODO:2.有一个光标指向的操作数据行,默认指向第一行的上边!我们需要移动光标,指向行,在获取列即可!*        boolean = next()*              false: 没有数据,也不移动了!*              true:  有更多行,并且移动到下一行!*       推荐:推荐使用if 或者 while循环,嵌套next方法,循环和判断体内获取数据!*       if(next()){获取列的数据!} ||  while(next()){获取列的数据!}**TODO:3.获取当前行列的数据!*         get类型(int columnIndex | String columnLabel)*        列名获取  //lable 如果没有别名,等于列名, 有别名label就是别名,他就是查询结果的标识!*        列的角标  //从左到右 从1开始! 数据库全是从1开始!*/
while (resultSet.next()){int id = resultSet.getInt("id");String account = resultSet.getString("account");String password = resultSet.getString("password");String nickname = resultSet.getString("nickname");System.out.println(id+"::"+account+"::"+password+"::"+nickname);}

6.关闭资源

resultSet.close();
statement.close();
connection.close();

案例

1. statement案例(不常用):

public class test {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册一次驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///my_project", "root", "Thm123456!");//3.创建statementStatement statement = connection.createStatement();//4.执行SQL语句 [动态SQL语句,需要字符串拼接]
//        String sql = "select * from t_user where account = '"+account+"' and password = '"+password+"' ;";String sql = "SELECT * FROM my_work ;";ResultSet resultSet = statement.executeQuery(sql);// 5.使用数据while (resultSet.next()){System.out.println(resultSet.getString(1)); // 打印第一竖的数据}//关闭资源resultSet.close();statement.close();connection.close();}}

2.prepared 案例(常用)

public class testPrepared {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册一次驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///my_project", "root", "Thm123456!");//3.创建preparedString sql = "SELECT * FROM my_work WHERE password = ?;"; //sql 语句PreparedStatement preparedStatement = connection.prepareStatement(sql); // 准备prepared解析SQL语句preparedStatement.setObject(1,"ccc"); // 第1个参数传入ccc//4.执行SQL语句 [动态SQL语句,需要字符串拼接]ResultSet resultSet = preparedStatement.executeQuery();// 5.使用数据while (resultSet.next()){System.out.println(resultSet.getString(1)); // 打印第一竖的数据System.out.println("name:" + resultSet.getString("name")); // 通过 名称查找 获取当前行的数据System.out.println("password:" + resultSet.getString("password")); }//关闭资源resultSet.close();preparedStatement.close();connection.close();}}

3.prepared curd 案例(获取列信息)

public class JdbcPreparedStatementCrudPart {/*** 插入一条用户数据!* 账号: test* 密码: test* 昵称: 测试*/@Testpublic void testInsert() throws Exception{//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///db", "root", "root");//TODO: 切记, ? 只能代替 值!!!!!  不能代替关键字 特殊符号 容器名String sql = "insert into t_user(account,password,nickname) values (?,?,?);";PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值preparedStatement.setString(1, "test");preparedStatement.setString(2, "test");preparedStatement.setString(3, "测试");//发送SQL语句int rows = preparedStatement.executeUpdate();//输出结果System.out.println(rows);//关闭资源closepreparedStatement.close();connection.close();}/*** 修改一条用户数据!* 修改账号: test的用户,将nickname改为tomcat*/@Testpublic void testUpdate() throws Exception{//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///db", "root", "root");//TODO: 切记, ? 只能代替 值!!!!!  不能代替关键字 特殊符号 容器名String sql = "update t_user set nickname = ? where account = ? ;";PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值preparedStatement.setString(1, "tomcat");preparedStatement.setString(2, "test");//发送SQL语句int rows = preparedStatement.executeUpdate();//输出结果System.out.println(rows);//关闭资源closepreparedStatement.close();connection.close();}/*** 删除一条用户数据!* 根据账号: test*/@Testpublic void testDelete() throws Exception{//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///db", "root", "root");//TODO: 切记, ? 只能代替 值!!!!!  不能代替关键字 特殊符号 容器名String sql = "delete from t_user where account = ? ;";PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值preparedStatement.setString(1, "test");//发送SQL语句int rows = preparedStatement.executeUpdate();//输出结果System.out.println(rows);//关闭资源closepreparedStatement.close();connection.close();}/*** 查询全部数据!*   将数据存到List<Map>中*   map -> 对应一行数据*      map key -> 数据库列名或者别名*      map value -> 数据库列的值* TODO: 思路分析*    1.先创建一个List<Map>集合*    2.遍历resultSet对象的行数据*    3.将每一行数据存储到一个map对象中!*    4.将对象存到List<Map>中*    5.最终返回** TODO:*    初体验,结果存储!*    学习获取结果表头信息(列名和数量等信息)*/@Testpublic void testQueryMap() throws Exception{//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///db", "root", "root");//TODO: 切记, ? 只能代替 值!!!!!  不能代替关键字 特殊符号 容器名String sql = "select id,account,password,nickname from t_user ;";PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值 本次没有占位符,省略//发送查询语句ResultSet resultSet = preparedStatement.executeQuery();//创建一个集合List<Map> mapList = new ArrayList<>();//获取列信息对象ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();while (resultSet.next()) {Map map = new HashMap();for (int i = 1; i <= columnCount; i++) {map.put(metaData.getColumnLabel(i), resultSet.getObject(i));}mapList.add(map);}System.out.println(mapList);//关闭资源closepreparedStatement.close();connection.close();resultSet.close();}}

5.事务一致性(转账)

利用try ...catch..finally
开启事务(关闭事务自动提交)
connection.setAutoCommit(false);
提交事务
connection.commit();
回滚事务
connection.rollback();
等操作,实现事务的一致性

BankDao 类(是用传入参数 用来加钱减钱的操作)

public class BankDao {/*** 加钱方法* @param account* @param money* @param connection 业务传递的connection和减钱是同一个! 才可以在一个事务中!* @return 影响行数*/public int addMoney(String account, int money,Connection connection) throws ClassNotFoundException, SQLException {String sql = "update t_bank set money = money + ? where account = ? ;";PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值preparedStatement.setObject(1, money);preparedStatement.setString(2, account);//发送SQL语句int rows = preparedStatement.executeUpdate();//输出结果System.out.println("加钱执行完毕!");//关闭资源closepreparedStatement.close();return rows;}/*** 减钱方法* @param account* @param money* @param connection 业务传递的connection和加钱是同一个! 才可以在一个事务中!* @return 影响行数*/public int subMoney(String account, int money,Connection connection) throws ClassNotFoundException, SQLException {String sql = "update t_bank set money = money - ? where account = ? ;";PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值preparedStatement.setObject(1, money);preparedStatement.setString(2, account);//发送SQL语句int rows = preparedStatement.executeUpdate();//输出结果System.out.println("减钱执行完毕!");//关闭资源closepreparedStatement.close();return rows;}
}

BankService类(这里注册了驱动,建立了数据库的链接,然后用了try catch 保持事务的一致性,在关闭了资源)

public class BankService {/*** 转账业务方法* @param addAccount  加钱账号* @param subAccount  减钱账号* @param money  金额*/public void transfer(String addAccount,String subAccount, int money) throws ClassNotFoundException, SQLException {System.out.println("addAccount = " + addAccount + ", subAccount = " + subAccount + ", money = " + money);//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///db", "root", "root");int flag = 0;//利用try代码块,调用daotry {//开启事务(关闭事务自动提交)connection.setAutoCommit(false);BankDao bankDao = new BankDao();//调用加钱 和 减钱bankDao.addMoney(addAccount,money,connection);System.out.println("--------------");bankDao.subMoney(subAccount,money,connection);flag = 1;//不报错,提交事务connection.commit();}catch (Exception e){//报错回滚事务connection.rollback();throw e;}finally {connection.close();}if (flag == 1){System.out.println("转账成功!");}else{System.out.println("转账失败!");}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/104628.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

决策树算法:随机森林民主算法【02/2】

决策树民主&#xff1a;随机森林算法 一、介绍&#xff1a; 记住您在阅读亚马逊上的所有评论后进行的最后一次购买&#xff0c;或者在查看 IMDb 评级后您观看的以前的电影。人类是社会动物&#xff0c;他人的意见和行为自然会影响我们。我们的决定在很大程度上取决于“群体智慧…

Matlab分割彩色图像

彩色图像 彩色图像除有亮度信息外&#xff0c;还包含有颜色信息。以最常见的RGB&#xff08;红绿蓝&#xff09;彩色空间为例来简要说明彩色图像&#xff1a; 彩色图像可按照颜色的数目来划分。例如&#xff0c;256色图像和真彩色图像&#xff08;2的16次方&#xff1d;21677…

智信数科SMS短信平台安装教程

智信SMS客户端下载 使用智信SMS短信平台前&#xff0c;需要前往公司官网或者百度网盘共享地址下载最新版本的短信平台。 下载地址一&#xff1a;公司官网 下载地址二&#xff1a;百度网盘共享&#xff08;推荐&#xff09; 智信SMS客户端安装 安装前&#xff0c;确保您已经正…

【MySQL系列】Select语句单表查询详解(二)ORDERBY排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Oracle的学习心得和知识总结(二十八)|Oracle数据库数据库回放功能之论文二翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

私有化部署即时通讯平台,30分钟替换钉钉和企业微信

随着企业对即时通讯和协作工具的需求不断增长&#xff0c;私有化部署的即时通讯平台成为企业的首选。WorkPlus作为有10余年行业深耕经验与技术沉淀品牌&#xff0c;以其安全高效的私有化部署即时通讯解决方案&#xff0c;帮助企业在30分钟内替换钉钉和企业微信。本文将深入探讨…

adb 命令

1.adb shell dumpsys activity top | find "ACTIVITY" 查看当前运行的activity包名 2.adb shell am start -n 包名/页面名 打开应用的页面 3.查看将要启动或退出app的包名 adb shell am monitor 只有在启动或退出的时候才会打印 4.查看当前启动应用的包名 ad…

【动手学深度学习】--20.目标检测和边界框

文章目录 目标检测和边界框1.目标检测2.边界框 目标检测和边界框 学习视频&#xff1a;物体检测和数据集【动手学深度学习v2】 官方笔记&#xff1a;目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别…

用Idea把SpringBoot项目打包镜像上传至docker

1、设置docker把2375端口开起来 命令查看docker装在哪里 vim docker.service 新增 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 2、配置Dockerfile 我在跟pom同一层 3、配置docker-maven-plugin <plugin><groupId>com.spotify</groupId><arti…

c语言调用mciSendString播放音乐

如下所示&#xff0c;这是一个使用c语言调用系统方法mciSendString()&#xff0c;让系统播放音乐的示例&#xff1a; baihuaxiang 代码&#xff1a; #include <graphics.h> #include <Windows.h> #include <mmsystem.h>#pragma comment(lib,"WINMM.LIB…

element-ui中的el-table合并单元格

描述&#xff1a; 在写项目的时候有时候会经常遇到把行和列合并起来的情况&#xff0c;因为有些数据是重复渲染的&#xff0c;不合并行列会使表格看起来非常的混乱&#xff0c;如下&#xff1a; 而我们想要的数据是下面这种情况&#xff0c;将重复的行进行合并&#xff0c;使表…

STM32设置为I2C从机模式(HAL库版本)

STM32设置为I2C从机模式&#xff08;HAL库版本&#xff09; 目录 STM32设置为I2C从机模式&#xff08;HAL库版本&#xff09;前言1 硬件连接2 软件编程2.1 步骤分解2.2 测试用例 3 运行测试3.1 I2C连续写入3.2 I2C连续读取3.3 I2C单次读写测试 4 总结 前言 我之前出过一篇关于…

XXX程序 详细说明

用于记录理解PC程序的程序逻辑 1、程序的作用 根据原作者的说明&#xff08;文件说明.txt&#xff09;&#xff0c;该程序 (PC.py) 的主要作用是提取某一个文件夹中的某个设备 (通过config中的信息看出来是Ag_T_8) 产生的日志文件&#xff0c;然后提取其中某些需要的数据&…

内网渗透神器CobaltStrike之权限提升(七)

Uac绕过 常见uac攻击模块 UAC-DLL UAC-DLL攻击模块允许攻击者从低权限的本地管理员账户获得更高的权限。这种攻击利用UAC的漏洞&#xff0c;将ArtifactKit生成的恶意DLL复制到需要特权的位置。 适用于Windows7和Windows8及更高版本的未修补版本 Uac-token-duplication 此攻…

Web3和去中心化:互联网的下一个演化阶段

文章目录 Web3和去中心化的定义Web3&#xff1a;去中心化&#xff1a; 为什么Web3和去中心化如此重要&#xff1f;数据隐私和安全&#xff1a;去中心化的创新&#xff1a;去除中间商&#xff1a; Web3和去中心化的应用领域去中心化金融&#xff08;DeFi&#xff09;&#xff1a…

Qt下使用ModbusTcp通信协议进行PLC线圈/保持寄存器的读写(32位有符号数)

文章目录 前言一、引入Modbus模块二、Modbus设备的连接三、各寄存器数据的读取四、各寄存器数据的写入五、示例完整代码总结 前言 本文主要讲述了使用Qt的Modbus模块来进行ModbusTcp的通信&#xff0c;实现对PLC的线圈寄存器和保持寄存器的读写&#xff0c;基于TCP/IP的Modbus…

设计模式大白话——命令模式

命令模式 一、概述二、经典举例三、代码示例&#xff08;Go&#xff09;四、总结 一、概述 ​ 顾名思义&#xff0c;命令模式其实和现实生活中直接下命令的动作类似&#xff0c;怎么理解这个命令是理解命令模式的关键&#xff01;&#xff01;&#xff01;直接说结论是很不负责…

MindManager

MindManager 简介下载安装crack 简介 MindManager是一款由Mindjet公司开发的思维导图软件。思维导图是一种图形化的方法&#xff0c;用于在一个中心主题周围组织和呈现各种相关思想、想法和信息。MindManager允许用户创建、编辑和共享思维导图&#xff0c;以帮助他们更好地组织…

【Unity3D赛车游戏】【四】在Unity中添加阿克曼转向,下压力,质心会让汽车更稳定

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

SMC状态机 讲解2 从模型到SMC

SMC状态机 讲解2 从模型到SMC 1、实例化有限状态机&#xff08;FSM)2、简单转换 Simple Transition3、外部环回转换 External Loopback Transition4、内部环回转换 Internal Loopback Transition5、转换动作6、转换Guard7、转换参数8、Entry 和 Exit动作9、Push 转换10、Pop转换…