三十.JDBC
数据库是用于管理数据的,后台是用于根据业务做逻辑处理的,前台显示数据并进行交互
驱动包:DriverManager(驱动管理-注册驱动)、Statement(编译及执行SQL语句)、ResultSet(处理结果集)
1.查询数据库
步骤:
1、关联数据库驱动包(不同的数据库使用的驱动包是不一样的)
2、注册驱动(通过反射进行驱动的注册)
3、连接数据库获取数据库连接对象(登录-选择数据库的过程)
4、执行SQL语句
5、处理结果集
6、关闭数据库连接对象
关键词:DriverManager(管理JDBC驱动)、
Statement(用于SQL的编译及执行)/
PreparedStatement(预编译)/
CallableStatement(执行存储过程)、
ResultSet(结果集)
/**
* 查询功能
*/
public static void query() {
Connection conn = null; //作为全局变量来使用
Statement statement = null;
ResultSet rs=null;
try {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//登陆数据库,获取连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai", "root", "123456");
//定义SQL
String sql = "select ename,eno, phone, birthday,sex,dno from emp limit 0,5";
//执行SQL 需要Statement对象
statement = conn.createStatement();
//z执行SQL获取结果集
rs =statement.executeQuery(sql);
//遍历结果集(查询的过程中,可能会出现结果为空)
while(rs.next()) {//判断是否有下一个元素,每次循环都代表一行数据
//获取元素一行中的列
int eno=rs.getInt(2); // 要与上面的定义SQL内容顺序一致
String ename = rs.getString(1);
String sex = rs.getString(5);
String phone = rs.getString(3);
Date birthday=rs.getDate(4);
int dno = rs.getInt(6);
System.out.println(eno+"--"+ename+"--"+sex+"--"+phone+"--"+birthday+"--"+dno);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {//判断不为空时才进行关闭
//关闭数据库连接对象
try {
if(rs!=null) {
rs.close();
}
if(statement !=null) {
statement.close();
}
if(rs !=null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.添加数据
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
public class JDBCDemo {
//将注册驱动和登陆数据库,连接对象定义为常量
private static final String DRIVER="com.mysql.cj.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
private static final String USER="root";
private static final String PASSWORD="123456";
public static void main(String[] args) {
insert();
}
/**
* 添加功能
* 需要有注册驱动和登陆数据库的动作
* 鉴于之前的查询功能里也有相同操作,所以我们可以将这些数据定义为最终类来使用
*/
public static void insert() {
Connection conn=null;
Statement statement =null;
try {
//使用final修饰的变量
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL,USER,PASSWORD);
//定义SQL
String sql = "insert into emp values(13,'刘博','男','2015-06-19','15963258965','10')";
statement = conn.createStatement();
int result=statement.executeUpdate(sql);//返回值类型是int
System.out.println(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(statement != null) {
statement.close();
}
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.修改数据
/**
* 修改数据
*/
public static void update() {
Connection conn=null;
Statement statement =null;
try {
//使用final修饰的变量
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL,USER,PASSWORD);
//定义SQL
String sql = "update emp set ename='二狗子' where eno=13";
statement = conn.createStatement();
int result=statement.executeUpdate(sql);//返回值类型是int
System.out.println(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(statement != null) {
statement.close();
}
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4.删除数据
/**
* 删除数据
*/
public static void delete() {
Connection conn=null;
Statement statement =null;
try {
//使用final修饰的变量
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL,USER,PASSWORD);
//定义SQL
String sql = "delete from emp where eno=14";
statement = conn.createStatement();
int result=statement.executeUpdate(sql);//返回值类型是int
System.out.println(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(statement != null) {
statement.close();
}
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
添加、修改和删除唯一的区别就是定义SQL内容
5.JDBC封装
将添加、就该和删除数据的功能进行封装
/**
* 数据库连接工具类
*/
public class DBUtil {
private static final String DRIVER="com.mysql.cj.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
private static final String USER="root";
private static final String PASSWORD="123456";
private static Connection conn = null;
/**
* 注册驱动
*/
static {
//注册驱动只需要加载一次,所以可以用静态代码块,随着类的加载而加载
try {
newInstance();//调用Connection方法
Class.forName(DRIVER);
} catch (ClassNotFoundException | SQLException e) {
System.out.println("驱动注册失败");
e.printStackTrace();
}
}
/**
* 获取数据库的连接对象
* @return
* @throws SQLException
*/
public static Connection newInstance() throws SQLException { //返回值类型是连接对象
if(conn==null) {
//判断数据库是否为空,是的话再进行操作
conn=DriverManager.getConnection(URL,USER,PASSWORD);
}
return conn;
}
/**
* 增删改通用方法
* 要执行的SQL
* @return
* 0代表返回失败 正数代表影响的行数
*/
public static int curdMethod(String sql) { //唯一的变量就是sql语句
Statement statement =null;
try {
statement = conn.createStatement();
int result=statement.executeUpdate(sql);
return result;//可能会出现返回异常
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(conn,statement,null);//调用close方法
}
return 0; //出现异常返回0
}
/**
* 关闭连接对象
* @param conn
* @param statement
* @param rs
*/
public static void close(Connection conn , Statement statement,ResultSet rs) {
}
}