【JavaWeb】JDBC的基本操作和事务控制+登录和转账案例

1 JDBC操作数据库

1.1 连接数据库

首先导入jar包到lib
在这里插入图片描述

public class JdbcDemo1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取数据库连接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "123456");//3.定义sql语句String sql = "update account set balance = 500 where id = 1";//4.获取执行sql的对象 statementStatement statement = conn.createStatement();//5.执行sqlint count = statement.executeUpdate(sql);//6.处理结果System.out.println(count);//7.释放资源statement.close();conn.close();}
}

1.2 数据库相关对象详解

1.2.1DriverManager:驱动管理对象

  1. 注册驱动
    -Class.forName("com.mysql.jdbc.Driver");
    com.mysql.jdbc.Driver类中存在静态代码块
    MySQL 5 之后的驱动jar包可以省略注册驱动的步骤

  2. 获取数据库连接
    -DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "password");
    url语法:jdbc:mysql:// [ip地址] : [端口号] / [数据库名称]
    如果连接的是本机的mysql 默认是3306 url可以简写为"jdbc:mysql:///db2"

1.2.2 Connection:数据库连接对象

  1. 获取用于执行sql的对象
  • Statement createStatement();
  • PreparedStatement preparedStatement(String sql);
  1. 管理事务
  • 开启事务:void setAutoCommit(boolean autoCommit) 设置参数为false即开启事务
  • 提交事务:void commit()
  • 回滚事务:void rollback()

1.2.3 Statement:执行sql的对象

  1. 执行sql
  • boolean execute(String sql):可以执行任意sql
  • int executeUpdate(String sql):执行DML(C、U、D)语句、DDL(表、库)语句,返回值是受影响的行数。判断DML是否执行成功,返回值>0则成功。
  • ResultSet executeQurey(String sql):执行DQL(R)语句

1.2.4 ResultSet:结果集对象

  1. 获取封装好的查询结果
    -next():游标向前移动一行
    -getXxx(int column):获取第column列的Xxx类型的数据 索引从1开始
    -getXxx(String name):获取命名为name字段的Xxx类型的数据

1.2.5 PreparedStatement:

  1. sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题。
    sql:-select * from user where username = 'xxxx' and password = 'a' or 'a' = 'a'
  2. 使用PreparedStatement可以解决sql注入问题
  3. 预编译的sql:参数使用?作为占位符
  4. sql的参数使用?作为占位符。
  5. 获取执行sql对象使用preparedStatement
  6. 给占位符赋值setXxxxx(位置编号,值),注意编号从1开始。
  7. 效率高,且防止sql注入,后期都用这个,不再使用Statement对象

1.3 基本操作练习

增删改

    public static void main(String[] args){Connection conn = null;Statement statement = null;try{Class.forName("com.mysql.jdbc.Driver");String sql = "insert into account values(null,'王五',3000)";conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "password");statement = conn.createStatement();int count = statement.executeUpdate(sql);if(count > 0){System.out.println("添加成功");}else {System.out.println("添加失败");}}catch (ClassNotFoundException | SQLException e){e.printStackTrace();}finally {//避免空指针异常if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(conn!=null){try {conn.close();}catch (SQLException e){e.printStackTrace();}}}}

查询

    public static void main(String[] args){Connection conn = null;Statement statement = null;ResultSet resultSet = null;try{Class.forName("com.mysql.jdbc.Driver");String sql = "select * from account";conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "password");statement = conn.createStatement();resultSet = statement.executeQuery(sql);while(resultSet.next()){int id = resultSet.getInt(1);String name = resultSet.getString("name");double balance = resultSet.getDouble(3);System.out.println(id+ " "+ name+" "+balance);}}catch (ClassNotFoundException | SQLException e){e.printStackTrace();}finally {//避免空指针异常if(resultSet!=null){try {resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(conn!=null){try {conn.close();}catch (SQLException e){e.printStackTrace();}}}}

新建一个Account类型的JavaBean
读取表到Account类型的列表中

package jdbc;import domain.Account;import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class JdbcDemo2 {public List<Account> findAll(){Connection conn = null;Statement stmt = null;ResultSet rs = null;List<Account> accounts = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "123456");String sql = "select * from account";stmt = conn.createStatement();rs = stmt.executeQuery(sql);accounts = new ArrayList<>();Account account = null;while(rs.next()){account = new Account();int id = rs.getInt("id");String name = rs.getString("name");double balance = rs.getDouble("balance");account.setBalance(balance);account.setId(id);account.setName(name);accounts.add(account);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally {if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}return accounts;}public static void main(String[] args) {List<Account> all = new JdbcDemo2().findAll();for(Account a : all){System.out.println(a);}}
}

1.4 抽取JDBC的工具类

简化代码的书写
编写jdbc配置文件,设置url、user、password、driver
jdbc.properties

url=jdbc:mysql:///db2
user=root
password=password
driver=com.mysql.jdbc.Driver
package jdbc;import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;public class JdbcUtil {private static String url;private static String user;private static String password;private static String driver;//读取配置文件 用静态代码块 只需要读取一次static {try{Properties pro = new Properties();//获取src路径下的文件的方式ClassLoader加载器ClassLoader classLoader = JdbcUtil.class.getClassLoader();URL res = classLoader.getResource("jdbc.properties");String path = res.getPath();pro.load(new FileReader(path));url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password");driver = pro.getProperty("driver");Class.forName(driver);}catch (IOException e){e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url,user,password);}public static void close(Statement stmt, Connection conn){if(stmt!=null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();}catch (SQLException e){e.printStackTrace();}}}public static void close(Statement stmt, Connection conn, ResultSet rs){if(rs!=null){try{stmt.close();}catch (SQLException e){e.printStackTrace();}}if(stmt!=null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();}catch (SQLException e){e.printStackTrace();}}}
}

使用工具类

package jdbc;import domain.Account;import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class JdbcDemo2 {public List<Account> findAll(){Connection conn = null;Statement stmt = null;ResultSet rs = null;List<Account> accounts = null;try {conn = JdbcUtil.getConnection();String sql = "select * from account";stmt = conn.createStatement();rs = stmt.executeQuery(sql);accounts = new ArrayList<>();Account account = null;while(rs.next()){account = new Account();int id = rs.getInt("id");String name = rs.getString("name");double balance = rs.getDouble("balance");account.setBalance(balance);account.setId(id);account.setName(name);accounts.add(account);}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtil.close(stmt,conn,rs);}return accounts;}public static void main(String[] args) {List<Account> all = new JdbcDemo2().findAll();for(Account a : all){System.out.println(a);}}
}

2 登录案例

public class JdbcDemo3 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String username = sc.nextLine();System.out.println("请输入密码:");String password = sc.nextLine();boolean check = login(username, password);if(check){System.out.println("登录成功");}else{System.out.println("登录失败");}}public static boolean login(String username, String password){if(username == null || password == null){return false;}Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {connection = JdbcUtil.getConnection();//注意参数两端都有单引号 因为他们是字符串String sql = "select * from user where username= ? and password= ? ";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,username);preparedStatement.setString(2,password);resultSet = preparedStatement.executeQuery();return resultSet.next();} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtil.close(preparedStatement,connection,resultSet);}return false;}
}

3 JDBC控制事务-转账案例

使用Connection对象来管理事务
执行操作之前开事务 置为false
事务结束之后提交事务
在catch里面回滚 catch捕获的异常范围要扩大 不能仅仅时sql异常

package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class JdbcDemo4 {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt1 = null;PreparedStatement pstmt2 = null;try{conn = JdbcUtil.getConnection();conn.setAutoCommit(false);String sql1 = "update account set balance = balance - ? where id = ?";String sql2 = "update account set balance = balance + ? where id = ?";pstmt1 = conn.prepareStatement(sql1);pstmt2 = conn.prepareStatement(sql2);pstmt1.setDouble(1,500);pstmt2.setDouble(1,500);pstmt1.setInt(2,2);pstmt2.setInt(2,1);pstmt1.executeUpdate();pstmt2.executeUpdate();conn.commit();}catch(Exception e){//任何异常都要回滚 所有这里不只是sql异常try {if(conn != null) conn.rollback();} catch (SQLException ex) {ex.printStackTrace();}e.printStackTrace();}finally {if(pstmt2!=null){try {pstmt2.close();} catch (SQLException e) {e.printStackTrace();}}JdbcUtil.close(pstmt1,conn);}}
}

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

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

相关文章

Restful、SOAP、RPC、SOA、微服务之间的区别

一、介绍Restful、SOAP、RPC、SOA以及微服务 1.1、什么是Restful&#xff1f; Restful是一种架构设计风格&#xff0c;提供了设计原则和约束条件&#xff0c;而不是架构&#xff0c;而满足这些约束条件和原则的应用程序或设计就是 Restful架构或服务。 主要的设计原则&#xf…

详解深度语义匹配模型DSSM和他的兄弟姐妹

一只小狐狸带你解锁NLP/ML/DL秘籍正文作者&#xff1a;郭耀华正文来源&#xff1a;https://www.cnblogs.com/guoyaohua/p/9229190.html前言在NLP领域&#xff0c;语义相似度的计算一直是个难题&#xff1a;搜索场景下Query和Doc的语义相似度、feeds场景下Doc和Doc的语义相似度、…

行业新闻 | 阿里发力知识图谱研究 悉数囊括顶尖学者探讨合作

12 月 20 日&#xff0c;阿里巴巴联合中国中文信息学会语言与知识计算专委会(KG专委)举办的知识图谱研讨会在杭州召开。研讨会由阿里巴巴集团副总裁墙辉&#xff08;花名&#xff1a;玄难&#xff09;主持&#xff0c;国内知识图谱领域多位顶级专家参加此次研讨会。在阿里巴巴持…

【JavaWeb】JDBC优化 之 数据库连接池、Spring JDBC

1 数据库连接池 为什么要使用数据库连接池&#xff1f; 数据库连接是一件费时的操作&#xff0c;连接池可以使多个操作共享一个连接使用连接池可以提高对数据库连接资源的管理节约资源且高效 概念&#xff1a;数据库连接池其实就是一个容器&#xff0c;存放数据库连接的容器…

Java远程通讯技术及原理分析

在分布式服务框架中&#xff0c;一个最基础的问题就是远程服务是怎么通讯的&#xff0c;在Java领域中有很多可实现远程通讯的技术&#xff0c;例如&#xff1a;RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等&#xff0c;这些名词之间到底是些什么关系呢&#xff0c;它们背…

CUDA层硬件debug之路

前记 众所周知&#xff0c;夕小瑶是个做NLP的小可爱。 虽然懂点DL框架层知识&#xff0c;懂点CUDA和底层&#xff0c;但是我是做算法的哎&#xff0c;平时debug很少会遇到深度学习框架层的bug&#xff08;上一次还是三年前被pytorch坑&#xff09;&#xff0c;更从没遇到过CUDA…

研讨会 | 知识图谱大咖云集阿里,他们都说了啥

前言12月20日&#xff0c;由阿里巴巴联合中国中文信息学会语言与知识计算专委会(KG专委)举办的知识图谱研讨会在杭州召开。研讨会由阿里巴巴集团副总裁墙辉&#xff08;玄难&#xff09;主持&#xff0c;知识图谱领域国内知名专家参与了此次研讨。在阿里巴巴持续发力知识图谱这…

置信区间、P值那点事

在假设检验中&#xff0c;我们常常看到跟P值形影不离的一对区间值&#xff0c; 就是大名鼎鼎的置信区间了。 这置信区间和P值是怎么得来的&#xff0c;我想大多数盆友都不会有什么直观的概念&#xff0c;只会注意P值是否小于0.05或者0.01(根据显著性水平确定)。为了给大伙说清楚…

【JavaWeb】HTML+CSS

1 Web概念概述 JavaWeb是使用Java语言开发基于互联网的项目 软件架构 cs架构&#xff1a;优点【资源加载快、用户体验好】、缺点【安装、部署、维护麻烦】bs架构&#xff1a;优点【开发、安装、部署、维护简单】、缺点【应用过大&#xff0c;用户体验会受影响、对硬件有要求…

深度推荐系统2019年度阅读收藏清单

一只小狐狸带你解锁NLP/ML/DL秘籍正文来源&#xff1a;深度传送门今天是2020年新年工作第一天&#xff0c;祝大家开工大吉&#xff0c;新的一年一切顺利&#xff0c;诸事躺赢&#xff01;深度传送门也跟很多号主一样&#xff0c;花了点时间分类整理了一下阅读清单&#xff08;包…

手把手教你协方差分析的SPSS操作

手把手教你协方差分析的SPSS操作 2017-04-27 手把手教你协方差分析的SPSS操作 一、问题与数据 某研究将73例脑卒中患者随机分为现代理疗组&#xff08;38例&#xff09;和传统康复疗法组&#xff08;35例&#xff09;进行康复治疗&#xff0c;采用Fugl-Meyer运动功能评分法&a…

我对DevOps的理解

一、DevOps的意图 究竟什么是DevOps? 要想回答这个问题&#xff0c;首先要明确DevOps这个过程参与的人员是谁&#xff1f;即开发团队和IT运维团队&#xff01;那么&#xff0c;DevOps的意图是什么呢&#xff1f;即在两个团队之间&#xff0c;建立良好的沟通和协作&#xff0c;…

【JavaWeb】JavaScript基础篇+高级篇

文章目录1 介绍2 ECMAScript2.1 基本语法2.2 基本对象3 BOM3.1 window窗口对象3.2 location地址栏对象3.3 history历史记录对象4 DOM4.1 概念4.2 核心DOM4.2.1 Document对象4.2.2 Element对象4.2.3 节点对象4.2.4 案例&#xff1a;动态表格4.2.5 内容切换4.2.6 样式设置5 事件5…

万万没想到,我的炼丹炉玩坏了

一只小狐狸带你解锁NLP/ML/DL秘籍作者&#xff1a;夕小瑶前记众所周知&#xff0c;夕小瑶是个做NLP的小可爱。虽然懂点DL框架层知识&#xff0c;懂点CUDA和底层&#xff0c;但是我是做算法的哎&#xff0c;平时debug很少会遇到深度学习框架层的bug&#xff08;上一次还是三年前…

Reactor三种线程模型与Netty线程模型

一、Reactor三种线程模型 1.1、单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件&#xff0c;包括连接、读、写、异常、关闭等等。单线程Reactor模型基于同步事件分离器来分发事件&#xff0c;这个同步事件分离器&#xff0c;可以看做是一个单线程的while循环。下图描述了…

图解Transformer-一篇文章看懂transformer

原文标题&#xff1a;The Illustrated Transformer 原文链接&#xff1a;https://jalammar.github.io/illustrated-transformer/ 论文地址&#xff1a;https://arxiv.org/abs/1706.03762 前言 Attention这种机制最开始应用于机器翻译的任务中&#xff0c;并且取得了巨大的成就…

【JavaWeb】前端框架之Bootstrap

文章目录1 概念2 快速入门3 响应式布局4 CSS样式和JS插件1 概念 BootStrap是前端开发框架&#xff0c;基于HTML、CSS、JavaScript。 优点&#xff1a; 定义了很多CSS样式和JS插件&#xff0c;可以直接使用。响应式布局&#xff1a;同一套页面可以兼容不同分辨率的设备。 2 快…

号外号外,第一届沙雕项目竞赛,这些项目以数万Star惨获提名

一只小狐狸带你解锁NLP/ML/DL秘籍正文来源&#xff1a; Python空间 好看的皮囊千篇一律&#xff0c;有趣的灵魂没有底线。作为全球最大的同性交友网站&#xff0c;GayHub GitHub 上不止有鲜活的代码&#xff0c;秃头的算法&#xff0c;还有很多拥有有&#xff08;sha&#…

尼克 | 从专家系统到知识图谱

本文节选自尼克老师的《人工智能简史》第 3 章&#xff1a;从专家系统到知识图谱。从第一个专家系统 DENDRAL 到语义网再到谷歌的开源知识图谱&#xff0c;对知识图谱的发展历程进行了全面回顾和深度点评。尼克&#xff0c;早年曾任职哈佛和惠普&#xff1b;后创业投资&#xf…

Google 资深软件工程师 LeetCode 刷题笔记首次公开

BAT 等国内的一线名企&#xff0c;在招聘工程师的过程中&#xff0c;对算法和数据结构都会重点考察。但算法易学难精&#xff0c;我的很多粉丝技术能力不错&#xff0c;但面试时总败在算法这一关&#xff0c;拿不到好 Offer。但说实话&#xff0c;数据结构和算法花点时间&#…