? ? ? ?JDBC ( Java DataBaseConnectivity java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
????????在 java 中配置 JDBC 请见我的另一篇文章:小白入门基础 - JDBC连接MySQL数据库
(1)注册驱动:(mysql5以后可直接省略驱动)
1.注册给定的驱动程序: staticvoid registerDriver(Driver driver);2.写代码使用:Class.forName(“com.mysql.jdbc.Driver”);
3.在com.mysql.jdbc.Driver类中存在静态代码块
(2)获取数据库连接:
1.获取数据库连接对象: static ConnectiongetConnection(Stringurl, String user,String password);2.返回值:Connection数据库连接对象
3.参数
url:指定连接的路径。语法: jdbc:mysql://ip地址(域名):端口号/数据库名称? user:用户名
? password:密码
1.获取执行者对象:
获取普通执行者对象: Statement createStatement0;
获取预编译执行者对象:PreparedStatement prepareStatement(String sql);2.管理事务
开启事务 : setAutoCommit(boolean autoCommit);参数为false,则开启事务? 提交事务:commit();
? 回滚事务: rollback();
3.释放资源
立即将数据库连接对象释放:void close();
(1)执行DML语句: int executeUpdate(String sql);
返回值int :返回影响的行数。
参数sql:可以执行insert、update、delete语句。
(2) 执行DQL语句:ResultSet executeQuery(String sql);
返回值ResultSet:封装查询的结果。
参数sql:可以执行select语句。
(3)释放资源
立即将数据库连接对象释放:void close();
1.判断结果集中是否还有数据: boolean next();
有数据返回true,并将索引向下移动一行。没有数据返回false。
2.获取结果集中的数据:XXX getXxx(“列名”);XXX代表数据类型(要获取某列数据,这一列的数据类型)。
例如: String getString(“name”);int getInt(" age");
3.释放资源
立即将结果集对象释放:void close();
create DATABASE demo;
use db14
CREATE TABLE student ( id int PRIMARY KEY, sname VARCHAR(20), age int, brithday date );
INSERT into student VALUES(1,'张飞',23,'1999-08-11'),(2,'李四',23,'1998-08-11'),(3,'王五',23,'1997-08-11'),(4,'关羽',23,'1995-08-11');
????????以下是本次案例中所用到的目录文件,其中 Control2 是我们的主文件,运行逻辑都写在了里面, JDBCUtils 是连接池文件,Student 文件是根据数据库来实现的一个实体类。Config.preperties 是我们的配置文件,pom.xml 是Spring 导入依赖文件。文件内具体代码见下文。
? ? ? ? 这个类很简单,就是把数据库的每一个属性拿出来变为私有,并且提供 get 与 set 即可。
package JDBC;
import jdk.nashorn.internal.objects.annotations.Constructor;
import java.util.Date;
@SuppressWarnings("all")
public class Student {
private Integer id;
private String sname;
private Integer age;
private Date birthday;
public Student(Integer id, String sname, Integer age, Date birthday) {
this.id = id;
this.sname = sname;
this.age = age;
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", sname='" + sname + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
? ? ? ? 在配置文件中导入 mysql 依赖,直接加入下列代码即可。?
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
? ? ? ? 该文件是一个配置文件,相当于定义了一个全局变量,给后面的连接池使用
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo
username=root
password=123456
? ? ? ? 这里是配置JDBC的连接池,可以使后面不必每次都重复链接和关闭数据库。减少性能上的消耗,在后面的具体实现中,新增修改删除,这三个都是使用的连接池,另外两个查找不是使用的连接池,可以对比俩看,查找是更麻烦的。
package JDBC.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/*
* JDBC工具类
* */
public class JDBCUtils {
// 1、构造方法私有
private JDBCUtils(){}
// 2、声明所需要的配置变量
private static String driverClass;
private static String url;
private static String username;
private static String password;
private static Connection con;
// 3、提供静态代码块,读取配置文件信息为变量赋值,注册驱动
static {
try {
// 赋值
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("config.properties");
Properties pro=new Properties();
pro.load(is);
driverClass=pro.getProperty("driverClass");
url=pro.getProperty("url");
username=pro.getProperty("username");
password=pro.getProperty("password");
// 注册驱动
Class.forName(driverClass);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接
public static Connection getConnect(){
try {
con= DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
// 关闭连接
public static void close(Connection con, Statement state, ResultSet rs){
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con, Statement state){
if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
? ? ? ? 在该类中,我们封装了增删改查一共五个方法,并且定义了类变量等,并且对每次操作的结果进行了判断与输出,具体实现看下面代码逻辑。
package JDBC.Control;
import JDBC.Student;
import JDBC.utils.JDBCUtils;
import java.sql.*;
import java.text.*;
import java.util.ArrayList;
public class Control2 {
static final String conName = "jdbc:mysql://localhost:3306/demo?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
static final String name = "root";
static final String password = "123456";
public static void main(String[] args) {
Control2 obj = new Control2();
// obj.findAll();
// obj.findById(2);
/** 下面这些是连接池实现的 */
obj.insert(5,"张三",20,"1998-09-11");
// obj.update("张飞",100);
// obj.delete(1);
}
/** 查询数据库内全部的数据 */
public ArrayList<Student> findAll() {
ArrayList<Student> list=new ArrayList<>();
Connection con=null;
try {
con= DriverManager.getConnection(conName,name,password);
Statement statement = con.createStatement();
String sql="select * from student";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
Integer id=resultSet.getInt("id");
String sname=resultSet.getString("sname");
Integer age=resultSet.getInt("age");
Date birthday=resultSet.getDate("brithday");
Student s=new Student(id,sname,age,birthday);
list.add(s);
System.out.println(s);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
/** 根据ID查找学生信息 */
public Student findById(Integer id) {
Connection con=null;
Student s = null;
try{
con=DriverManager.getConnection(conName,name,password);
String sql="select * from student where id=?";
PreparedStatement pstate = con.prepareStatement(sql);
pstate.setInt(1,id);
ResultSet resultSet = pstate.executeQuery();
while (resultSet.next()){
s=new Student(id,resultSet.getString("sname"),resultSet.getInt("age"),resultSet.getDate("brithday"));
System.out.println(s);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return s;
}
/** 插入学生数据 */
public int insert(Integer id, String sname, Integer age, String birthday) {
/**
// 创建一个java.util.Date对象
Date utilDate = new Date();
// 将java.util.Date转换为java.sql.Date
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println("Java Util Date: " + utilDate);
System.out.println("SQL Date: " + sqlDate);
* */
Connection con=null;
int re=0;
// Date date=new Date();//不能直接用这个写法,因为上面导包,所以默认是java.sql.Date类型,所以要下面这种强制指定
java.util.Date date = new java.util.Date();//需要new一个Date对象
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); //设置日期格式 yyyy-MM-dd-HH-mm-ss这个是完整的
try {
date = dateFormat.parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
}
try {
con= JDBCUtils.getConnect();
String sql="insert into student values(?,?,?,?)";
PreparedStatement p=con.prepareStatement(sql);
p.setInt(1,id);
p.setString(2,sname);
p.setInt(3,age);
p.setDate(4, new java.sql.Date(date.getTime()));
re = p.executeUpdate();
System.out.println(re);
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return re;
}
/** 修改学生信息 */
public int update(String name1,Integer age) {
Connection con=null;
int result=0;
String sql="update student " +
"set age=? " +
"where sname=?";
try {
con= JDBCUtils.getConnect();
PreparedStatement p = con.prepareStatement(sql);
p.setInt(1,age);
p.setString(2,name1);
result = p.executeUpdate();
System.out.println(result);
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
/** 删除学生信息 */
public int delete(Integer id) {
Connection con=null;
int result=0;
try {
con= JDBCUtils.getConnect();
String sql="delete from student where id=?";
PreparedStatement p = con.prepareStatement(sql);
p.setInt(1,id);
result = p.executeUpdate();
System.out.println(result);
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
}
????????JDBC在现在的正规项目中已经不使用了,但是初学者仍然要了解一些,另外JDBC可以在普通项目中作为临时连接数据库的方法使用,切换方便,非常灵活。好啦,本文就到此为止啦,希望能够对各位小伙伴有所帮助哦!