JDBC
概念:
Java Database Connectivity Java数据库连接,Java语言操作数据库
本质: Java官方(SUN)定义了一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
快速入门:
步骤:
- 导入驱动jar包:mysql-connector-java-5.1.44-bin.jar
- 复制mysql-connector-java-5.1.44-bin.jar到项目的libs目录下
- 右键 Add As Library
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接受返回结果
- 处理结果
- 释放资源
如:
public class JDBCDemo01 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?useSSL=false", "root", "123456");
String sql="update account_test01 set balance =500 where id=1";
Statement statement = conn.createStatement();
int count = statement.executeUpdate(sql);
System.out.println(count);
statement.close();
conn.close();
}
}
详解各个对象
DriverManager:驱动管理对象
功能:
1.注册驱动 :告诉程序该使用哪一个数据库驱动jar
注册与给定的驱动程序:
static void registerDriver(Driver driver)
通过查看源码发现:com.mysql.jdbc.Driver类中存在静态代码块:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
注意,mysql5之后的驱动jar包可以省略注册驱动的步骤。
2.获取数据库连接:
- 方法:static Connection getConnection(String url, String user, String password)
- 参数:后面两个是用户名与密码。url:指定连接的路径:语法:jdbc:mysql://ip地址(域名):端口号/数据库名称。
- 注意:如果连接的是本机的mysql服务器,并且mysql服务默认端口为3306.则url可缩写为jdbc:mysql:///数据库名称
Connection:数据库连接对象
1.获取执行sql的对象:
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2.管理事务:
- 开启事务:
void setAutoCommit(boolean autoCommit)
:调用该方法设置参数为false,即开启事务。 - 提交事务:
void commit()
- 回滚事务:
void rollback()
Statement:执行sql对象
boolean execute(String sql)
:可以执行任意的sqlint executeUpdate(String sql)
:执行DML语句(insert、update、delete)、DDL(create、alter、drop)语句(DDL基本不用,返回为0)。返回的是影响的行数,可通过其判断DML是否执行成功。ResultSet executeQuery(String sql)
:执行DQL语句(select)。
ResultSet:结果集对象
boolean next(): 游标向下移动一行,判断是否为最后一行末尾(是否有数据),如果有,返回true,无则返回false
getXxx(参数): Xxx为数据类型如getInt() getString()等,参数有两种情况:①int:代表列的编号,从1开始;②String:代表列的名称
例子:
Connection conn=null;
Statement sta=null;
ResultSet resultSet=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql:///db_test?useSSL=false","root","123456");
String sql="SELECT * from account_test01";
sta=conn.createStatement();
resultSet = sta.executeQuery(sql);
//让游标向下移动一行
while (resultSet.next()){
int id=resultSet.getInt(1);
String name = resultSet.getString("name");
double balance=resultSet.getDouble(3);
System.out.println(id+"---"+name+"---"+balance);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (sta!=null){
try {
sta.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
PreparedStatement:执行sql的对象
- sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。造成安全问题
- 解决sql注入问题:使用PreparedStatement对象来解决
- 预编译的sql:参数使用?作为占位符
- 步骤(和Statement的区别)
1.sql的参数使用?作为占位符,如SELECT * FROM user WHERE username='?' AND password='?'
2.获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)
3.给?赋值:SetXxx(参数1,参数2):参数1为?的位置编号,从1开始;参数2是?的值
4.执行sql,接受返回结果,不用再传递sql了 - 后期都会使用PreparedStatement来完成增删改查的所有操作
1.可以防止SQL注入
2.效率更高
抽取JDBC工具类:JDBCUtils
目的:简化书写
1.抽取注册驱动
2.抽取一个方法获取连接对象
- 需求:不想穿参数,还得保证工具类的通用性。
- 解决:配置文件
3.抽取释放资源的方法
如:
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
//使用静态代码块的方式,有配置文件
static {
try {
Properties pro=new Properties();
ClassLoader classLoader=JDBCUtils.class.getClassLoader();
String s=classLoader.getResource("jdbc.properties").getPath();
pro.load(new FileReader(s));
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void close(Statement statement,Connection connection){
if (statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
public static void close(ResultSet resultSet,Statement statement, Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
JDBC控制事务:
使用Connection对象来管理事务
- 开启事务:
setAutoCommit(boolean autoCommit)
:调用该方法设置参数为false,即开启事务 - 提交事务:commit()
- 回滚事务:rollback()