一:JDBC【什么是JDBC?为什么使用JDBC?怎么使用JDBC?】what +why + how
【what】SUN公司为使Java程序灵活的访问各种不同的关系型数据库提供的规则。【why】也就是说,不需要java应用程序去直接操作数据库,而是通过sum公司提供的方法统一去操作数据库,那么我们就不需要针对不同的数据库写不同的代码。只需要在配置文件里面配置一下即可,写代码更加方便。使Java程序灵活移植【how】下面讲【下面的案例全部以mysql为例】
二:开发步骤
1)导入mysql包,这一步是必须的,无论使用什么技术操作数据库,都需要导入mysql包
2) JDBC的六个固定步骤
1,注册数据库驱动[利用反射]
2,取得数据库连接对象Connection
3,创建SQL对象
4,执行SQL命令,并返回结果集
5,处理结果集
6,依次关闭结果集
//1,注册数据库驱动有两种方式
第一种是:直接注册数据库驱动
DriverManager.registerDriver(new Driver());
第二种是:利用反射机制间接加载数据库驱劝,推荐用第二种
Class.forName("com.mysql.jdbc.Driver");
//2. 取得数据库连接对象Connection
//取得与MySQL数据库连接的桥梁,参数分别是:连接数据库 用户名 密码Connection conn = DriverManager.getConnection( "jdbc:mysql:///zz2017","root","xiaozheng");
//前两步骤需要记住以下。下面的
//4:执行sql语句
insert/update/delete----PreparedStatement .executeUpdate(sql):返回值表示影响记录的行数
select------------------PreparedStatement .exeucteQuery():返回值表示符合条件的记录
【注意】创建sql对象的时候,有人会用Statement,我案例中使用的是 PreparedStatement。使用这个的好处是变量可以用占位符的方式去表示,而且它可以防止sql注入,所以我就采用这种方式,不用Statement
//案例源码
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mydb2";
String user = "root";
String password = "root";
String sql = "insert into user(name,gender,salary) values(?,?,?)";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//注册数据库驱动
Class.forName(driver);
//取得数据库连接
conn = DriverManager.getConnection(url, user, password);
//进行预编译,这里进行参数设置
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"xiaozheng");
pstmt.setString(2,"男");
pstmt.setFloat(3,8000);
//进行编译
rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
float salary = rs.getFloat("salary");
System.out.println(id + ":" + name + ":" + gender + ":"+ salary);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(rs!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stmt!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){//重量级,创建和销毁rs所需要的时间和资源较小
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// statement用来执行SQL语句
Statement statement = conn.createStatement();
// 要执行的SQL语句
String sql = "select * from student";
// 结果集
ResultSet rs = statement.executeQuery(sql);
while(rs.next()) {
// 选择sname这列数据
name = rs.getString("sname");
//案例源码
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mydb2";
String user = "root";
String password = "root";
String sql = "insert into user(name,gender,salary) values(?,?,?)";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//注册数据库驱动
Class.forName(driver);
//取得数据库连接
conn = DriverManager.getConnection(url, user, password);
//进行预编译,这里进行参数设置
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"xiaozheng");
pstmt.setString(2,"男");
pstmt.setFloat(3,8000);
//进行编译
rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
float salary = rs.getFloat("salary");
System.out.println(id + ":" + name + ":" + gender + ":"+ salary);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(rs!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stmt!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){//重量级,创建和销毁rs所需要的时间和资源较小
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// statement用来执行SQL语句
Statement statement = conn.createStatement();
// 要执行的SQL语句
String sql = "select * from student";
// 结果集
ResultSet rs = statement.executeQuery(sql);
while(rs.next()) {
// 选择sname这列数据
name = rs.getString("sname");
}
上述代码中发现有很多相同的地方,太长了。那么可以把相同部分提取成一个工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
static String user = "root";
static String password = "root";
static String url = "jdbc:mysql://localhost【数据库地址】:3306【端口】/【数据库名称】?serverTimezone=UTC";
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeJDBC(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//查找table表重的 id和name
String sql = "select id,name from table";
Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = null;
try {
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
json = ResultSetToJson.ResultSetToJsonArray(rs);
}catch (SQLException e){
try {
conn.rollback();
}catch (SQLException e1){
e1.printStackTrace();
}
}finally {
DBUtil.closeJDBC(null, pstmt, conn);
}
return json;
int basicinfoID = 0;
String sql = "INSERT INTO tb_resume_basicinfo("
+ "basicinfo_id, realname, gender, birthday, current_loc, "
+ "resident_loc, telephone, email, job_intension, job_experience, head_shot,applicant_id) "
+"VALUES(SEQ_ITOFFER_RESUMEBASICINFO.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?)";
Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = null;
try {
// 关闭自动提交
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, basicinfo.getRealName());
pstmt.setString(2, basicinfo.getGender());
pstmt.setTimestamp(3, basicinfo.getBirthday() == null ? null
: new Timestamp(basicinfo.getBirthday().getTime()));
pstmt.setString(4, basicinfo.getCurrentLoc());
pstmt.setString(5, basicinfo.getResidentLoc());
pstmt.setString(6, basicinfo.getTelephone());
pstmt.setString(7, basicinfo.getEmail());
pstmt.setString(8, basicinfo.getJobIntension());
pstmt.setString(9, basicinfo.getJobExperience());
pstmt.setString(10, basicinfo.getHeadShot());
pstmt.setInt(11, applicantID);
pstmt.executeUpdate();
} catch (SQLException e) {
try {
// 事务回滚
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
DBUtil.closeJDBC(null, pstmt, conn);
}
sqlserver:
https://docs.microsoft.com/zh-cn/sql/connect/jdbc/building-the-connection-url?view=sql-server-ver15
连接 URL 的一般形式为:
jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]
其中:
-
jdbc:sqlserver://(必需)称为子协议,且为常数 。
-
serverName(可选)是要连接到的服务器的地址 。 它可以是 DNS 或 IP 地址,也可以是本地计算机地址 localhost 或 127.0.0.1。 如果未在连接 URL 中指定服务器名称,则必须在属性集中指定。
-
instanceName(可选)是 serverName 上要连接到的实例 。 如果未指定,则会连接到默认实例。
-
portNumber(可选)是 serverName 上要连接到的端口 。 默认值为 1433。 如果使用默认端口,则无需在 URL 中指定端口及其前面的“:”
命名的多个 SQL Server 实例
SQL Server 允许在每台服务器上安装多个数据库实例。 每个实例都由一个专用名称所标识。 若要连接到指定的 SQL Server 实例,可以使用指定实例的端口号(首选),也可将实例名指定为 JDBC URL 属性或 datasource 属性 。 如果未指定实例名属性或端口号属性,则会创建与默认实例的连接。 请参阅以下示例:
若要使用端口号,请执行下列操作:
jdbc:sqlserver://localhost:1433;integratedSecurity=true;<more properties as required>;
若要使用 JDBC URL 属性,请执行下列操作:
jdbc:sqlserver://localhost;instanceName=instance1;integratedSecurity=true;<more properties as required>;