JDBC概述与应用
JDBC概述
JDBC(Java DataBase Connection),即java连接数据库技术,是一项由sun(java创始公司)发布的用于java连接数据库的通用标准,这套标准由一系列的接口(Connection,Statement,ResultSet等)构成,旨在屏蔽不同数据库之间的差异,使得开发者无需关注不同数据库系统之间的差异,简化java连接数据库的步骤。
JDBC标准提供了一套连接标准,由不同的数据库产商实现这套标准,简化了早期连接不同数据库要开发不同连接的技术,降低了开发者的开发难度
JDBC操作数据库步骤
JDBC操作数据库通常分为六个通用步骤:
- 加载驱动(JDBC4之后可以省略,需要导入相关数据库的驱动包)
- 获取连接
- 获取执行sql命令的对象
- 执行
- 处理结果
- 关闭资源
导入驱动包
由于连接数据库的具体驱动由不同数据库产商实现,因此,在连接对应数据库时需要提供不同数据库的驱动包:
- mysql:mysql-connector-java-X.X.XX-bin.jar
- sqlserver:sqljdbcXX.jar
- oracle:ojdbcXX.jar
以mysql为例:
JDBC步骤代码如下:
//1.加载驱动(驱动数据库:有三种方式,常用反射加载)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象(建立从java到数据库的连接通道)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
//3.获取处理命令的对象(通过连接对象向数据库发送并执行sql语句)
//Statement stat = conn.createStatement();
String sql = "insert into dept values(?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
//4.执行sql操作
//boolean f = stat.execute("insert into dept values(7,'事业部','10986')"); // false
ps.setInt(1,7);
ps.setString(2,"事业部");
ps.setString(3,"10986");
int i = ps.executeUpdate();
//5.处理结果
//if(f){
// System.out.println("执行查询操作");
//}else{
// System.out.println("执行非查询操作");
//}
//获取包含了自动产生键的结果集
ResultSet rs = ps.getGeneratedKeys();
//将游标指针下移一次(否则无法获取数据)
rs.next();
//获取生成的主键值
int id = rs.getInt(1);
if(i>0) {
System.out.println("数据插入成功,ID:"+id);
}
//6.资源关闭
rs.close();
ps.close();
conn.close();
Statement & PreparedStatement
Statement是由JDBC接口提供的一个用于执行静态SQL语句的接口,但是通过Statement执行SQL语句时,会存在SQL注入的风险,因此JDBC还提供了另一个接口PreparedStatement,用于解决这一问题,使用PreparedStatement对象可以对sql语句预编译,从而防止sql注入。
//准备sql语句
String sql = "select * from emp where eno=?";
//获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "123456");
//对SQL语句预处理(编译)并获取预处理对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1, 1001);
//执行查询
ResultSet rs = ps.executeQuery();
if(rs.next()){
int no = rs.getInt("eno");
String name = rs.getString("ename");
BigDecimal sal = rs.getBigDecimal("sal");
Date date = rs.getDate("hiredate");//java.sql.Date
int dno = rs.getInt("dno");
System.out.println(no+"/"+name+"/"+sal+"/"+date+"/"+dno);
}else{
System.out.println("未查询到数据");
}
//关闭资源
rs.close();
ps.close();
conn.close();
execute方法详解
Statement接口主要用于执行sql语句对象,内部包含一些执行方法:
- execute():用执行所有的sql语句,对于有结果集的sql会返回true,否则返回false
- executeUpdate():用于执行DML语句中的更新语句(insert,delete,update),返回结果为影响的数据行数
- executeQuery():用于执行查询语句(select),返回一个ResultSet(结果集)对象,内部存储的为查询的数据
基本CRUD操作
参考数据库表:
create table dept
(
dno int primary key auto_increment,
dname varchar(30),
tel varchar(16)
)
insert操作
//1.加载驱动(驱动数据库:有三种方式,常用反射加载)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象(建立从java到数据库的连接通道)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
//3.获取处理命令的对象(通过连接对象向数据库发送并执行sql语句)
Statement stat = conn.createStatement();
//4.执行sql操作
int i = stat.executeUpdate("insert into dept(dno,dname,tel) values(8,'市场部','10786')");
//5.处理结果
if(i){
System.out.println("执行成功,影响数据行数:"+i);
}
//6.资源关闭
stat.close();
conn.close();
delete操作
//1.加载驱动(驱动数据库:有三种方式,常用反射加载)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象(建立从java到数据库的连接通道)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
//3.获取处理命令的对象(通过连接对象向数据库发送并执行sql语句)
Statement stat = conn.createStatement();
//4.执行sql操作
int i = stat.executeUpdate("delete from dept where dno=1");
//5.处理结果
if(i>0){
System.out.println("执行成功,影响数据行数:"+i);
}
//6.资源关闭
stat.close();
conn.close();
update操作
//1.加载驱动(驱动数据库:有三种方式,常用反射加载)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象(建立从java到数据库的连接通道)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
//3.获取处理命令的对象(通过连接对象向数据库发送并执行sql语句)
Statement stat = conn.createStatement();
//4.执行sql操作
int i = stat.executeUpdate("update dept set tel='123456' where dno=2");
//5.处理结果
if(i>0){
System.out.println("执行成功,影响数据行数:"+i);
}
//6.资源关闭
stat.close();
conn.close();
select操作
//1.加载驱动(驱动数据库:有三种方式,常用反射加载)
// Class.forName("com.mysql.jdbc.Driver");
// DriverManager.registerDriver(new Driver());
//2.获取连接对象(建立从java到数据库的连接通道)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
System.out.println(conn);
//3.获取处理命令的对象(通过连接对象向数据库发送并执行sql语句)
Statement stat = conn.createStatement();
//4.执行sql操作(查询)
ResultSet rs = stat.executeQuery("select dname as name,dno as no,tel as phone from dept");
//5.处理结果
while(rs.next()){
//已经获取一行数据
String name = rs.getString("name");
int no = rs.getInt("no");
String tel = rs.getString("phone");
System.out.println(no+"/"+name+"/"+tel);
}
//6.资源关闭
stat.close();
conn.close();
getGeneratedKeys
在执行某些插入语句时,由于数据库表的某些列设置过自动生成(主键列),因此使用JDBC代码执行插入操作时,也能同时获取被插入的数据自动生成的列值;这里需要在调用prepareStatement方法时,除了传入sql语句外,还需要传入一个参数:Statement.RETURN_GENERATED_KEYS,以表示要获取返回的自动生成的列值(主键)。
具体操作如下:
String sql = "insert into users(username,password,phone,status) values(?,?,?,?)";
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "123456");
//获取预处理命令的对象,并且指示需要获取自动生成的键
PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
ps.setString(1, "hanmeimei");
ps.setString(2, "h123");
ps.setString(3, "10086");
ps.setInt(4, 1);
//执行更新
int i = ps.executeUpdate();
//获取包含了自动产生键的结果集
ResultSet rs = ps.getGeneratedKeys();
//将游标指针下移一次(否则无法获取数据)
rs.next();
//获取生成的主键值
int id = rs.getInt(1);
if(i>0){
System.out.println("数据插入成功,ID:"+id);
}
//关闭资源
rs.close();
ps.close();
conn.close()