前言
现如今数据是非常重要的东西,比如你淘宝购买东西,每一件东西就是一条数据,你购物车中的物品也作为数据保存在你的库中。而数据库就是用来保存我们各种信息的一个仓库。而对数据据的各种基本操作比如说增删改查,各位大佬也都数据于心。那么我们如何不直接操作数据库的方式,对数据库进行操作呢?在JAVA中我们要使用的就是JDBC(java 数据库连接)。
本文主要介绍的就是如何在java中编程出在应用程序中来进行数据库的各种操作。(以MySQL为例)
JDBC简介
- JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。
- JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
- JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
JDBC编程涉及的三个部分
- 应用程序
开发人员编写的客户端程序。在应用程序中调用JDBC API,将SQL语句发送到数据库并检索结果。 - 驱动程序管理器
JDBC将驱动程序管理器负责使用正确的JDBC驱动程序和连接信息访问数据库,在Java应用程序和数据库之间建立连接 - 驱动程序
驱动程序由数据库厂商提供,实现数据库驱动接口。能够把SQL指令正确发送到数据库服务器。 JDBC编写步骤
JDBC访问数据库的步骤
首先下载MySQL官方驱动 下载地址:MySQL驱动地址 百度网盘链接(8.0.27):链接:https://pan.baidu.com/s/1BIBXIlJsyvVl-gnZdSNe6g 提取码:3wfa
如下图所示: 解压后,找到里面的.jar包 打开IDEA或者eclipse(本文以eclipse为例) 在项目下常见一个文件夹lib(可以为任意名字,一般我们起lib) 然后将刚才的jar包复制到目录下 右击jar包选择Build Path下的Add to Build Path,添加指定路径 然后你的这个目录下就有这个东西了 里面就是我们需要用到的的一些JDBC类
在项目的结构中有util包,我们在util包下专门创建一个类来进行数据库的连接 首先我们定义四个变量 分别为url(数据库地址),name(数据库名称),password(数据库密码),con(和数据库连接的对象)。
public class MyCon {
private String url="jdbc:mysql://localhost:3306/store? useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private String name = "root";
private String password = "";
private Connection con = null ;
}
然后我们创建一个方法用来得到我们的连接。
public Connection getCon() {}
怎么建立连接,首先我们要加载驱动,驱动在哪呢?
我们使用Class.forName("com.mysql.cj.jdbc.Driver"); 来加载我们的驱动,然后得到我们的连接
public Connection getCon() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
con = DriverManager.getConnection(url, name, password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
我们可以在添加一个方法用来释放我们的链接
public void setClose(ResultSet res,PreparedStatement ps,Connection con) throws SQLException {
if (res!=null) {
res.close();
}
if (ps!=null) {
ps.close();
}
if (con!=null) {
con.close();
}
}
然后我们进行测试 在dao包下建一个关于emp的接口,其中 是最基本的功能,也就是最基本的增删改查 其中的方法都有如下几部分
package com.dyit.store.dao;
import java.sql.SQLException;
import java.util.List;
import com.dyit.store.eneity.Emp;
public interface EmpDao {
public boolean insertEmp(Emp emp) throws SQLException;
public boolean updateEmp(Emp emp);
public boolean deleteByEmp(Emp emp);
public boolean deleteByEmpId(int empId);
public Emp queryById(int id);
public List<Emp> queryAll();
public List<Emp> queryByPage(int page,int pagesize);
public int getTotal();
List<Emp> queryByLike(String empname);
}
然后我们创建其的实现类 实现类中实现的是对数据库的基本操作,增上改查。首先我们定义几个基本属性。
private String sql;
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
首先我们来看插入操作,代码如下:
@Override
public boolean insertEmp(Emp emp) {
boolean flag = false;
sql = "INSERT INTO emp VALUES(0,?,?,?,?,?,?,?,?)";
MyCon mc = new MyCon();
con = mc.getCon();
try {
ps = con.prepareStatement(sql);
ps.setInt(1, emp.getDeptId());
ps.setString(2, emp.geteName());
ps.setString(3, emp.getPwd());
ps.setString(4, emp.getSex());
ps.setInt(5, emp.getAge());
ps.setString(6, emp.getAddress());
ps.setString(7, emp.getTel());
ps.setDouble(8, emp.getSalary());
int res = ps.executeUpdate();
if (res > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
mc.setClose(rs, ps, con);
} catch (SQLException e) {
e.printStackTrace();
}
}
return flag;
}
- flag用来标记sql语句是否执行成功。
- sql中的
? 我们称为占位符,也就是字段的值。 - con得到一个连接,用我们刚才封装的mycon直接返回即可。
- 然后通过con.prepareStatement(sql)得到一个控制面板用来执行我们的sql操作
- 然后同过ps来设置占位符出的参数,我们通过传进来的emp类进行设置
- 最后执行操作,返回的值是收到影响的行数
- 如果res>0说明执行成功,返回true。
其他的基本类似,只要写好sql就可以了,略有不同的是查询语句。
查询语句:查询所有的员工,并以链表的方式返回。
@Override
public List<Emp> queryAll() {
List<Emp> list = new ArrayList<Emp>();
sql = "SELECT * FROM emp";
MyCon mc = new MyCon();
con = mc.getCon();
try {
ps = con.prepareStatement(sql);
ResultSet res = ps.executeQuery();
while (res.next()) {
int empId = res.getInt(1);
int deptId = res.getInt(2);
String eName = res.getString(3);
String pwd = res.getString(4);
String sex = res.getString(5);
int age = res.getInt(6);
String address = res.getString(7);
String tel = res.getString(8);
double salary = res.getDouble(9);
Emp emp = new Emp(empId, deptId, eName, pwd, sex, age, address, tel, salary);
list.add(emp);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
这里我们使用的是executeQuery()方法,用来查询,它返回的是一个集合。在属性中我们已经定义过Resultset了,我们直接经行接收,然后通过方法的next方法移动到下一行,也就是数据的下一行,可以理解为指针,每次指的都是一行数据。 然后通过Resultset的方法get**** 的到具体的值,其中的参数就是第几列,注意类型要一致。 然后保存在emp中用链表添加即可。
测试一下查询所由员工 代码:
package com.dyit.store.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.dyit.store.dao.EmpDao;
import com.dyit.store.dao.impl.EmpDaoImpl;
import com.dyit.store.eneity.Emp;
public class Test {
public static void main(String[] args) {
List<Emp> list = new ArrayList<Emp>();
EmpDao e = new EmpDaoImpl();
list = e.queryAll();
Iterator<Emp> it = list.iterator();
while(it.hasNext()) {
Emp emp = it.next();
System.out.println(emp);
}
}
}
结果: 其他类似。
|