首页 > 其他分享 >2022-08-21 第六小组 高佳誉 学习笔记

2022-08-21 第六小组 高佳誉 学习笔记

时间:2022-08-22 09:35:01浏览次数:49  
标签:ps PreparedStatement 21 08 connection 2022 sql import name

1.JDBC是什么?

Java DataBase Connectivity(Java语言连接数据库)

2.JDBC的本质是什么?

JDBC是SUN公司制定的一套接口(interface)
java.sql.*;(这个软件包下有很多接口)
接口都有调用者和实现者。
面向接口调用、面向接口写实现类,这都属于面向接口编程。

为什么要面向接口编程?

点击查看代码
解耦合:降低程序的耦合度,提高程序的扩展力。
		多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
			建议:
				Animal a = new Cat();
				Animal a = new Dog();
				// 喂养的方法
				public void feed(Animal a){ // 面向父类型编程。
				
			}
		不建议:
			Dog d = new Dog();
			Cat c = new Cat();

思考:为什么SUN制定一套JDBC接口呢?

因为每一个数据库的底层实现原理都不一样。
Oracle数据库有自己的原理。
MySQL数据库也有自己的原理。
MS SqlServer数据库也有自己的原理。
…
每一个数据库产品都有自己独特的实现原理。

JDBC的本质

一套接口。

PreparedSatement 的好处

1. prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。
可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。
2. 安全性更高,没有 SQL 注入的隐患。
3. 提高了程序的可读性

使用 PreparedStatement 的步骤:

1) 编写 SQL 语句,未知内容使用?占位:"SELECT * FROM user WHERE name=? AND password=?";
2) 获得 PreparedStatement 对象
3) 设置实际参数:setXxx(占位符的位置, 真实的值)
4) 执行参数化 SQL 语句
5) 关闭资源
点击查看代码
package com.lqg;
import com.itheima.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 使用 PreparedStatement
*/
public class Demo8Login {
    //从控制台上输入的用户名和密码
    public static void main(String[] args) throws SQLException {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入用户名");
    String name = sc.nextLine();
    System.out.println("请输入密码:");
    String password = sc.nextLine();
    login(name, password);
}
/**
* 登录的方法
* @param name
16 / 21
* @param password
*/
private static void login(String name, String password) throws SQLException {
    Connection connection = JdbcUtils.getConnection();
    //写成登录 SQL 语句,没有单引号
    String sql = "select * from user where name=? and password=?";
    //得到语句对象
    PreparedStatement ps = connection.prepareStatement(sql);
    //设置参数
    ps.setString(1, name);
    ps.setString(2,password);
    ResultSet resultSet = ps.executeQuery();
    if (resultSet.next()) {
    System.out.println("登录成功:" + name);
    }
    else {
    System.out.println("登录失败");
    }
    //释放资源,子接口直接给父接口
    JdbcUtils.close(connection,ps,resultSet);
    } 
}

开发步骤

1) 获取连接
2) 开启事务
3) 获取到 PreparedStatement
4) 使用 PreparedStatement 执行两次更新操作
5) 正常情况下提交事务
6) 出现异常回滚事务
7) 最后关闭资源
点击查看代码
package com.lqg;
import com.lqg.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo12Transaction {
    //没有异常,提交事务,出现异常回滚事务
    public static void main(String[] args) {
    20 / 21
    //1) 注册驱动
    Connection connection = null;
    PreparedStatement ps = null;
    try {
    //2) 获取连接
    connection = JdbcUtils.getConnection();
    //3) 开启事务
    connection.setAutoCommit(false);
    //4) 获取到 PreparedStatement
    //从 jack 扣钱
    ps = connection.prepareStatement("update account set balance = balance - ? where
    name=?");
    ps.setInt(1, 500);
    ps.setString(2,"Jack");
    ps.executeUpdate();
    //出现异常
    System.out.println(100 / 0);
    //给 rose 加钱
    ps = connection.prepareStatement("update account set balance = balance + ? where
    name=?");
    ps.setInt(1, 500);
    ps.setString(2,"Rose");
    ps.executeUpdate();
    //提交事务
    connection.commit();
    System.out.println("转账成功");
    } catch (Exception e) {
    e.printStackTrace();
    try {
    //事务的回滚
    connection.rollback();
    } catch (SQLException e1) {
    e1.printStackTrace();
    }
    System.out.println("转账失败");
    }
    finally {
    //7) 关闭资源
    JdbcUtils.close(connection,ps);
        } 
    }
}

标签:ps,PreparedStatement,21,08,connection,2022,sql,import,name
From: https://www.cnblogs.com/hanhandeshiqing/p/16611738.html

相关文章

  • Linq-20220817更新
    一、常用函数Where:每一项数据都会经过predicate(传入的委托lambda表达式)的测试,如果对元素执行predicate后返回值为True,则这个元素会添加到结果数组中Count:每一项数据都......
  • 8.21
    题面和题解A.One线性求解约瑟夫问题.2种解法:方法一维护最后一个没有出局的人在每一轮的编号.假设一个没有出局的人上一轮的编号为id,上一轮出局的人的编号为x,那么分以......
  • 8/21 python基础学习4
    第九章类类的创建:classDog:def__init__(self,name,age):#初始化函数self.name=nameself.age=agedefsit(self):pri......
  • 2022.8.21 摆烂记录
    Preface回归Content[luoguP4310]绝世好题给定序列\(a_{1\simn}\),求子序列\(b\)的最长长度\(k\),使得\(\foralli\in[2,k],b_i\mathsf{\&}b_{i-1}\gt0\)。\(......
  • 【实验记录】8月21日-遇到普通用户内存限制的问题,
    H3K27acmkdirnamed_H3K27acmkdirnamed_H3K27ac_s1mkdirnamed_H3K27ac_s2mkdirnamed_H3K27ac_s3mkdirnamed_H3K27ac_s4(base)[xxzhang@cu08human_histone_ma......
  • 2022.8.21 CAS与原子引用(解决CAS的ABA问题)
    19、深入理解CAS什么是CAS packagecom.xing.cas; ​ importjava.util.concurrent.atomic.AtomicInteger; //原子类的底层用的cas publicclassCASDemo{  ......
  • 2022.8.21 各种锁理解
    21、各种锁理解1、公平锁和非公平锁:公平锁:非常公平,不能够插队,必须先来后到!FIFO非公平锁:非常不公平,可以插队(默认都是非公平)2、可重入锁递归锁  可重入锁sync......
  • 8.21
    ABC249G题意:给定\(n\)张牌,每张牌正面是\(a_i\),背面是\(b_i\),要求从里面任选最少一张牌,使得证明的数字异或和不超过\(m\)的同时,背面数字异或和最大。\(n\leq2000,m,a_i,......
  • 2022.8.21 多校周报
    总结牛客第九场A一眼看出是尺取法,就A了。B一道很简单的概率dp,状态和转移方程都写出来了,但想着搞前缀和优化,没想到差分,就卡死了,有点可惜。G马拉车加哈希,但卡了除了双......
  • 1081 检查密码——15分
    本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点".",还必须既有字......