JDBC之预编译事务批处理存图片
2019-09-29 16:34 老九君 阅读(229) 评论(0) 收藏 举报
Statement接口作用
用于进行Java程序和数据库之间的数据传输
具体类有3个实现
Statement
用于对数据库进行通用访问,使用的是静态sql
PreparedStatement
PreparedStatement 用于预编译模板SQL语句,在运行时接受sql输入参数
CallableStatement
要访问数据库存储过程时使用
也可以接受运行时输入参数。
预编译语句
PreparedStatement 用于预编译模板SQL语句
在性能和代码灵活性上有显著地提高
PreparedStatement 对象使用 ? 作为占位符,即参数标记;
使用 setXXX( index,value) 方法将值绑定到参数中
每个参数标记是其顺序位置引用,注意 index 从 1 开始;
PreparedStatement 对象执行SQL语句
executeQuery()

executeUpdate()

什么是sql注入
就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
使用预编译语句的好处就是可以防止SQL注入

为什么PrepareState就能够防注入
之所以PreparedStatement能防止注入,
是因为它把单引号转义了,变成了\',
这样一来,就无法截断SQL语句,进而无法拼接SQL语句 基本上没有办法注入了。
处理事务
默认情况下, 事务是自动提交的,要设置为手动提交
处理事务过程
关闭自动提交
conn.setAutoCommit(false);
没有问题时,提交事务
conn.commit();
出现异常时,进行回滚操作
conn.rollback()
回滚之后,事务结束。释放资源
出现异常,没有提交,也不会更新数据库,但是会占用资源
所以要出现异常时,进行回滚操作
只有增、册、改才需要事务,查询不需要事务
以后发现自己写的代码是正确的,测试也成功,但是数据库当中的数据不变,肯定是事务没有提交
InnoDB才支持外键和事务。MyISAM不支持外键和事务
转账示例:

这里顺便把批处理也给提一下
需要添加参数


使用批处理,会大大减少处理时间。
数据库当中的BLOB
存储图片、音频、视频等多媒体信息都是以二进制流的形式存储
真正开发中不会把二进制的文件存放在数据库当中
而是把文件存储的路径保存在数据库当中,以后再取出路径,到该路径下读取信息

获取自动生成的主键
在我们设置设计表时,会设置主键,自动增长的主键
有时候我们插入数据时,要想知道我们生成的主键是多少
需求场景
用户注册时,添加用户名,密码后,插入到数据库当中,跳转成完善个人信息页,完善信息更新到刚插入的那个记录当中,所以要获取刚插入的那个主键是多少。不能使用用户名来做条件,用户名有重名情况
所以插入完后,就应该获取刚插入的那个主键。
获取方法
Statement语句
创建语句时,设置可以获取主键
st.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS)
通过语句对象的getGeneratedKeys获取主键
Preparement语句
在创建语句时,传入参数
Statement.RETURN_GENERATED_KEYS
通过语句对象的getGeneratedKeys获取主键

老九学堂会员社群出品
浙公网安备 33010602011771号