JDBC超详细笔记,2024年最新kafka分布式原理

6. Statement和PreparedStatement的区别

=====================================================================================================

Statement:

  • 执行对象执行对应的sql语句(DDl,DQL,DML)
  • DDL/DML:executeUpdate(String sql) — >int
  • DQL:executeQuery(String sql) ---->ResultSet 结果集
  • 安全隐患:
*   在拼接sql语句,使用一些关键字和表中的字段进行拼接(SQL注入)
*   执行效率低
*   录入不存在用户名以及不存在密码依然可以登录成功

PreparedStatement:

  • 获取预编译对象,会将参数化的sql发送给数据库
  • 通过setXXX(参数1,参数2)给这些占位符进行赋值
*   XXX:表示类型 :给id字段设置数据如:setInt(1,1)
*   参数1:当前预编译的sql语句中的第几个占位符
*   参数2:给当前这个占位符赋值的实际值是什么
  • 预编译对象进行参数赋值
*   预编译对象.setString(1,“zhangsan”)
*   预编译对象.setString(2,“123”) ;
  • 特点:
*   防止的SQL注入(更安全的)
*   执行效率高

7. 综合案例—登录

==============================================================================

7.1 创建表并插入数据


CREATE TABLE user(

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(20) NOT NULL,

password VARCHAR(20) NOT NULL,

phone VARCHAR(11)

)CHARSET = utf8;

INSERT INTO user(username, password,phone) VALUES (‘kaka’,‘123’,‘12345678910’);

INSERT INTO user(username, password,phone) VALUES (‘tangtang’,‘456’,NULL);

SELECT * FROM user;

7.2 实现登录


/**

  • 登录操作

  • 通过控制台,用户输入用户名和密码;

  • 用户输入的用户名和密码作为参数,编写查询SQL语句;

  • 如果查询到用户,则用户存在,提示登录成功,反之,提示失败;

*/

import java.util.Scanner;

import java.sql.*;

public class TestSafeLogin {

public static void main(String[] args) throws Exception{

Scanner sc = new Scanner(System.in);

System.out.println(“请输入用户名:”);

String username = sc.next();

System.out.println(“请输入密码:”);

String password = sc.next();

//1.注册驱动

Class.forName(“com.mysql.jdbc.Driver”);

//2.获得连接

String url = “jdbc:mysql://localhost:3306/companydb?useUnicode = true&characterEncoding = utf8”;

Connection connection = DriverManager.getConnection(url,“root”,“root”);

//3.获取执行的对象

String sql =“select * from user where username = ? and password = ?”;

//预编译

PreparedStatement preparedStatement = connection.prepareStatement(sql);

//为SQL语句赋值

preparedStatement.setString(1,username);

preparedStatement.setString(2,password);

//4.执行SQL语句

ResultSet resultSet = preparedStatement.executeQuery();

//5.处理结果

if(resultSet.next()){

System.out.println(“登录成功”);

}else{

System.out.println(“登录失败”);

}

//6.释放资源

resultSet.close();

preparedStatement.close();

connection.close();

}

}

8. 封装工具类

============================================================================

8.1 jdbc.properties


  • 在src目录下新建jdbc.properties文件

driver = com.mysql.jdbc.Driver

url = jdbc:mysql://localhost:3306/db0707?useUnicode=true&characterEncoding=utf8

user = root

password = root

8.2 JDBCUtils.java


  • 工具类的实现

public class JDBCUtils {

//定义成员

private static String url;

private static String user;

private static String password;

private static String driver;

static{

try {

Properties prop = new Properties();

ClassLoader classLoader = JDBCUtils.class.getClassLoader();

URL urlPath = classLoader.getResource(“jdbc.properties”);

String path = urlPath.getPath();

prop.load(new FileReader(path));

url = prop.getProperty(“url”);

user = prop.getProperty(“user”);

password = prop.getProperty(“password”);

//加载驱动

Class.forName(prop.getProperty(“driver”));

} catch (Exception e) {

e.printStackTrace();

}

}

//获取数据库连接对象

public static Connection getConnection(){

try {

Connection conn = DriverManager.getConnection(url, user, password);

return conn;

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

//释放资源(DDL、DML)

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();

}

}

}

//针对DQL语句的关闭

public static void close(ResultSet rs,Statement stmt,Connection conn) {

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();

}

}

}

}

9. ORM(Object Relational Mapping)

=====================================================================================================

ORM(Object Relational Mapping)

从数据库查询到的结果集(ResultSet)在进行遍历时,逐行遍历,取出的都是零散的数据。在实际应用开发中,我们需要将零散的数据进行封装整理;

9.1 创建表


CREATE TABLE user(

id INT PRIMARY KEY,#主键

username VARCHAR(20) NOT NULL,

password VARCHAR(20) NOT NULL,#非空

sex CHAR(2),

email VARCHAR(50) NOT NULL,

address VARCHAR(20) NOT NULL

)CHARSET = utf8;

INSERT INTO user (id,username,password,sex,email,address)

VALUES (1001,‘kaka’,‘123’,‘男’,‘123456789@qq.com’,‘陕西省’);

9.2 封装工具类


/**

  • 数据库工具类

  • 1.获取连接 connection

  • 2.释放资源

  • 可跨平台方案

*/

import java.io.*;

import java.sql.*;

import java.util.Properties;

public class DBUtils{

//配置文件集合 永远不变

private static final Properties properties = new Properties();

static {

try {

//使用类自带的流

//首次使用工具类,触发类加载

InputStream is = DBUtils.class.getResourceAsStream(“/db.properties”);

//通过流将配置信息的内容分割成键值对

//将is流中的配置文件信息,加载到集合中

properties.load(is);

Class.forName(properties.getProperty(“driver”));

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//获得连接

public static Connection getConnection(){

Connection connection = null;

try {

connection = DriverManager.getConnection(properties.getProperty(“url”),properties.getProperty(“username”),properties.getProperty(“password”));

} catch (SQLException e) {

e.printStackTrace();

}

return connection;

}

//释放资源

public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {

try {

if (resultSet != null) {

resultSet.close();

}

if (statement != null) {

statement.close();

}

if (connection != null) {

connection.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

9.3 User类


public class User {

private int id;

private String username;

private String password;

private String sex;

private String email;

private String address;

public User(){}

@Override

public String toString() {

return “User{” +

“id=” + id +

“, username='” + username + ‘’’ +

“, password='” + password + ‘’’ +

“, sex='” + sex + ‘’’ +

“, email='” + email + ‘’’ +

“, address='” + address + ‘’’ +

‘}’;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public User(int id, String username, String password, String sex, String email, String address) {

this.id = id;

this.username = username;

this.password = password;

this.sex = sex;

this.email = email;

this.address = address;

}

}

9.4 OrmSelect类


/**

  • ORM查询

*/

import java.sql.*;

public class OrmSelect {

public static void main(String[] args) {

Connection connection = DBUtils.getConnection();

String sql = “select id,username,PASSWORD,sex,email,address from user;”;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

preparedStatement = connection.prepareStatement(sql);

resultSet = preparedStatement.executeQuery();

//拿到每一行数据

while (resultSet.next()) {

//拿到每一列的数据

User user = new User();

int id = resultSet.getInt(“id”);

String username = resultSet.getString(“username”);

String password = resultSet.getString(“password”);

String sex = resultSet.getString(“sex”);

String email = resultSet.getString(“email”);

String address = resultSet.getString(“address”);

//将零散的数据,封装在User对象里

user.setId(id);

user.setUsername(username);

user.setPassword(password);

user.setSex(sex);

user.setEmail(email);

user.setAddress(address);

System.out.println(user);

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

DBUtils.closeAll(connection, preparedStatement, resultSet);

}

}

}

10. DAO(Data Access Object)

===============================================================================================

DAO(Data Access Object)数据访问对象:将所有对同一张表的操作都封装在一个XXXDaoImpl对象中、根据增删改查的不同功能,实现具体的方法(insert,update,delete,select,selectAll);

  • 对于任何一张表中的数据进行操作时(增、删、改、查);应将对于一张表的所有操作统一封装在一个数据访问对象中为了实现重用;

10.1 创建表


CREATE TABLE employee(

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(30),

sex VARCHAR(2),

salary DOUBLE

) CHARSET = utf8;

10.2 创建Employee类


public class Employee {

private int id;//工号

private String name;//名字

private String sex;//性别

private double salary ;//工资

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public double getSalary() {

return salary;

}

public void setSalary(double salary) {

this.salary = salary;

}

@Override

public String toString() {

return “employee [id=” + id + “, name=” + name + “, sex=” + sex + “, salary=”

  • salary + “]”;

}

public Employee() {

super();

// TODO Auto-generated constructor stub

}

public Employee(int id, String name, String sex, double salary) {

super();

this.id = id;

this.name = name;

this.sex = sex;

this.salary = salary;

}

}

10.3 封装工具类


见第7个板块

10.4 UserDaoImpl


/*

*对数据库中emp;oyee表的一系列操作(增删改查)

*实现增删改查

*/

public class UserDaoImpl {

private Connection conn = null;

private PreparedStatement stmt = null;

private ResultSet rs = null;

//增加

public int insert(Employee emp){

try {

//数据库连接对象

conn = JDBCUtils.getConnection();

//编写SQL语句

String sql = “insert into employee (id,name,sex,salary) values(?,?,?,?);”;

//预编译对象

stmt = conn.prepareStatement(sql);

//执行更新

stmt.setInt(1, emp.getId());

stmt.setString(2, emp.getName());

stmt.setString(3, emp.getSex());

stmt.setDouble(4, emp.getSalary());

int i = stmt.executeUpdate();

return i;

} catch (Exception e) {

e.printStackTrace();

} finally{

JDBCUtils.close(stmt, conn);

}

return 0;

}

//删除

public int delete (int id){

conn = JDBCUtils.getConnection();

String sql = “delete from employee where id = ?”;

try {

stmt = conn.prepareStatement(sql);

//获取id

stmt.setInt(1, id);

return stmt.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally{

JDBCUtils.close(stmt, conn);

}

return 0;

}

//修改

public int update(Employee emp){

conn = JDBCUtils.getConnection();

String sql = “update employee set name = ?,sex = ?,salary = ? where id = ?”;

try {

stmt = conn.prepareStatement(sql);

//执行更新

stmt.setString(1, emp.getName());

stmt.setString(2, emp.getSex());

stmt.setDouble(3, emp.getSalary());

stmt.setInt(4, emp.getId());

return stmt.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally{

JDBCUtils.close(stmt, conn);

}

return 0;

}

//查询

public List selectAll(){

conn = JDBCUtils.getConnection();

String sql = “select id,name,sex,salary from employee”;

List empList = new ArrayList();

try {

stmt = conn.prepareStatement(sql);

rs = stmt.executeQuery();

while(rs.next()){

int id = rs.getInt(“id”);

String name = rs.getString(“name”);

String sex = rs.getString(“sex”);

double salary = rs.getDouble(“salary”);

Employee emp = new Employee(id, name, sex, salary);

//每封装完一个对象,添加到集合当中

empList.add(emp);

}

return empList;

} catch (SQLException e) {

e.printStackTrace();

}finally {

JDBCUtils.close(stmt, conn);

}

return null;

}

}

10.5 测试类


public class JDBCTest {

public static void main(String[] args) {

//新增

UserDaoImpl udi = new UserDaoImpl();

Employee emp = new Employee(3,“wangwu”,“nv”,4555);

int result = udi.insert(emp);

if(result > 0){

System.out.println(“success”);

}else{

System.out.println(“defeat”);

}

//删除

int result = udi.delete(3);

System.out.println(result);

//修改

Employee emp = new Employee(1,“kaka”,“m”,12345);

int result = udi.update(emp);

System.out.println(result);

//查询

List empList = udi.selectAll();

empList.forEach(System.out::println);

}

}

11. 日期类型

============================================================================

  • java.util.Date
java语言常规应用层面的日期类型;可以通过字符串创建对应的时间对象;**无法直接通过JDBC插入数据库**
  • java.sql.Date
不可以通过字符串创建对应的时间对象;只能通过毫秒值创建对象;**可以直接通过JDBC插入数据库**

sql赋util可以,util赋sql不行,因为sql是util的子类;

11.1 日期格式化工具


  • SimpleDateFormat 日期格式化

//自定义一个时间

String str = “2020-02-02”;

//日期转换将字符串转为 java.util.Date

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);

//将日期字符串转换成 util.Date类型

java.util.Date utilDate = sdf.parse(str);

System.out.println(utilDate);

11.2 日期工具类


/**

  • 日期转换

  • 字符串转UtilDate

  • 字符串转SqlDate

  • utilDate转成SqlDate

*/

import java.text.ParseException;

import java.text.SimpleDateFormat;

public class DateUtils {

private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd”);

//字符串转Util

public static java.util.Date strToUtilDate(String str) {

try {

return simpleDateFormat.parse(str);

} catch (ParseException e) {

e.printStackTrace();

}

return null;

}

//字符串转sql(不常用)

public static java.sql.Date strToSqlDate(String str){

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd”);

try {

java.util.Date date = simpleDateFormat.parse(str);

return new java.sql.Date(date.getTime());

} catch (ParseException e) {

e.printStackTrace();

}

return null;

}

//util转sql

public static java.sql.Date utilToSql(java.util.Date date){

return new java.sql.Date(date.getTime());

}

}

11.3 测试类


public static void main(String[] args) throws ParseException{

//1.java.util.Date

// 当前系统时间

System.out.println(new java.util.Date());

//自定义一个时间

String str = “2020-02-02”;

//日期转换将字符串转为 java.util.Date

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);

//将日期字符串转换成 util.Date类型

java.util.Date utilDate = sdf.parse(str);

System.out.println(utilDate);

//sql.Date 需要毫秒值,来构建一个日期

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

System.out.println(sqlDate);

java.util.Date date = DateUtils.strToUtilDate(“2020-03-28”);

System.out.println(date);

java.sql.Date date2 = DateUtils.utilToSql(date);

System.out.println(date2);

}

}

12. JDBC事务

==============================================================================

使用JDBC操作事务,在对业务进行操作的时候,将业务操作使用事务进行管理,操作结果要么同时成功,要么同时失败;

  • void setAutoCommit(boolean autoCommit):
参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务
  • void commit():提交事务
  • void rollback():回滚事务

12.1 开发步骤


  1. 获取连接
  1. 开启事务
  1. 获取到 PreparedStatement
  1. 使用 PreparedStatement 执行两次更新操作
  1. 正常情况下提交事务
  1. 出现异常回滚事务
  1. 关闭资源

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

====

使用JDBC操作事务,在对业务进行操作的时候,将业务操作使用事务进行管理,操作结果要么同时成功,要么同时失败;

  • void setAutoCommit(boolean autoCommit):
参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务
  • void commit():提交事务
  • void rollback():回滚事务

12.1 开发步骤


  1. 获取连接
  1. 开启事务
  1. 获取到 PreparedStatement
  1. 使用 PreparedStatement 执行两次更新操作
  1. 正常情况下提交事务
  1. 出现异常回滚事务
  1. 关闭资源

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-72pDieyK-1712649223519)]
[外链图片转存中…(img-moTtQlNl-1712649223519)]
[外链图片转存中…(img-mpRcAab2-1712649223520)]
[外链图片转存中…(img-1OvpKh51-1712649223520)]
[外链图片转存中…(img-qj1x6wIT-1712649223520)]
[外链图片转存中…(img-L6egA6Zh-1712649223521)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-IcqbTzQN-1712649223521)]

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

[外链图片转存中…(img-gg4pipB1-1712649223521)]

[外链图片转存中…(img-8gLCOeUz-1712649223521)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-o8QIv5YR-1712649223522)]

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值