JDBC:
提供了java通用的各种连接数据库的能力。
它是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。
然后各个数据库厂商去实现这套接口,并提供数据库驱动(jar包)。我们可以使用这套接口(jdbc)编程。
步骤:
1.导入驱动jar包
2.注册驱动
3.获取数据库的连接对象 Connection
4.定义SQL语句
5.获取执行SQL语句的对象 Statement/PraparedStatement
6.执行SQL,接收返回结果
7.释放资源
Public class JdbcDemo1{
static public void main(String[] args) throws Exception{
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection con = DriverManager.getConnection(url:"jdbc:mysql://127.0.0.1:3306/database1",user:"root",password:"root");
//4.定义SQL语句
String sql = "update account set balance = 1000 where id = 001";
//5.获取执行SQL语句的对象:Statement
Statement stm = con.createStatement();
//6.执行SQL,接收返回结果并处理
int res = stm.executeUpdate(sql);
if(res==1){
sysout("更改成功");
}else{
sysout("更改失败");
}
//7.释放资源
stm.close();
con.close();
}
}
详解各个对象:
1.DriverManager:驱动管理对象
2.Connection:数据库连接对象
3.Statement:执行SQL的对象(不安全)
4.ResultSet:结果及对象
5.PreparedStatement:执行SQL的对象(可以防 止sql注入,效率更高)
DriverManager对象:
- 注册驱动:告诉程序该使用哪一个数据库驱动jar包
static void registerDriver(Driver driver)
:注册与给定的驱动程序 DriverManager。
写代码使用:Class.forName("com.mysql.jdbc.Driver");
这句话是使用反射机制,把这个类文件加载进了内存,通过查看源码发现,在com.mysql.jdbc.Driver类中存在静态代码块:
static{
try{
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException E){
throw new RuntimeException("Can't register driver!");
}
}
在mysql5之后的驱动jar包可以省略注册驱动的步骤、因为系统自动把这个类的名字写到此文件中,如果没有写会先读取此文件,然后系统自动帮我们注册。但实际开发中建议写上!
2. 获取数据库连接:
- 方法:
static Connection getConnection(String url, String user, String password);
url:指定连接的路径:jdbc:mysql://IP地址(域名):端口号/数据库名称
Connection对象:
功能:
1.获取执行sql的对象:
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2.管理事务:
- 开启事务:
setAutoCommit(boolean autoCommit)
:调用该方法设置参数为false,即开启事务。 - 提交事务:
commit()
- 回滚事务:
rollback()
Statement对象:
1.执行sql
int executeUpdate(String sql);
:执行DML(insert,update,delete)语句、DDL(create,alter,drop)语句。ResultSet executeQuery(String sql)
:执行DQL(select)语句。
ResultSet对象:
封装查询结果。
获取数据:通过游标向下移动一行,然后判断是否有数据,再获取数据。
next()
:游标向下移动一行。返回boolean值,有数据返回true,无数据返回false。getXxx()
:获取数据。如getInt(),getString()等。
参数:- int:代表列的编号,从1开始。如:
getString(1);
获取第一列 - String:代表列名称。如:
getDouble("balance");
获取balance这一列
PreparedStatement对象:
1.sql注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接,会造成安全问题。
- 用户随便输入账号,输入密码为:
a' or 'a' = 'a
- SQL:
select * from user where username = 'jdkaj' and password = 'a' or 'a' = 'a'
2.我们可以使用预编译的SQL来解决占位符问题(?)
- 定义SQL语句:
select * from user where username=? and password=?;
- 获取执行SQL语句的对象:PreparedStatement
Connection.prepareStatement(String sql);
- 给?赋值:
setXxx(arg1, arg2);
参数1:?的位置编号,从1开始。
参数2:?的值。
注:参itheima[^1].