Java 连接数据库
-
导jar包:驱动
-
加载驱动类:Class.forName(“类名”);
-
给出url,usename,password
-
使用Drive
jdbc四大参数
-
driverClassName:com.mysql.jdbc.Driver ,mysql jar包的Driver类名路径
-
url:jdbc:mysql://localhost:3306/数据库名
-
username:用户名
-
password:密码
url格式: jdbc:数据库厂商:子协议
子协议由厂商决定的
准备四大参数
加载驱动类
得到Connection
对数据库进行增删改
1.通过Connection对象,createStatement方法创建Statement
2.通过Statement的executeUpdate()发送sql语句,返回的是int类型,表示影响几行数据
对数据库进行查询
返回的是一张表格
1.通过Connection对象,createStatement方法创建Statement
2.通过Statement的executeQuery()发送sql语句,这个必须就是查询sql语句
返回的是结果集,就是一张表
3.解析这个结果集 ResultSet
ResultSet 里面有一个行光标
行光标,默认在 第一行数据的上面 BeforFirst
最后放到最后行数据的下面,AfterLast
结果集ResultSet的next()方法,移动行光标,有返回值,boolean类型,表示移动后的行是否存在
锁定行后,进行读取这一行
ResultSet提供一系列getXXX()方法
get各种类型
比如getInt(1),表示当前行的第1列
可以通过列编号,也可以通过列名称
4.关闭资源
倒关,先得到的对象后关闭,后得到的对象先关闭
re.close
stmt.close
con.close 这个必须要关,不关后果严重
代码规范化
try catch finally
在try 外给出引用的定义
在try内进行对象的实例化
在finally中进行关闭 ,关闭要进行判断 if语句进行判断是否为空
注意:
Connection 最为重要的是获取Statement,Statement stmt = con.creaStatement();
还有不同参数的方法:Statement stmt = con.creaStatement(int,int);这俩个参数用来确定Statement生成的结果集的构成
Statament 最为重要的方法:
-
int execteUpdate(String sql) ,执行更新操作,即 insert,updata ,delete语句等
-
ResultSet executeQuery(String sql),执行查询操作,返回一个ResultSet结果集
-
boolean execute(),这个方法用来这些增删改查所有sql语句,返回布尔类型,表示语句是否有结果。
如果execute()方法执行的是更新语句,那么还要调用int getUpdateCount ()方法获取sql语句所影响的行数
查询语句的话,还需要调用ResultSet getResultSet() 来获取查询结果
ResultSet 结果集
默认的结果集不能滚动,只能下一行 使用next()方法
滚动结果集,下面方法都有
相对的:下一行,上一行,下N行,上N行
绝对的:到N行
没有第0行,从第一行开始
一种是判断光标位置,一种是用来移动光标
获取结果集的元数据
得到元数据:rs.getMetaData(),返回值为ResultSetMetaData
ResultSetMetaData 有 getColumnCount()方法 ,返回ResultSet对象的列数
还有 获取指定列的名称 getColumnName(int collndex)
也可以直接使用ResultSet 的get方法,可以通过索引也可以通过名称访问列
结果集是否是支持滚动的,得从Connection 的createStatement()方法说起,创建的Statement 决定了Statement创建的ResultSet是否支持滚动
结果集的特性
-
是否可滚动
-
是否敏感
-
是否可更新
在使用Connection类的createStatement方法时,就已经确定结果集的特性
createStatement()无参的方法, 生成的结果集就是不可滚动,不敏感,不可更新的
createStatement() 有参的方法:
俩个参数:
第一个参数:
ResultSet.TYPE.FORWARO_ONLY 不滚动
ResultSet.TYPE_SCROLL_INSENSITIVE 滚动结果接,但结果集不会随着数据库的变化而变化
ResultSet.TYPE_SCROLL_SENSITIVE 滚动结果集,敏感的,但是没有会实现这个功能太耗费资源
第二个参数:
CONCUR_READ_ONLY: 结果集是只可读的,不能通过修改结果集来影响数据库
CONCUR_UPDATABLE :结果集可更新的,对结果集的更新能影响数据库
Mysql 默认的就是会创建滚动的结果集,即使是使用的无参的Connection的creaStatement方法
PreparedStatement
-
是Statement 接口的子接口
-
可以防SQL攻击
-
提高代码的可读性,可维护性
-
提高效率
SQL攻击
sql语句,我们输入的字符串, 会导致了sql语义变化
采用SQL模板:所有的参数用?替代
调用Connection的方法 得到PreparedStatement 对象
所以说,使用PreparedStatement,不需要创建Statememnt对象了,创建PrepareStatement对象,放入sql语句参数
然后调用pstmt 的setXXX()方法,给? 赋值
比如:setString(1,usename) 给第一个问号赋值,usename参数,并且这个参数是String类型的
然后调用pstmt 的方法 executeQuery()查询方法 或者 executeUpdata() 修改方法,返回的也是结果集。然后对结果集操作
预处理的原理
服务器的工作:
校验SQL的语法
编译,将sql语句 变成一个类似函数的东西
执行:调用这个函数
PreparedStatement:
前提: 连接的数据库必须支持预处理
每一个pstmt 都与一个sql模板 绑定一起。先把sql模板 给数据库,数据库先校验,在进行编译。执行时,只是把参数传递过去
若二次执行,就不用再次校验 和编译。直接进行执行。
MySQL 默认预处理是关的
JDBC UTILS
使用 JDBC utils 来连接数据库 创建连接
通过配置文件,将四大参数 通过键值对,配置在文件中
然后执行jdbc Utils 方法时 ,先加载配置文件, 之后 会加载驱动类
之后使用JDBC Utils 中的getConnection方法来创建 Connection 对象, 建立连接