JDBC: Java DataBase Connectivity
- 概念 :
Java数据库连接,Java语言操作数据库
- 本质 :
官方(sun公司)定义的操作所有关系型数据库的规则(接口)。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
快速入门
public class JdbcDemo {
public static void main(String[]args) {
Connection conn=null;
Statement stmt=null;
PreparedStatement pstm=null;
ResultSet rs=null;
try {
//1.导入驱动jar包
//2.注册驱动
//DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取数据库连接对象
conn=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8",
"root",
"123456");
//4.使用Statement执行操作
// //4.1定义SQL语句
// String sql="select * from student";
// //4.2获取SQL的对象
// stmt=conn.createStatement();
// //4.3执行SQL
// rs=stmt.executeQuery(sql);
//4.使用PreparedStatement执行操作
//4.1获取SQL的对象
pstm =conn.prepareStatement("select * from student");
//4.2执行SQL,得到结果
rs=pstm.executeQuery();
//5.处理结果
while(rs.next()){
System.out.print(rs.getString("name")+" ");
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
//6.释放资源
if(rs!=null)rs.close();
if(stmt!=null)stmt.close();
if(pstm!=null)stmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
Output:
张三 李四 王五 马六
对象详解
1. DriverManager:驱动管理对象
功能:
- 注册驱动:
告诉程序该使用哪一个注册驱动jar包
static void registerDriver(Driver driver)
:注册与给定的驱动程序 DriverManager
写代码时使用:Class.forName("com.mysql.cj.jdbc.Driver");
在com.mysql.cj.jdbc.Driver类中存在静态代码块。
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException(“Can’t register driver!”);
}
}
- 获取数据库连接:
方法:static Connection getConnection(String url, String user, String password)
参数:
url:指定连接的路径
(如果连接的是本机mysql服务器,且默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称)
user:用户名
password:密码
2. Connection:数据库连接对象
功能:
- 获取执行sql 的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
- 管理事务:
开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
3. Statement:执行SQL的对象
功能:执行SQL
boolean execute(String sql)
:可以执行任意的sql 了解int executeUpdate(String sql)
:执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:影响的行数
,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。ResultSet executeQuery(String sql)
:执行DQL(select)语句
4. ResultSet:结果集对象
功能:封装查询结果
- ResultSet提供的对结果集进行滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
- 获取数据的方法:
getXxx():获取数据,Xxx表示基础数据类型
参数:int:代表列的编号,从1开始,如getString(1);String:代表列名称。如getString("name");
5. PrepareStatement:执行SQL的对象
-
SQL注入问题: 在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接。会造成安全性问题。
如:SQL:"select * from user where name= ' "+ String name=" a ' or 'a' = 'a " +" ' ";
当拼接的字符串满足这样的情况时:String name= " a ' or 'a' = 'a "
会出现where语句恒成立的注入问题。
为解决SQL注入问题:使用PrepareStatement对象来解决
-
预编译的SQL:参数使用 ?占位符
如:select * from user where username = ? and password = ?;
后期都会使用PrepareStatement来完成增删改查的所有操作。