JDBC连接数据库
1.在连接数据前先简单了解下SQL语句的分类
1):DDL(数据库定义语言 create alter drop)
2):DML(数据库操作语言 insert update delete)
3):DQL(数据查询语言 select where )
4):DCL(数据控制语言 权限控制)
2.接下来开始连接数据库
连接数据库主要分为以下步骤
JDBC 操作步骤:
1.导入依赖jar包不同数据库 jar包不一样(这里用的是mysql)
2.注册驱动 Class.forName(“com.mysql.cj.jdbc.Driver”);
3.准备sql语句 String sql=“Select empno,ename,job from emp”;
4.获取statement对象(Statement接口 执行 sql语句 通过connection对象获取)
5.执行sql语句
5.1查询语句 statement 对象执行executeQuery() 得到结果集resultSet(接口 ,封装了查询结果)
5.1.1 从resultSet对象中获取结果信息 核心方法getxxx ,通过列名或者列索引获取某一条记录的某个字段值 注意sql数据类型与jdbc数据类型的匹配
5.2更新操作(DML)语句 execute(Sql)返回int表示insert|delete|update结果
5.3 执行方法execute ()返回boolean值可以执行任意的sql语句
推荐DQLexecuteQuery()DML:executeUpdate
6.关闭资源 注意 关闭顺序 (先开后关)
Connection PreparedStatement ResultSet 要做非空判定
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo01 {
/**
* @author blue
* @date 2020年8月21日
*/
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接对象
//url:连接数据库的地址 url :协议://ip地址:端口号/资源路径#锚点?参数 =参数值(可有可无)多个参数用&分割
//url:连接数据库的url:协议子协议://ip地址:端口号(3306 mysql默认端口号) /数据库 ?连接参数
//user:连接数据库的用户(root)
//password:user的密码
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbwork?serverTimezone=Asia/Shanghai","root","852012");
if(conn!=null) {
System.out.println("连接成功");
}
//操作sql语句 --statement对象
//conn.createStatement();
//3.获取statment对象
stmt=conn.createStatement();
//statement 中常用方法
//execute (String sql)--boolean 任意一条sql语句
//executeUpdate(String sql)--int update 表中数据的改变(DML) 包含update insert,delete
//executeQuery(String sql) --ResulSet(); 查询语句(DQL) ResultSet封装的查询结果
//4.准备sql语句
String sql="Select empno,ename,job from emp";
//System.out.println(stmt.execute(sql));可执行任意语句 但只能返回布尔值
//使用excuteQuery获取结果集
//5.执行stmt.executeQuery(sql) 并用rs的接受查询的结果集
rs= stmt.executeQuery(sql);
//6.解析结果集
while(rs.next()) {
//jdbc数据类型与mysql数据类型对应
//rs.getInt() rs.getDate() rs.getDouble()...
//方法索引
// rs.getInt(int columnIndex)列的索引(结果集中的字段顺序 从1开始)
/*
通过列来获取数据这里的起始值从1 开始 是按照查询完毕后的列表
int empno=rs.getInt(1);
String ename=rs.getString(2);
String job=rs.getString(3);
System.out.println(empno+"\t"+ename+"\t"+job+"\t");
*/
//rs.getInt(columnLabel) 字段名(结果集中的字段名)
int empno=rs.getInt("empno");
String ename=rs.getString("ename");
String job=rs.getString("job");
System.out.println(empno+"\t"+ename+"\t"+job+"\t");
}
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
//7.关闭资源
}finally{
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
}
以上一是一个简单的JDBC案列
但是不符和java中的高内聚低耦合
现在我们将它封装成一个工具类
该工具类分为三块
1.静态static 语句块:
用于加载db.properties 文件 这个文件里存放我们将要用的各种信息
2.创建并返回connection:
获取加载好的配置信息 连接数据库
3.关闭流
关闭Connection PreparedStatement ResultSet
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DBUtil {
private static Properties pro;
static {
pro=new Properties();
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
try {
pro.load(is);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static Connection getconn() throws Exception {
Class.forName(pro.getProperty("jdbc.driver"));
return DriverManager.getConnection(pro.getProperty("jdbc.url"),
pro.getProperty("jdbc.username"),
pro.getProperty("jdbc.password"));
}
public static void close(ResultSet rs,PreparedStatement stmt,Connection conn) throws Exception {
if(rs!=null) {
rs.close();
}
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
}
}
com.mysql.cj.jdbc.Driver 是外部jar包中的路径
工具类封装好了现在是使用它的时候
//查询emp表下的所有信息
public List<Emp> findAll() {
// TODO 自动生成的方法存根
Connection conn=null;
PreparedStatement stmt=null;
ResultSet rs=null;
List<Emp> list=null;
try {
conn = DBUtil.getconn();
String sql="select * from emp";
stmt=conn.prepareStatement(sql);
rs=stmt.executeQuery();
while(rs.next()) {
String eid=rs.getString(1);
String ename=rs.getString(2);
double esal=rs.getDouble(3);
Date hiredate=rs.getDate(4);
int deptno=rs.getInt(5);
String deptname=rs.getString(6);
Emp emp=new Emp(eid, ename, esal, hiredate, deptno, deptname);
list.add(emp);
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
try {
DBUtil.close(rs, stmt, conn);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
return list;
}
//追加
public int addEmp(Emp emp) {
Connection conn=null;
PreparedStatement stmt=null;
ResultSet rs=null;
int i=-1;
try {
conn=DBUtil.getconn();
String sql="insert into emp (id, ename, esal, hiredate, deptno, deptname) values(?,?,?,?,?,?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1, emp.getEid());
stmt.setString(2, emp.getEname());
stmt.setDouble(3, emp.getEsal());
stmt.setDate(4,new java.sql.Date(emp.getHiredate().getTime()));
stmt.setInt(5, emp.getDeptno());
stmt.setString(6, emp.getDeptname());
i = stmt.executeUpdate();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
try {
DBUtil.close(rs, stmt, conn);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
// TODO 自动生成的方法存根
return i;
}