JDBC
JDBC
是Java Data Base Connection的简称,保存有Java中操作数据库的方法。以MySQL为例,访问数据库需要用到第三方的类,第三方类都被压缩在称为jar
的包内。
操作数据库步骤
- 通过Class.forName()注册第三方包中的驱动类,将类加载到jvm中。
- 通过DriverManager类的getConnection方法连接数据库。
- 通过Statement语句类建立语句类。
s.execute()
执行语句。
基本操作
package com.java;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestSql {
public static void main(String[] args){
try{
// 注册驱动类,才能操作数据库
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try( // 连接数据库
Connection c = DriverManager
.getConnection(
"jdbc:mysql://127.0.0.1:3306/?characterEncoding=UTF-8",
"root", "admin");
// 创建语句类
Statement s = c.createStatement();
)
{
/*
* 使用execute 执行语句
*
* */
s.execute("USE mywebsite");
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
预编译语句
使用PreparedStatement
类可以创建预编译语句,相比Statement,优势在于
- 方便(不需要像普通执行那样写一大串)
- 能有效预防SQL注入
- 性能上比Statement好
try(
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/?characterEncoding=UTF-8","root", "kingyin123");
PreparedStatement ps = c.prepareStatement(sql);
){
ps.setString(1, "新增名字");
ps.setString(2, "新增地址");
ps.setString(3, "新增城市");
ps.setString(4, "新增状态");
ps.setString(5, "新增zip");
ps.setString(6, "新增国家");
ps.execute();
System.out.println("插入数据成功");
}
catch(SQLException e){
e.printStackTrace();
}
executeUpdate
executeUpdate
与execute
方法类似,区别在于execute
返回布尔值,如果是查询操作返回true,其他操作返回false。executeUpdate
返回受影响的数据条数。
使用事务
使用事务的方法非常简单,只有两部。
- 关闭自动提交
c.setAutoCommit(false)
- 使用
c.commit()
手动提交
特殊操作
获取自增值
创建语句时传入第二个参数Statement.RETURN_GENERATED_KEYS
,然后使用ResultSet rs = ps.getGeneratedKeys()
获取
try(
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/?characterEncoding=UTF-8","root", "kingyin123");
PreparedStatement ps = c.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
){
ps.setString(1, "新增名字1");
ps.setString(2, "新增地址");
ps.setString(3, "新增城市");
ps.setString(4, "新增状态");
ps.setString(5, "新增zip");
ps.setString(6, "新增国家");
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
while(rs.next()){
System.out.format("插入id为%d",rs.getInt(1));
}
}
catch(SQLException e){
e.printStackTrace();
}
result:插入id为1009
获取元数据
利用DatabaseMetaData可以获取数据库元数据,比如数据库名称、数据库版本等。
好的实践方案
ORM:Object Relationship Database Mapping,对象和数据库之间的映射,一个对象代表一条数据库数据
DAO:Data Access Object,数据访问对象,利用ORM将数据封存在对象内部,只暴露给外部相应的操作