第十八章、JDBC操作
一、JDBC概述
1. 概述
JDBC:java database connection 使用java语言连接数据库
是java内部提供的一套操作数据库的接口(标准),实现对象数据库的统一访问
2. 功能
一个java应用程序和数据库交互的桥梁
one write,run anywhere的思想
3. 组成
# 1.DriverManage类:驱动管理器,用户注册驱动,获取连接对象
# 2.Connection接口:数据库的连接对象
# 3.Statement接口:执行SQL语句,操作数据库
# 4.PrepareStatement接口:执行SQL语句,操作数据库
# 5.ResultSet接口:结果集(一张虚拟表)
4. 图示
二、通过JDBC实现CURD操作
1. 操作准备
# <1>创建表
create table student(
sid int primary key auto_increment,
sname varchar(32) not null,
age int,
hobby varchar(32),
shows varchar(32)
);
# <2>创建实体类
class Student{
}
# <3> 引入数据库厂商提供的驱动 (.jar文件的方式)
将文件引入到 WebContent 下 WEB-INF 下 lib 中
这是通过创建一个动态Javaweb项目
# <4>编码
使用JDBC访问数据库的步骤:
1. 加载数据库的驱动
2. 获取数据库的连接对象
3. 编写SQL语句
4. 获取Statement对象,执行sql语句
5. 处理结果集
6. 释放资源
2. 步骤介绍
①、DriverManager介绍
# 作用
注册数据库驱动,获取数据库链接对象
# 注册数据库驱动方式 (推荐使用)
1.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
2.Class.forName("驱动类全程:包名+类名");
②、Connection介绍
# 作用
数据库的连接对象,控制事务的实施
# 具体方法
void setAutoCommit(boolean autoCommit); 设置事务的事务的提交方式 ,默认是true,自动提交
void commit(); 提交事务
void rollback(); 回滚事务
# 获取数据库连接对象
Connection getConnection(url, user, password);
参数一:URL,统一资源定位符,标识网络上的一个具体的资源(网页,一张照片,一个视频等等)
协议+ip地址+端口+资源名称
jdbc:mysql:// 127.0.0.1 : 3306 /tlxy
第二个参数: 用户名
第三个参数: 密码
Connection getConnection(String path);
url+username+password
例如: jdbc:mysql://127.0.0.1:3306/tlxy?user=root&password=root
注意:用户名和密码传输的key是固定的
Connection getConnection(url, properties)
参数二:属性对象
Properties p = new Properties();
p.setProperty("user","root");
p.setProperty("password","root");
③、Statement & PrepareStatement介绍
# 作用
获取执行SQL语句的对象
# Statement
是静态的,会出现SQL注入问题
# PrepareStatement
是动态的,避免了SQL注入问题,性能更高,更灵活
具有预处理操作的Statement接口对象
使用占位符?来实现对数据库的各种操作
# 方法
statement.executeQuery(sql) 执行查询SQL语句 返回ResultSet结果集
statement.executeUpdate(sql) 执行增删改SQL语句 int类型
④、ResultSet介绍
# 作用:封装乐查询的结果数据,内部含有一个游标,默认执行数据前。
# 方法:
boolean next() ,将指向数据的游标下移,返回有没有数据的标记
Object getObject(int ColIndex)
Object getObject(String ColName);//推荐使用
3. 代码示例
package com.tlxy.entity;
public class Student {
private int sid;
private String sname;
private int age;
private String hobby;
private String shows;
// 无参构造
public Student() {
super();
}
// 有参构造
public Student(int sid, String sname, int age, String hobby, String shows) {
super();
this.sid = sid;
this.sname = sname;
this.age = age;
this.hobby = hobby;
this.shows = shows;
}
// 设置获取实体类中的值
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public String getShows() {
return shows;
}
public void setShows(String shows) {
this.shows = shows;
}
// 重写toString方法
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + ", hobby=" + hobby + ", shows=" + shows
+ "]";
}
}
package com.tlxy.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.tlxy.entity.Student;
/*
* 通过JDBC实现数据交互
*
* 使用JDBC访问数据
* 1.加载数据库的驱动
* 2.获取数据库的连接对象
* 3.编写SQL语句
* 4.获取Statement对象,执行sql语句
* 5.处理结果集
* 6.释放资源
*/
public class JDBCSelect {
public static void main(String[] args){
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
// 创建一个用于存储学生信息的集合
List<Student> list = new ArrayList<Student>();
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy", "root", "123456");
// 3.获取执行SQL语句对象
statement = conn.createStatement();
/*
* 两个方法:
* statement.executeQuery(sql) 执行查询SQL语句 返回ResultSet结果集
* statement.exevuteUpdate(sql) 执行增删改SQL语句 int类型
*/
String sql = "select * from Student";
// 4.执行SQL语句,如果是查询,返回的是ResultSet结果集
resultSet = statement.executeQuery(sql);
// 5.遍历结果集
while(resultSet.next()){
// 第一种方式获取数据 基本不用
/*Object sid = resultSet.getObject(1);
Object sname = resultSet.getObject(2);
Object age = resultSet.getObject(3);
Object hobby = resultSet.getObject(4);
Object shows = resultSet.getObject(5);*/
// 第二种方式获取数据 推荐使用 方法中参数名称要与数据表中字段名一致
// 注意:如果表中字段类型是Date类型的,建议用你String类型去接收
int sid = resultSet.getInt("sid");
String sname = resultSet.getString("sname");
int age = resultSet.getInt("age");
String hobby = resultSet.getString("hobby");
String shows = resultSet.getString("shows");
// 通过对象的方式存储从数据库中获取到的数据
Student student = new Student(sid, sname, age, hobby, shows);
list.add(student);
//System.out.println(sid+" "+sname+" "+age+" "+hobby+" "+shows+" ");
}
for (Student student : list) {
System.out.println(student);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
// 6.释放资源
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package com.tlxy.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import com.tlxy.entity.Student;
/*
* 通过JDBC实现数据添加
*/
public class JDBCInsert {
public static void main(String[] args) {
Student stu = new Student(0, "李四", 25, "吃生蚝", "一个不一样的美男子");
Connection conn = null;
Statement st = null;
try {
// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy","root","123456");
// 3.获取执行SQL语句对象
st = conn.createStatement();
// 4.执行SQL语句
String sql = "insert into Student (sname,age,hobby,shows) values('"+stu.getSname()+"','"+stu.getAge()+"','"+stu.getHobby()+"','"+stu.getShows()+"')";
System.out.println(sql);
// 5.如果是结果集,遍历
int insert = st.executeUpdate(sql);
if(insert > 0){
System.out.println("插入成功!");
}
// 6.关闭资源
} catch (Exception e) {
e.printStackTrace();
}finally {
// 6.释放资源
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package com.tlxy.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import com.tlxy.entity.Student;
/*
* 通过JDBC实现数据更新
*/
public class JDBCUpdate {
public static void main(String[] args) {
// 通过Student对象来操作数据库
Student stu = new Student(3, "jason", 25, "喝营养快线", "虹桥第一炮王");
Connection conn = null;
Statement st = null;
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy?user=root&password=123456");
// 3.获取执行SQL语句的对象
st = conn.createStatement();
// 4.执行SQL语句获取结果集
String sql = "update student set sname = '"+stu.getSname()+"',age = "+stu.getAge()+",hobby = '"+stu.getHobby()+"',shows = '"+stu.getShows()+"' where sid = "+stu.getSid()+";";
int update = st.executeUpdate(sql);
// 5.遍历结果集
if(update > 0){
System.out.println("修改成功!");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 6.释放资源
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package com.tlxy.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*
* 通过JDBC实现数据删除
*/
public class JDBCDelete {
public static void main(String[] args) {
Connection conn = null;
Statement st = null;
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/tlxy","root","123456");
// 3.获取执行SQL语句的对象
st = conn.createStatement();
// 4.执行SQL语句获取结果集
String sql = "delete from student where sid = " + "3";
int delete = st.executeUpdate(sql);
// 5.遍历结果集
if(delete > 0){
System.out.println("删除成功!");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 6.释放资源
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
三、封装JDBC工具类
1. 简单的封装
package com.tlxy.utils;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/*
* JDBCg工具类
*
* 1.封装加载驱动
* 2.建立连接
* 3.释放资源
*/
public class JDBCUtil {
// 静态块
static{
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
// 2.获取连接对象
public static Connection getCOnnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tlxy","root","123456");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 3.释放连接资源
public static void close(Connection conn,Statement st,ResultSet rs){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2. 高级封装
// 使用Properties进行动态配置相关资源信息
package com.tlxy.utils;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/*
* JDBCg工具类
*
* 1.封装加载驱动
* 2.建立连接
* 3.释放资源
*/
public class JDBCUtil {
public static String DRIVER;
public static String URL;
public static String USERNAME;
public static String PASSWORD;
// 静态块
static{
try {
Properties p = new Properties();
p.load(new FileReader("db.properties"));
DRIVER = p.getProperty("mysql.datasource.driver");
URL = p.getProperty("mysql.datasource.url");
USERNAME = p.getProperty("mysql.datasource.username");
PASSWORD = p.getProperty("mysql.datasource.password");
// 1.加载驱动
Class.forName(DRIVER);
} catch (Exception e) {
e.printStackTrace();
}
}
// 2.获取连接对象
public static Connection getCOnnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 3.释放连接资源
public static void close(Connection conn,Statement st,ResultSet rs){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3. 补充:单元测试
单元测试是白那些测试代码
Junit是Java单元测试框架,已经在Eclipse中默认安装。
Junit4通过注解的方式来识别测试方法
@Before 在测试方法运行之前运行
@Test 测试方法
@After 在测试方法运行之后运行
package javatest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class SequenceTest {
@Before
public void TestBefore(){
System.out.println("Before");
}
@Test
public void TestTest(){
System.out.println("Test");
}
@After
public void TestAfterClass(){
System.out.println("After");
}
}