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也可能出现问题;
Statement.RETURN_GENERATED_KEYS
4.2.2 Statement拿到主键的方式
对于添加来说,里面通过连接对象 拿到语言对象,通过conn.createStatement()方式取得;
需要执行的时候 通过executeUpdate方法执行, 除了executeUpdate有一个参数以外,还有
一个方法executeUpdate(String sql,int autoGeneratedKeys);
自动生成键是否可以获取;(也就是自动生成的Id键,我们可以获取)
获取由于执行此Statement对象而创建所有自动生成的键
注意:
这里并没有指定列,但是这里只有一列,所有可以通过rs.getLong(1) 方式获取
4.2.3 PreparedStatement 拿到主键的方式
案例:
// 编写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人访问的时候,那就会占用很多资源,因此很浪费时间和容器操作系统崩溃;
怎么解决? 连接池
连接池:就是用来装连接对象的容器,池;
连接池里面的连接从哪里来,从数据库来;
取到连接池里面取到连接也需要用户名和密码,也需要时间,但是Java代码取到连接只需要从连接池里面拿到,不需要用户名和密码,用完之后,还回到连接池;
这个有点像 泡面,饿的时候,不需要每次都跑出去拿,在家里准备多一点就是;
但是这里会存在问题?
①连接池一出来就有连接嘛?
当然有,需要提前设置好连接数;
有的人用了会还回来,我下一个人在用就行了;
②如果我拿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(例子)
唯一的区别:获取连接方式不同
BasicDataSourceExample.java 取得连接
解决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