通过JDBC接口连接MySql数据库同时实现增删改查功能并对Dao层进行封装
第一章 相关概念
-
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
-
我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
-
常用Statement方法:
-
execute(String sql):运行语句,返回是否有结果集
-
executeQuery(String sql):运行select语句,返回ResultSet结果集。
-
executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
-
addBatch(String sql) :把多条sql语句放到一个批处理中。
-
executeBatch():向数据库发送一批sql语句执行。
-
第二章 工具准备
- 首先需要准备MySql数据库,详细的安装可参考其他博主的博客,为了方便使用MySql数据,我们引入图形化工具SQLyog来对MySql数据库进行数据操作。如果没有MySql数据库可从此链接下载:https://www.mysql.com,因为SQLyog有试用期限所以没有SQLyog的可以从此链接进行下载:链接:https://pan.baidu.com/s/1cseKNoziqg7QZcd87t8LOA
提取码:8096 - 因为是绿化版本找到SQLyog的图标双击即可使用,但仍需要激活,使用文件夹中的激活密钥即可激活,如果短期使用可以去官网下载免费试用版,有能力还是支持正版软件。
- 其次需要根据连接数据库的类型不同准备相应的驱动程序,可以根据自己数据库的版本去百度相关的JDBC驱动程序,这里提供MySql数据库的JDBC驱动程序下载地址:https://dev.mysql.com/downloads/connector/j/
第三章 详细过程
- 首先在IDEA中创建一个项目可自拟,最好为英文。然后创建一个名为lib的软件包将下载好的MySql驱动程序解压将后缀名为jar的文件托到此目录下。此步是为了完成驱动程序的安装。
- 其次,将第四章的代码按照下面图片所示的结构粘贴到对应位置。注意Test类是和Dao包在同一个层,即都在src文件夹下。此步完成后基础代码就完成了。
- 然后进行数据库的准备,安装了MySql数据库后在搜索框搜素“服务“,然后找到MySql80右键启动服务
- 服务开启后在搜索框搜索MySql会出现MySql8.0 Command Line Client 点击然后进入命令窗口,输入数据库的密码
- 出现如下图所示证明已正确安装数据库同时服务也已经激活
- 然后使用图形化数据库工具SQLyog第一次打开软件后会出现下图所示的图像,其中新连接的名字可以和我的一样也可以自己设置,用户名和密码为自己设置的数据库的用户名和密码,其余的不动然后点击连接。
- 然后会连接到本地的数据库上然后进行建库和建表操作,在1处右键在2处选择创建数据库
- 创建的数据库的名字和编码格式按照下图格式即可
- 找到新创建的数据库然后点击左边的加号,然后会展示下图的各个选项然后在表选项上右键选择创建表
- 选择后会出现下面图片的样子
- 按照下图所示将表中内容完成即可,然后点击右下角的保存
- 保存后会弹出弹窗选择否就可以了
- 在创建好的表上选择打开表
- 打开表后会出现一个空表格按照下图所示将空表格内容补满即可,数据数量可适当增加或删减,注意每名学生的学号是唯一的,是要用于对数据进行操作的识别号。填完数据后要进行保存箭头所示即为保存按键。
- 至此所有操作都已完成,可以在IDEA中运行代码进行测试了。
第四章 详细代码
- BaseDao类
package Dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseDao {
//实现增删改查的功能 以及连接 和释放资源
Connection cnt = null;
PreparedStatement ps = null;
ResultSet rs = null;
//连接有3种方式
public boolean getConnection() {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student";
String username = "root";
String password = "root";
try {
Class.forName(driver);
cnt = DriverManager.getConnection(url, username, password);
System.out.println("数据库连接成功》》》》");
} catch (SQLException | ClassNotFoundException e) {
System.out.println("数据库连接失败》》》》");
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
//关闭资源
public boolean closeResource() {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (cnt != null) {
try {
cnt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return true;
}
//增删改
public int ExecuteUpdate(String sql ,Object [] params){
int updateRows=0;
if(this.getConnection()){
//获得sql语句
try {
ps=cnt.prepareStatement(sql);
//给占位符的赋值
for(int i=0;i<params.length;i++){
ps.setObject(i+1,params[i] );
}
//执行 增删改,返回影响的行数
updateRows=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return updateRows;
}
//查询 全部信息 或者指定部分信息
public ResultSet ExecuteQuery(String sql ,Object [] params){
if(this.getConnection()){
try {
ps=cnt.prepareStatement(sql);
//给占位符赋值
for(int i=0;i<params.length;i++){
ps.setObject(i+1, params[i]);
}
// 执行查询,返回值是ResultSet型的
rs=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return rs;
}
}
- UserDao接口
package Dao;
import java.util.Date;
//接口类
public interface UserDao {
//查询全部信息
public void getList();
//查询部分信息
public void getListBySNo(String SNo);
//增
public void add(String SNo,String SN,String Sex,int Age,String Dept,int Score);
//删
public void delete(String SNo);
//改
public void update(String SNo, int Score);
}
- UserDaoImpl类
package Dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImpl extends BaseDao implements UserDao {
ResultSet rs = null;
Connection cnt = null;
PreparedStatement ps = null;
//查询全部信息
@Override
public void getList() {
// TODO Auto-generated method stub
String sql = "select SNo,SN,Sex,Age,Dept,Score from S";
//初始化 数组 ,避免空指针
Object[] params = {
};
rs = this.ExecuteQuery(sql, params);
//在控制台输出 rs的结果集
try {
while (rs.next()) {
String SNo = rs.getString(1);
String SN = rs.getString(2);
String Sex = rs.getString(3);
int Age = rs.getInt(4);
String Dept = rs.getString(5);
int Score = rs.getInt(6);
System.out.printf("%-6s %-6s %-6s %-6d %-6s %-6d\n",SNo, SN,Sex,Age,Dept,Score);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
this.closeResource();
}
}
//查询部分信息
@Override
public void getListBySNo(String SNo) {
// TODO Auto-generated method stub
//返回值是ResultSet类型
String sql = "select SNo,SN,Sex,Age,Dept,Score from S where SNo like ?";
Object[] params = {
SNo};
rs = this.ExecuteQuery(sql, params);
//在控制台遍历出 结果集
try {
while (rs.next()) {
String SN = rs.getString(2);
String Sex = rs.getString(3);
int Age = rs.getInt(4);
String Dept = rs.getString(5);
int Score = rs.getInt(6);
System.out.printf("%-6s %-6s %-6s %-6d %-6s %-6d\n",SNo, SN,Sex,Age,Dept,Score);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
this.closeResource();
}
}
//增
@Override
public void add(String SNo,String SN,String Sex,int Age,String Dept,int Score) {
// TODO Auto-generated method stub
String sql = "insert into S(SNo,SN,Sex,Age,Dept,Score) values(?,?,?,?,?,?)";
Object[] params = {
SNo,SN,Sex,Age,Dept,Score};
int i = this.ExecuteUpdate(sql, params);
if (i > 0) {
System.out.println("添加成功");
}
}
//删除
@Override
public void delete(String SNo) {
// TODO Auto-generated method stub
String sql = "delete from S where SNo=?";
Object[] params = {
SNo};
int i = this.ExecuteUpdate(sql, params);
if (i > 0) {
System.out.println("删除成功");
}
}
//修改
@Override
public void update(String SNo, int Score) {
// TODO Auto-generated method stub
String sql = "update S set Score=? where SNo=?";
Object[] params = {
Score, SNo};
int i = this.ExecuteUpdate(sql, params);
if (i > 0) {
System.out.println("修改成功");
}
}
}
- Test类
import Dao.UserDao;
import Dao.UserDaoImpl;
public class Test {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
userDao.getList();//查找表中全部内容
//userDao.getListBySNo("120101");//通过学号查找固定学生的信息
//userDao.add("120111","李某某","男",21, "计算机",100);//添加学生的信息
//userDao.delete("120111");//通过学号删除某个学生的信息
//userDao.update("120105", 60);//通过学号修改某个学生的分数
}
}
第五章 调试结果
-
首先进行查找表中全部内容操作
-
然后进行通过学号查找固定学生的信息操作,查找学号为120101的学生的全部信息
-
然后进行添加学生信息的操作,添加一个学号为120111的学生的全部信息
-
然后进行删除学生信息的操作,将新增加的学号为120111的学生的信息删除
-
最后进行通过学号修改学生分数的操作,将学生的成绩由60改为100