day09
jdbc
jdbc简介
-
概述:
- JDBC(Java DataBase Connectivity)SUN公司提供的一套操作数据库的标准规范
JDBC规范
-
掌握四个核心对象
jdbc 的相关的类与接口:
Driver: 这个数据库厂商提供的驱动类 (数据库的基本信息) DriverManager :驱动管理类: 用于获取连接 需要传递三个参数 Connection :得到数据库连接对象,才能对数据库进行增加删除 修改 查询等等 Statement 给数据库发送sql 的对象 PreparedStatement 也是发送sql 的对象 是Statement 对象的子类 ResultSet 返回的结果集对象
ResultSet 就是一个结果集(迭代器) next 类似于迭代器的hasnext()判断是否有下一个元素
- DriverManager驱动管理类
- Connection连接对象
- Statement操作数据库对象
- ResultSet 结果集对象
-
JDBC规范(接口)在哪里:
-
JDK中:
-
java.sql.*;
-
javax.sql.*
- 扩展包
-
数据库厂商提供的驱动:jar文件
-
-
如何使用:
jdbc操作数据库的步骤:
-
1、创建项目 导入jar包
-
2、注册驱动
- Class.forName(“com.mysql.jdbc.Driver”);
-
3、获取连接
-
DriverMananger.getConnection();
-
参数:
-
url
url:地址,一般是jdbc:mysql://localhost:3306/student?characterEncOding=utf-8&serverTimezone=GMT%2B8&useSSL=false,user:用户名,pwd:密码
jdbc+表示主协议:也就是使用jdbc来进行连接的
mysql:表示子协议:也就是连接的数据是mysql数据库
localhost:表示本机的地址
3306 数据库的端口号
student 表示连接的库名
? 后面都表示拼接的参数(可不写)
characterEncoding=utf-8 设置编码格式
serverTimezone=GMT%2B8 设置时区 相差8个小时
useSSL=false 解决兼容性问题
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称:
- jdbc:mysql://localhost:3306/day08
- jdbc:mysql:///day08
-
username 用户名
- root
-
password 密码
- root
-
-
-
4、获取可执行对象
- con.createStatement();
-
5、获取结果集对象
-
ResultSet result =statement.executeQuery(sql);
- 查询
-
int row =executeUpdate(sql)
- 增删改
-
boolean flag =execute();
- 执行查询如果查询到返回true
- 执行增删改的时候 如果成功 返回false
-
-
6、关闭资源
- result.close();
- stetament.close();
- con.close();
-
事例:
//删除
public void delete() {
// TODO Auto-generated method stub
try {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 建立链接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/secndsql", "root", "root");
// 创建数据库对象
Statement createStatement = con.createStatement();
// 编写sql语句
String sql = "delete from test where id=3";
/* 查询调用该语句 executeQuery(sql)
* //创建查询语句 ResultSet executeQuery = createStatement.executeQuery(sql);
*
* 返回的是一个结果集 while (executeQuery.next()) { executeQuery.getString(1); }
*/
/* 创建sql删除语句 增删改都是调用该方法 executeUpdate(sql) */
/* 返回的是受影响的行数 */
int row = createStatement.executeUpdate(sql);
if (row > 0) {
System.out.println("删除成功!");
}
//关闭资源 executeQuery createStatement con
createStatement.close();
con.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 单元测试
- junit test:测试,作用:局部测试,其实就是写一个方法- @Test @After @Before
- 方法前调用写@Test:运行时调用该方法
- 方法前调用写@After:运行后调用该方法
- 方法前调用写@Before:运行前调用该方法
- 要求:
- 方法修饰符只能是public
- 不允许有参数和返回值
- 不允许是静态方法
- @Test @After @Before
//修改
@Test
public void alter() {
// TODO Auto-generated method stub
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//创建连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myfirstsql","root","root");
//创建数据库对象
Statement createStatement = connection.createStatement();
String sql="update secsql set 绩点='9.9' where id=2";
int i = createStatement.executeUpdate(sql);
if (i>0) {
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
createStatement.close();
connection.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- JDBC实现增删改查
JDBC实现增删改查- DML
- executeUpdate()
增删改时调用该方法,返回的是受影响的行数
- executeUpdate()
- DQL
- executeQuery()
查询是调用该语法,返回的是一个结果集
- executeQuery()
- excute()
- 该方法在调用时只会返回true or false
- 在调用时如果对表格内的内容没有更改就返回true。对表格的内容有更改时就返回false。
查询成功返回true 失败返回false
增删改 成功返回false 失败返回true
- DML
PreparedStatement接口: 预编译的 SQL 语句的对象
sql注入问题:
演示sql注入
- 产生的原因
- 在输入框内写了sql语句,但是这个jdbc 的Statement这个对象去解析的时候 直接做成字符串拼接解析了,因此就会有sql语句执行的问题,然后就会有不安全问题
解决sql注入
- PreparedStatement 为Statement子接口 里面支持预编译处理,他先把sql先编译好,用?做占位符来代替参数,将来你从页面传过来任何值他都会给你做字符串解析
PreparedStatement使用步骤:
- 加载数据库驱动
- 创建连接对象
- 编写sql语句
- 创建数据库对象
- 设置占位符内容
- 获取结果集或获取受影响的行数
- 关闭资源
注意点:
- 1.占位符跟你赋值的个数必须是一致(包括其类型)
- 2.PreparedStatement只能用来为可以加引号’的参数(如参数值)设置动态参数,即用?占位,不可用于表名、字段名等。
- 3.赋值必须在 调用这个方法的前面进行操作executeUpdate()
增删改查
//添加
@Test
public void increse() {
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//创建连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myfirstsql","root","root");
//编写sql语句
String sql = "insert into secsql values(?,?,?)";
//创建数据库对象
PreparedStatement prepareStatement = connection.prepareStatement(sql);
//设置占位符内容
prepareStatement.setInt(1, 6);
prepareStatement.setString(2, "老王");;
prepareStatement.setDouble(3, 9.9);
//获取结果集或获取受影响的行数
int update = prepareStatement.executeUpdate();
if (update>0) {
System.out.println("增加成功!");
}else {
System.out.println("增加失败!");
}
//关闭资源
prepareStatement.close();
connection.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}