Java数据库连接(JDBC)
JDBC:Java DataBase Connectivity
使用Java进行数据库连接的技术
JDBC API:java.sql.*
里面规定了与各种数据库服务器操作的标准接口,另外需要一个相应数据库的驱动jar包
JDBC编程
1、添加数据库驱动jar包支持
2、连接数据库
username、password、connectionUrl
不同数据库服务器的URL格式不同
示例代码:
package my;
import java.sql.Connection;
import java.sql.DriverManager;
public class Test {
public static void testConnect() throws Exception{
//注册MySQL驱动(可以省略这一步)
Class.forName("com.mysql.jdbc.Driver");
//连接MySQL服务器
String username="root";
String password="123456";
String connectionUrl="jdbc:mysql://127.0.0.1:3306/school?usesUnicode=true&characterEncoding=UTF-8";
Connection conn=DriverManager.getConnection(connectionUrl,username,password);
System.out.println("连接成功!");
conn.close();
System.out.println("关闭连接!");
}
public static void main(String[] args) {
try {
testConnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在定义地址时
jdbc:msql:表示协议,用来指定要连接的服务器类型(oracle/MySQL/SQL Server)
128.0.0.1表示地址
3306表示端口号
school表示数据库名
usesUnicode=true&characterEncoding=UTF-8表示做网络传输时使用的字符集编码
DriverManager.getConnection表示获取连接,该函数的三个参数分别是(地址,用户名,密码)
conn.close()表示关闭数据库连接
语法分析
1、java.sql.*下规定了标准接口,而MySQL驱动里则是各个接口的实现
2、MySQL驱动的内部封装了与服务器的交互协议
3、Class.forName(“com.mysql.jdbc.Driver”);
这一行用于显式注册MySQL驱动,但可以省略
JDBC查询数据
示例代码:
package my;
import java.beans.Statement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class Test {
public static void testQuery() throws Exception{
//注册MySQL驱动的语句可有可无
//但是将来有些运行环境下不支持驱动的自动加载,例如Java Web的环境里必须手动注册MySQL驱动
Class.forName("com.mysql.jdbc.Driver");
//连接MySQL服务器
String username="root";
String password="123456";
String connectionUrl="jdbc:mysql://127.0.0.1:3306/af_school?userUnicode=true&characterEncoding=UTF-8";
Connection conn=DriverManager.getConnection(connectionUrl,username,password);
System.out.println("连接成功");
//
//数据库查询,Statement语句 ResultSet结果集
java.sql.Statement stmt=conn.createStatement();
//执行一个查询executeQuery(),返回一个结果集对象ResultSet
ResultSet rs=stmt.executeQuery("SELECT*FROM student");
//如果有数据,rs.next()返回true
while(rs.next()) {
//取出这一行记录
int id=rs.getInt("id");
String name=rs.getString("name");
String phone=rs.getString("phone");
Date birthday=rs.getDate("birthday");
System.out.println(id+"\t"+name+"\t"+phone);
}
conn.close();
System.out.println("关闭连接!");
}
public static void main(String[] args) {
try {
testQuery();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
JDBC插入数据
处理自增主键时需注意:
1、插入数据时,不写该字段
2、执行时指定 RETURN_GENERATED_KEYS
3、取出返回的自增主键
SQL语句的构造
经过前面的示例,可以发现jdbc的操作并不复杂,基本步骤:
1、注册MySQL驱动
Class.forName("com.mysql.jdbc.Driver");
2、连接数据库(例)
String username="root";
String password="123456";
String connectionUrl="jdbc:mysql://127.0.0.1:3306/school?useUnicode=true?characterEncoding=UTF-8";
Connection conn=DriverManager.getConnection(connectionUrl,username,password);
3、准备一个sql语句(例)
String sql="INSERT INTO student(`id`,`name`,`birthday`)"+"VALUES('20200001','z张三','2000-9-13')";
4、执行sql语句
Statement stmt=conn.creatStatement();
stmt.execute(sql);
5、关闭MySQL连接
conn.close();
在准备SQL语句时容易出错,使用工具类来构造SQL语句可以减少出错的几率
预处理查询
使用PreparedStatement接口可以处理预处理查询
普通查询处理步骤
1、MySQL接收到SQL请求
2、解析SQL请求(解析分为结构和数据两部分)
3、执行查询
4、返回结果
预处理查询处理步骤
1、MySQL接受到预处理的SQL(结构)
2、解析SQL请求
3、服务器收到参数的值(数据)
4、执行查询
5、返回结果
在连续执行多个结构相同、参数不同的查询时,使用预处理技术更有性能优势!
预处理代码结构:
//构造一个预处理查询
String sql=...
//先把sql构造发送给服务器
PreparedStatement ptmt=...
while(...){
//设置数据,把数据传给服务器
ptmt.set(1,...)
ptmt.set(2,...)
ptmt.execute()
}
示例代码:
package my;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class Test {
public static void testQuery()throws Exception{
//1、注册驱动器
Class.forName("com.mysql.jdbc.Driver");
//2、创建MySQL连接
String username="root";
String password="123456";
String connectionUrl="jdbc:mysql://127.0.0.1:3306/af_school?useUnicode=true&characterEncoding=UTF8";
Connection conn=DriverManager.getConnection(connectionUrl,username,password);
System.out.println("连接成功!");
//3、创建sql语句
//(1、构造一个SQL,参数值用?号代替,称为占位符
String sql="INSERT INTO student(`id`,`name`,`birthday`)VALUES(?,?,?)";
//(2、创建PreparedStatement对象(与MySQL产生一次交互),获取预处理对象
PreparedStatement ptmt=conn.prepareStatement(sql);
//(3、设置参数值
ptmt.setInt(1, 20183001);
ptmt.setString(2, "小新");
ptmt.setString(3, "1993-3-10");
//4、、执行sql语句
//(4、执行查询
ptmt.execute();
//5、关闭连接
conn.close();
System.out.println("关闭连接!");
}
public static void main(String[] args) {
try {
testQuery();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}