初始JDBC
概念:
Java DataBase Connectivity :Java数据库连接,Java语言操作数据库。官方定义一套操作所有关系型数据库的规则,即接口,各数据库厂商去实现这套接口,提供数据库驱动jar包,可以使用接口编程,真正执行的代码时驱动jar包中的实现类。
引入jar包
这里演示idea导入jar包:快捷键shift+alt+ctrl+s打开项目结构进行导入:
JDBC基本使用:
DriverManager(驱动管理对象)
驱动管理对象:告诉程序该使用哪一个品牌的数据库。(注册驱动)
- 数据库连接
url:指定连接的路径
#语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
#例子:jdbc:mysql://localhost:3306/tb_student
注意:如果连接的是本机mysql服务器,并且端口为3306,则url简写为:jdbc:mysql://数据库名称
user:用户名
password:密码
Connection(数据库连接对象)
数据库连接对象:用于将数据连接上之后使用的对象。
Statement(执行sql的对象)
执行sql的对象
- boolean execute(String sql) #执行给定的 SQL 语句,该语句可能返回多个结果
可以执行任意的sql,了解即可 - int executeUpdate(String sql)
执行DML(insert ,update , delete)语句、DDL(create,alter,drop)语句
返回值:影响的行数,通过影响的行数判断DML语句是否执行成功,返回值>0,执行成功,反之失败。 - ResultSet executeQuery(String sql)
执行DQL(select) 语句
PreparedStatement(执行sql的对象)
执行sql的对象(是 Statement的子接口):此对象是先编译sql后执行sql语句的对象
SQL注入问题:
在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
a:输入用户随便,输入密码:a’ or ‘a’ = ‘a,最后sql编译时候会变成以下sql语句,从而使sql曲解了sql语句的原意。
select * from user where username = ‘admin’ and password = 'a' or 'a' = 'a'
解决SQL注入问题:
使用PrepareStatement对象可以解决sql注入问题,PrepareStatement特点先编译sql语句后执行sql语句,也就是说无论用户输入什么字符都不会参与到sql执行中,从而达到无法sql注入现象。
使用PreparedStatement对象
参数可以使用 ? 作为占位符,从而让sql语句先编译,然后,在调用setInt或其他数据类型(调用什么数据类型的方法取决于sql数据中是什么数据类型)
String sql = "update tb_student set sname = ? where cno=101";
// 因为sname在sql中式varchar数据类型所以不可设置其他数据类型方法
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1,"张三" );
ResultSet(结果集对象)
返回结果集对象
Boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果有数据则返回true,如果没有数据则返回false。
getXXX(参数):代表数据类型
XXX:表是数据类型(若获取int的则为getInt(),如果是String则是getString,其余的与之类似)
参数1:可以按照sql查询出来的列查询(不推荐)
sql语句: sql语句(select cno,cname from tb_student) ResultSet.getInt(1); // 指的是cno ResultSet.getInt(2); // 指的是cname
参数2:可以按照sql语句名称(别名)查询(推荐)
sql语句: sql语句(select cno,cname from tb_student) ResultSet.getInt("cno"); // 指的是cno ResultSet.getInt("cname"); // 指的是cname
结果集执行顺序:
while (rs.next()) { // 如果有数据,则取数据 // 以下程序是以列行数获取,注:起始列:1 /*String cno = rs.getString(1); String cname = rs.getString(2); System.out.println(cno + "," + cname);*/ // 以下程序不是以下标获取以列的名字获取,注:如果select中有别名则以别名获取,没有则以字段名获取 String cno = rs.getString("cno"); String cname = rs.getString("cname"); System.out.println(cno + "," + cname); }
遍历结果集执行顺序:
- 游标向下移动一行,
- 判断是否有数据
- 如果有数据返回true,获取数据
- 如果无数据返回false,循环结束
JDBC事务
JDBC中默认默认是自动提交事务。如果需要手动提交事务需要修改。
开启事务
void setAutoCommit(boolean autoCommit) //将此连接的自动提交模式设置为给定状态。
// 调用该方法,设置参数为false,即开启事务
提交事务
void commit()
// 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection对象当前持有的所有数据库锁。
回滚事务
void rollback()
// 取消在当前事务中进行的所有更改,并释放此Connection对象当前持有的所有数据库锁