JDBC
SQL是直接访问数据,而JDBC是一种用于执行SQL语句的Java的API
JDBC两大类:
面向开发人员:作为是API
面向数据库厂商:是接口
JDBC步骤:
1、导入数据库jar包——1、拷贝jar文件到工程下lib文件夹2、配置BuildPath构建路径
2、加载驱动——告诉驱动管理器,我们要操作的是哪个数据库
Class.forName(’'com.mysql.jdbc.Driver");
3、获取连接——Connection接口
Connection con=DriverManager.gerConection(“jdbc:mysql://127.0.0.1:3306/j172?useUnicode=true&characterEncodion=UTF-8”,用户名,密码)补充知识:URL统一资源定位符
协议://ip地址:端口号/具体资源?参数名1=值1&参数2=值2
4、关闭连接
先关Statement,再关Connection
.close()
5、构建SQL语句
口诀:选中双引号双加号
6、获取语句对象——Statement
Statement state=con.createStatement();
7、让语句对象执行SQL语句——DML语句调用executeUpdate() 返回Int类型 ,DQL语句调用executeQuery()返回结果集(ResultSet)
DQL语句用next()方法来查询如果查到返回true同时可以取该行,没查到返回flase
取数据:get数据类型(列名)若有别名用别名取数据
SQL注入
当SQL语句的部分内容采用字符串拼接的方式执行,那么有可能发生注入的字符串改变原有结构,这被称为SQL注入。
解决方式:
1、SQL语句执行之前,先把SQL的结构交给数据库进行预先编译;这样先让SQL的结构固定下来;然后再通过传参的方式,放入字符串条件值。————关键字PrepareStatement
步骤:
1、SQL语句首先确定结果,需要传的值的位置用?占位符代替
2、交给数据库预编译:con.prepareStatement(sql);返回的是PrepareStatement对象
3、设置值,set数据类型(?的下标,真正的值)
4、执行这个SQL语句,executeUpdate() ;executeQuery()但是可以不用再次传值了
怎么在获取语句对象的时候要求返回生成的主键?
在获取语句对象的时候,传入RETURN_GENERATED_KEYS,要求返回自动生成的主键(PrepareStatement;Statement都有)
步骤:
ResultSet rs=ps.getGeneratedKeys();——完成主键查询
key=rs.getInt———通过结果集获取当条新增记录的主键
事务操作:
在复杂业务当中,我们有可能需要执行多条DML语句,才能完成一个完整的业务操作。而多条DML语句要同时成功才能代表该业务成功;只要有一个失败该业务失败,其他没有失败的也要恢复开始状态。
事务的四大特征(ACID特性):
1、原子性;指代的是业务不可再分的,那么完成这个业务的多条DML语句组成了完成这个业务的基本单位。
2、一致性;业务最终执行的结果要么DML全部成功要么DML全部失败
3、隔离性;该业务的多条SQL必须作为一个整体完成,SQL与SQL之间不能被别的业务插入
4、持久性;指代的是事物重点考虑的是DML语句,这种影响数据持久化的操作
步骤:
1、开启事务;设置自动提交为假(在try块最前面)——con.setAutoCommit(false)
2、所有DML成功,则提交事务;手动提交(在try块最后)——con.commit();
3、只要发生失败,事务回滚;con.rollback();——在catch块中回滚
注意:
事务的多条DML语句,在JDBC实现中,首先要保证它们用的是同一个Connection对象
JDBC小结:
1、JDBC中下标都是从1开始
2、不用滥用PrepareStatement语句的数目最好不用过多,因为数据库预编译以后会存放这些预编译语句,过多会让数据库负担过重;最好使用在需要外部输入的时候使用
3、JDBC中的setDate方法是要求传入sql包中的Date,而我们在Bean的属性设计中用的是util包中的Date,需要做转换——new java.sql.Date(new Date().getTime())