javaweb实训第四天下午——JDBC深入理解(3)

简介: 4.2 拿到主键(掌握)4.2.1 为什么需要拿到Id

javaweb实训第四天下午——JDBC深入理解(2)https://developer.aliyun.com/article/new/database?spm=a2c6h.12873639.article-detail.4.16723be6eN74w3&publish=1414848#/

4.2 拿到主键(掌握)

4.2.1 为什么需要拿到Id

现在我们插入的一条数据,但是并不知道该数据的id是多少, 而我们有时候操作,需要这个id.


比如我们向product表插入一条数据,它的数量为200,但是product表里面并没有表示数量的字段,而product_store表里面含有storeNum,所有我们应该在插入数据之后,同时需要插入一条数据到product_store表里面; – 这时候我们就需要拿到product表里新插入的id;


怎么取到Id值呢?

通过求表里面Id的最大值,获取到;–但是还是存在问题;比如多个人同时访问的时候,得到的Id也可能出现问题;

 20210602101444556.png

Statement.RETURN_GENERATED_KEYS

4.2.2 Statement拿到主键的方式

对于添加来说,里面通过连接对象 拿到语言对象,通过conn.createStatement()方式取得;

需要执行的时候 通过executeUpdate方法执行, 除了executeUpdate有一个参数以外,还有

一个方法executeUpdate(String sql,int autoGeneratedKeys);


自动生成键是否可以获取;(也就是自动生成的Id键,我们可以获取)

20210602101607665.png

20210602101610845.png

获取由于执行此Statement对象而创建所有自动生成的键

20210602101624820.png

注意:

20210602101629822.png

这里并没有指定列,但是这里只有一列,所有可以通过rs.getLong(1) 方式获取

20210602101635169.png

4.2.3 PreparedStatement 拿到主键的方式

20210602101701817.png

案例:

// 编写sql语句

String sql = "insert into bank (money,name) values (?,?)";
// RETURN_GENERATED_KEYS 该常量指示生成的键应该可用于获取。
ps = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
ps.setInt(1, 600);
ps.setString(2, "tom");
ps.executeUpdate();
// getGeneratedKeys() 获取由于执行此 Statement 对象而创建的所有自动生成的键。
ResultSet rs = ps.getGeneratedKeys();
while(rs.next()){
System.out.println("主键为:"+rs.getInt(1));
}

如何在JDBC中保存数据的时候获取自动生成的主键呢?


Statement:

int executeUpdate(String sql, int autoGeneratedKeys):


执行SQL:

 参数:autoGeneratedKeys,是否需要返回自动生成的主键.常量值:Statement.RETURN_GENERATED_KEYS

ResultSet getGeneratedKeys():获取自动生成的主键

PreparedStatement:
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)  :创建PreparedStatement对象,并指定是否需要返回生成的主键. 参数的常量值:Statement.RETURN_GENERATED_KEYS

单据和单据明细:

Hibernate中可以自动返回,(底层已经封装OK).

4.3小结

总结:

  事务:指一组操作,要么同时成功,要么同时失败;

  事务的四个属性ACID:原子性,一致性,隔离性,持久性;

5.连接池

5.1 连接池思想

对于连接池,是偏理论的知识,需要掌握其中思想,不要求你们能写代码实现;

连接(connection)池: 就是用来装连接对象的容器;


为什么需要使用连接池?


一段Java代码操作数据库,需要取得连接,每次操作数据库都是需要取到一个连接,但是为什么不能用一个连接呢?–使用同一个连接,会存在线程安全的问题;

每次取到连接都需要验证用户名,密码;

问题:验证用户名和密码都需要时间吗?


假设每次验证都需要0.01s,但是我做了一个网站,同时有一千人访问,需要多少秒?

浪费10秒;

比如新浪首页,查询体育新闻,需要一条sql,查询娱乐新闻,需要一条sql,可能一个首页面,就会存在100多个请求(到数据库查询),那这样浪费多少秒?

浪费1000秒


结论:会浪费很多时间


每次请求都会创建一个connection,因此会浪费资源(内存),当同时1000人访问的时候,那就会占用很多资源,因此很浪费时间和容器操作系统崩溃;


怎么解决? 连接池

20210602102051633.png

连接池:就是用来装连接对象的容器,池;

连接池里面的连接从哪里来,从数据库来;

取到连接池里面取到连接也需要用户名和密码,也需要时间,但是Java代码取到连接只需要从连接池里面拿到,不需要用户名和密码,用完之后,还回到连接池;


20210602102134543.png

这个有点像 泡面,饿的时候,不需要每次都跑出去拿,在家里准备多一点就是;


但是这里会存在问题?

①连接池一出来就有连接嘛?

当然有,需要提前设置好连接数;

有的人用了会还回来,我下一个人在用就行了;


②如果我拿10个连接,你只有5个,怎么办?

不够的时候,又到数据库里面拿

但是现在,如果不够就到数据库拿,那我要连接池干嘛?

还是会浪费时间和资源,而且还多了中间一层;


③连接池如果放过多的连接,浪费,并且占用资源,对不对?


④如果5个人一直没有还,怎么办?

如果需要解决上面的问题,(需要研究一下火车站的问题)

不管有没有人,都需要留一个两个窗口,–有个初始窗口

1.初始容量(5)

火车站刚开始需要有几个窗口

2 如果人变多的时候,窗口不够怎么办—需要增加窗口,但是这个窗口不是随便增加

当人数比较多的时候,添加窗口;

最大数量(10)


3.如果人变少的时候,只有几个窗口 – 这时候需要最小窗口

最小数量(2)


4.如果有人占着窗口不放,怎么办?

一个人如果不是做正事,比如占了3分钟,不要占用窗口

最大连接时间(3)

5.票已经卖完的时候,还有人等待怎么办?

如果等待过长,断开连接,请求超时;


这就是连接池的理解;


连接池概述


在Java中,连接池使用javax.sql.DataSource接口来表示连接池. 这里的DataSource就是连接池。连接池就是DataSource


DataSource是接口,和JDBC一样,是Sun公司开发的一套接口,需要各大厂商实现;

需要导入相应包—导包…

所以使用连接池,首先需要导包;


常用的DataSource的实现有下面两种方式:


DBCP: Spring推荐的(Spring框架已经集成DBCP)

C3P0: Hibernate推荐的(早期)(Hibernate框架已经集成C3P0)


boneCP: 淘汰了

Hikari: 非常牛皮连接池,因为高效 Springboot集成

Druid: 阿里的,综合性能很好 功能繁多


使用连接池和不使用连接池的区别在哪里?


从代码上:

不使用连接池: Conenction对象由DriverManager获取.

Connection conn = DriverManager.(url,username,password);


使用连接池:(只有一个不同点,现在的连接需要从DataSource里面拿,DataSource需要从数据库拿,

所以我们需要把用户名和密码给连接池,连接池帮我们从数据库拿连接)

如何创建DataSource对象,如何在DataSource中设置url,账号,密码.

Connection conn = DataSource对象.getConnection();


最后使用连接池的时候,需要释放资源: 释放资源: Connection对象.close(): 是把Connection放回给连接池,而不是和数据库断开.只是连接放回到连接池

5.2 DBCP连接池实现

上面已经提到实现连接池的方式,通过DBCP和C3P0的方式; bone hakiray

它的效果和JDBC的效果一样,看不出什么效果;

下面采用DBCP的方式来实现连接池

第一步 准备jar包:

拷贝jar:

commons-dbcp-1.3.jar commons-pool-1.5.6.jar .


导入包之后,不会用–

查阅文档: commons-dbcp-1.3-src\doc\BasicDataSourceExample.java(例子)

20210602102356147.png

唯一的区别:获取连接方式不同

BasicDataSourceExample.java 取得连接

20210602102404995.png

解决DBCP的硬编码问题:

应该把连接信息放到配置文件中去: 配置文件的名词可以任意.

但是配置文件中的key,必须是BasicDataSource对象的属性(setXxx方法决定的属性);

dbcp.properties
#连接字符串
url=jdbc:mysql://localhost:3306/jdbcdemo
#用户名
username=root
#密码
password=admin
#驱动的类路径
driverClassName=com.mysql.jdbc.Driver
#连接池启动时的初始值
initialSize=1
#连接池的最大值
maxActive=50
#连接池的最大空闲数

maxIdle=20

javaweb实训第四天下午——JDBC深入理解(4)https://developer.aliyun.com/article/1414849?spm=a2c6h.13148508.setting.40.6e1a4f0eQzpjQW

目录
相关文章
|
9天前
|
SQL Java 数据库连接
java使用jdbc操作数据库
java使用jdbc操作数据库
|
1天前
|
SQL Java 关系型数据库
Java之JDBC数据库编程
Java之JDBC数据库编程
11 2
|
9天前
|
SQL Java 数据库连接
Java一分钟之-JDBC:Java数据库连接基础
【5月更文挑战第14天】JDBC是Java与关系数据库交互的API,常见问题包括资源管理、SQL注入和性能优化。易错点涉及驱动加载、空指针异常和事务管理。避免这些问题的方法有使用try-with-resources自动关闭资源、预编译PreparedStatement以防止SQL注入,以及正确管理事务。示例代码展示了基本的JDBC连接和查询。在实际开发中,推荐使用ORM框架如Hibernate或JPA来简化数据库操作。
19 1
|
9天前
|
SQL Java 关系型数据库
零基础轻松入门Java数据库连接(JDBC)
零基础轻松入门Java数据库连接(JDBC)
16 0
|
9天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
14 0
|
9天前
|
Java 关系型数据库 MySQL
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
|
9天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
9天前
|
SQL Java 数据库连接
使用JDBC进行数据库操作:Java Web开发的数据库连接
【4月更文挑战第3天】Java Web开发中,JDBC是与数据库交互的关键,提供统一访问关系型数据库的规范。核心组件包括DriverManager、Connection、Statement和ResultSet。使用流程涉及加载驱动、建立连接、创建Statement、执行SQL及处理结果,最后关闭资源。最佳实践包括使用try-with-resources、PreparedStatement、事务管理等。在Web开发中,JDBC用于用户认证、数据持久化、检索和事务管理。虽然有ORM工具,但掌握JDBC基础仍然重要。
|
9天前
|
SQL Java 数据库连接
Java的JDBC编程
Java的JDBC编程
|
9天前
|
SQL Java 关系型数据库
Java学习—JDBC
Java学习—JDBC