JDBC连接MySQL数据库基本操作
Posted FingerDance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC连接MySQL数据库基本操作相关的知识,希望对你有一定的参考价值。
哈喽~大家好,我是wave,今天给大家带来一篇文章介绍如何使用JDBC连接mysql数据库,赶紧来看看吧~
为什么要用数据库
不知道有没有人有这样一个疑惑,为什么要使用数据库保存数据呢?
首先我们开发的项目,如果数据没有存放在文件或者数据库中,仅仅是放在Map或者是某个集合中,那么程序重启之后这些数据就没有了。所有会有一个数据持久化的问题,也就是这些数据需要永久被保存在某个地方。
为什么不把数据放在文件中呢?文件也可以达到数据的持久化呀?
我们从数据库的发展历程来看一看,数据的管理一共经历了三个阶段:人工管理阶段,文件管理阶段,数据库管理阶段。所以使用数据库不使用文件是历史发展的必然。因为文件管理数据会有大量冗余数据、共享性差、独立性差的问题,所以文件管理的数据就逐渐被数据库管理数据取代了。
准备数据库
本次我们使用的是MySQL数据库,我电脑上的数据库版本是5.7的,目前可能也有很多人用的是8的,这两个版本在一些地方的配置会有所不同,不过我会在文中指出MySQL8需要的不同配置。
创建tb_person表
CREATE TABLE `tb_person` (
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`sex` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
在这个表中先插入几条数据方便操作
准备jar包
MyS QL版本5.1+的使用版本号5.1+的就可以了,我这里使用的是mysql-connector-java-5.1.45-bin.jar MyS QL8.0+的使用8.0+的jar包就可以了 Maven仓库链接,大家可以在这个链接里面自行选择版本下载 我们这次会使用到四个jar包,一个是 MyS QL的jar包,还有一个是用于测试的Junit包。另外两个hamcrest包属于Junit里面的依赖包。我们在项目上创建一个lib文件夹,然后把四个jar包都拷贝进去
然后我们还需要一些配置,File->Project Structure-> Libraries-> + -> Java;然后找到lib文件夹,导入即可
准备写代码
Person就是对应数据库创建的实体类 PersonDao里面写操作数据库的代码 TestJdbc里面写测试的代码
添加
Person类
//对应数据库创建相应实体类
public class Person {
private Integer id;
private String name;
private String sex;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
PersonDao
package com.wave.dao;
import com.wave.entity.Person;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PersonDao {
public void add(Person person){
//这个url表示我使用jdbc连接mysql数据库,地址为localhost,端口为3306,数据库名为test
//mysql8需要写成jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
String URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "gt1010992686";
//与mysql连接的连接对象
Connection conn = null;
try {
//加载数据库驱动,这里就是一个类加载的操作
//mysql8需要把类的全限定名改成这个com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection(URL,USER, PASS);
//写sql语句
String sql = "insert into tb_person(name,sex,age) values(?,?,?) ";
//准备执行sql语句,这一步需要把参数写入pstmt类
PreparedStatement pstmt = conn.prepareStatement(sql);
//第一个参数是代表sql语句中第一个?
pstmt.setString(1,person.getName());
pstmt.setString(2,person.getSex());
pstmt.setInt(3,person.getAge());
//真正执行sql
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这个类非常详细的介绍了如何使用JDBC操作数据库的步骤
public class TestJdbc {
@Test//有这个注解就可以作为一个测试方法运行了
public void testAdd(){
PersonDao personDao = new PersonDao();
//创建一个人
Person person = new Person();
person.setName("fingerDance");
person.setSex("man");
person.setAge(0);
//调用之前写的add方法
personDao.add(person);
}
}
可以看到数据库就多出了一条数据了
修改
PersonDao中的update方法
public void update(Person person,Integer id){
//这个url表示我使用jdbc连接mysql数据库,地址为localhost,端口为3306,数据库名为test
//mysql8需要写成jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
String URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "gt1010992686";
//与mysql连接的连接对象
Connection conn = null;
try {
//加载数据库驱动,这里就是一个类加载的操作
//mysql8需要把类的全限定名改成这个com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection(URL,USER, PASS);
//写sql语句
String sql = "update tb_person set name = ?,sex = ?,age = ? where id = ?";
//准备执行sql语句,这一步需要把参数写入pstmt类
PreparedStatement pstmt = conn.prepareStatement(sql);
//第一个参数是代表sql语句中第一个?
pstmt.setString(1,person.getName());
pstmt.setString(2,person.getSex());
pstmt.setInt(3,person.getAge());
pstmt.setInt(4,id);
//真正执行sql
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//关闭连接
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Test中的testUpdate
@Test
public void testUpdate(){
PersonDao personDao = new PersonDao();
//创建一个人
Person person = new Person();
person.setName("fingerDance");
person.setSex("woman");//与之前不同了
person.setAge(1);//与之前不同了
//修改id为5的数据
personDao.update(person,5);
}
可以看到数据确实变化了,但是我们看这个JDBC的代码有没有发现有一大块是重复的,比如URL、USER、PASS这种固定的参数,完全就是一模一样的。每次操作都写一遍代码冗余非常高。 为了解决这种冗余,我们可以把重复的代码抽取出来封装成一个工具类,就可以减少冗余了。 我们可以分析一个JDBC连接数据库的操作,我们会发现其实最关键的一步就是获取到与数据库的连接,也就是创建出Connection这个类,因为有这个Connection了我们就可以对数据库进行操作了。所以我们可以把获取Connection的重复代码抽取出来,成为一个DBUtil类。
DBUtil代码
public class DBUtil {
//如果是mysql8一样要记得后面加一串参数
public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USER = "root";
public static final String PASS = "gt1010992686";
//我们的目的就是需要这个conn
private static Connection conn = null;
static {
try {
Class.forName("com.mysql.jdbc.Driver");
try {
conn = DriverManager.getConnection(URL,USER,PASS);
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//可以通过这个静态方法获取Conn
public static Connection getConnection() {
return conn;
}
}
那我们后面的删除与修改操作就用DBUtil进行操作了
删除
PersonDao的delete方法
public void delete(Integer id){
//获取连接,是不是代码清爽了很多~
Connection conn = DBUtil.getConnection();
String sql = "delete from tb_person where id = ?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,id);
pstmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Test
public void testDelete(){
PersonDao personDao = new PersonDao();
personDao.delete(5);//删除id为5的数据
}
可以看到id为5的数据被删除了,而且PersonDao里面的delete方法也简短了非常的多
查询
PersonDao中的Select方法
public List<Person> select(){
//获取连接
Connection conn = DBUtil.getConnection();
//编写sql语句
String sql = "select * from tb_person";
//使用一个集合存储从数据库中查询出来的数据
List<Person> lists = new ArrayList<>();
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
//调用executeQuery获取一个结果集
ResultSet resultSet = pstmt.executeQuery();
//使用循环遍历结果集。resultSet.next()如果还有数据就会返回true,并且自动往后移动
while (resultSet.next()){
Person person = new Person();
person.setId(resultSet.getInt("id"));//从结果集中取出数据
person.setName(resultSet.getString("name"));
person.setAge(resultSet.getInt("age"));
person.setSex(resultSet.getString("sex"));
//查询出来的数据放入lists中
lists.add(person);
}
} catch (SQLException e) {
e.printStackTrace();
}
return lists;
}
Test中的testSelect方法
@Test
public void testSelect(){
PersonDao personDao = new PersonDao();
List<Person> list = personDao.select();
//for语句打印List
for (Person item : list){
//记得给Person加上toString方法
System.out.println(item);
}
}
查询操作相比于其他操作多一个RestultSet类,从数据库查询出来的数据就会放入到这个类里面。
ENDING
看完这篇文章希望大家可以熟练的对数据库进行一个CRUD操作,虽然目前公司基本都是在用Mybatis框架进行对数据库的操作,但其实Mybatis底层的类最终对数据库操作的类就是PreparedStatement这个类,所以认真了解JDBC的基础操作还是有必要的,毕竟基础才是最重要的。
本次分享就到这里结束了,如果你喜欢就点个赞吧~
往期推荐
扫描二维码
获取更多精彩
FingerDance
以上是关于JDBC连接MySQL数据库基本操作的主要内容,如果未能解决你的问题,请参考以下文章
Spring练习,使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执行业务代码后释放资源,最后在控制台输出打印结果。
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段