目录
JDBC的介绍
什么是JDBC:
Java DataBase Connectivity
(Java数据库连接) JDBC是Java访问数据库的标准规范
JDBC的作用:JDBC是用于执行SQL语句的Java API(Java语言通过JDBC可以操作数据库)
JDBC的基本操作
为了使代码复用,提高开发效率,设计JDBC数据库的增删改查非常有必要
使用Druid连接池
当我们创建了一个Connection对象, 简单的获取一个连接,系统却要在背后做很多消耗资源的事情,大多时候,创建连接的时间比执行sql语句的时间还要长。为解决这些问题,可以采用数据库连接池技术。
原理:先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是准备给下一个调用者进行分配。由此可以看出连接池节省了大量的数据库连接打开和关闭的动作,对系统性能会有较大地提升。
员工erp系统的案例
1.1 在Mysql中建表
设计表和表中数据:
有了数据库表以后,我们就可以通过java代码来操作数据了。
2.1 在src目录下创建一个lib文件夹,导入jdbc驱动jar包和druidjar包
注意:导入jar包后一定要记得add as library,jar包前面出现倒三角表示导入成功。
3.1 在src下创建DBCP的配置文件db.properties
注意:数据库的表名、用户名和密码要根据你的情况进行更改,当出现时区问题时,只需在mysql连接地址后面加上?serverTimezone=UTC
(无脑操作,直接复制粘贴即可!!!)
4.1 根据三层架构的设计原则来分包、建包,后续开发一直会使用这种方式,要慢慢习惯
5.1 编写操作Druid的工具类BaseDao(跟上面一样,无脑操作,直接复制粘贴即可!!!)
package com.erp.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* 数据库操作工具类
*/
public class BaseDao {
//1、定义成员变量DataSource
private static DataSource dataSource;
static {
Properties properties = new Properties();
try {
//1、加载配置文件
InputStream resourceAsStream = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(resourceAsStream);
//2、获取DataSource
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接对象
*/
public Connection getConnection() {
Connection connection = null;
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 关闭数据库连接
* @param conn 数据库连接
* @param stmt Statement对象
* @param rs 结果集
*/
public void closeAll(Connection conn, Statement stmt,
ResultSet rs) {
// 若结果集对象不为空,则关闭
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若Statement对象不为空,则关闭
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 若数据库连接对象不为空,则关闭
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 增、删、改的操作
* @param preparedSql
* @param param
* @return
*/
public int executeUpdate (String preparedSql, Object[] param) {
PreparedStatement pstmt = null;
int num = 0;
Connection conn = getConnection();
try {
pstmt = conn.prepareStatement(preparedSql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
//为预编译sql设置参数
pstmt.setObject(i + 1, param[i]);
}
}
num = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally{
closeAll(conn,pstmt,null);
}
return num;
}
}
6.1 编写实体类,根据数据库表中的字段来设计,其实就是一个JavaBean,JavaBean相信大家都会,我这里就不上代码了。
7.1 编写Dao层,DAO层一般有接口和该接口的实现类! 接口用于规范实现类! 实现类一般用于用于操作数据库! 一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类DAO类!
DAO层:
/**
* 员工接口类
*/
public interface EmployeeDao {
//创建新员工
int create(Employee employee);
//删除员工
int delete(Employee employee);
//根据条件修改员工信息
int update(Employee employee);
//获取指定员工的信息
List<Employee> getEmployee(Employee employee);
}
DAO层的实现类:
package com.erp.dao.impl;
import com.erp.dao.EmployeeDao;
import com.erp.po.Employee;
import com.erp.util.BaseDao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class EmployeeDaoImpl extends BaseDao implements EmployeeDao {
//加载驱动,打开连接
private Connection connection = getConnection();
/**
* 创建新员工
* @param employee
*/
@Override
public int create(Employee employee) {
String sql = "insert into employee(id,password,name,age,salary) values(?,?,?,?,?)";
Object[] params = {employee.getId(),employee.getPassword(),employee.getName(),employee.getAge(),employee.getSalary()};
return executeUpdate(sql, params);
}
/**
* 删除员工
* @param employee
* @return
*/
@Override
public int delete(Employee employee) {
String sql = "delete from employee where id = ?";
Object[] params = {employee.getId()};
return executeUpdate(sql,params);
}
/**
* 根据条件修改员工信息
* @param employee
* @return
*/
@Override
public int update(Employee employee) {
String sql = "update employee set ";
ArrayList<Object> objects = new ArrayList<>();
if (employee.getPassword() != null){
sql += "password=?,";
objects.add(employee.getPassword());
}
if (employee.getName() != null){
sql += "name=?,";
objects.add(employee.getName());
}
if (employee.getAge() != 0){
sql += "age=?,";
objects.add(employee.getAge());
}
if (employee.getSalary() != 0){
sql += "salary=?,";
objects.add(employee.getSalary());
}
//where条件
sql = sql.substring(0,sql.length() - 1) + " where id = ?";
objects.add(employee.getId());
return executeUpdate(sql,objects.toArray());
}
@Override
public List<Employee> getEmployee(Employee employee) {
ArrayList<Employee> employees = new ArrayList<>();
String sql = "select * from employee where 1=1 ";
ArrayList<Object> objects = new ArrayList<>();
if (employee.getId() != 0){
sql += "and id = ? ";
objects.add(employee.getId());
}
if (employee.getPassword() != null){
sql += "and password = ? ";
objects.add(employee.getPassword());
}
if (employee.getName() != null){
sql += "and name like ? ";
objects.add("%" + employee.getName() + "%");
}
if (employee.getAge() != 0){
sql += "and age = ? ";
objects.add(employee.getAge());
}
if (employee.getSalary() != 0){
sql += "and salary = ? ";
objects.add(employee.getSalary());
}
// System.out.println(sql);
try {
//获取预处理器真正执行sql语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//设置属性
for (int i = 0;i < objects.size();i++){
preparedStatement.setObject(i + 1,objects.get(i));
}
//执行语句
ResultSet resultSet = preparedStatement.executeQuery();
//数据封装
while (resultSet.next()){
employees.add(new Employee(resultSet.getInt("id"),resultSet.getString("password"),
resultSet.getString("name"),resultSet.getInt("age"),resultSet.getDouble("salary")));
}
} catch (SQLException e) {
e.printStackTrace();
}
return employees;
}
}
注意: DAO层的实现类是实现增删改查业务代码的类,有许多容易出错的地方。
——代码中的表名和数据库中的表名要对应,别打错了,或者在设计数据库表时,没有设置主键自动增长 ,都会出现找不到表的报错。
——在根据条件修改或查询表中的员工信息时,拼接sql语句时要注意连接是+=还是=,否则可能会出现拼接语句错误,或者值不对应,会出现下面问题的报错。
——sql语句有的是有空格,别忽略,忽略了sql语句就拼接在一起了,也会出现报错。
8.1 编写测试类
添加新员工:
EmployeeDaoImpl employeeDao = new EmployeeDaoImpl();
/**
* 创建新员工
*/
int i = employeeDao.create(new Employee(9531, "123", "陈希", 18, 6000));
System.out.println(status(i));
删除员工:
int i = employeeDao.delete(new Employee(9531));
System.out.println(status(i));
根据条件修改员工信息:
/**
* 根据条件修改员工信息
*/
Employee employee = new Employee();
//修改员工工资
employee.setId(9527);
employee.setSalary(100);
//修改员工密码
employee.setPassword("132");
int i = employeeDao.update(employee);
System.out.println(status(i));
根据条件查询用户:
/**
* 根据条件查询员工
*/
Employee employee = new Employee();
//查询某个员工
employee.setId(9527);
employee.setName("杨");
List<Employee> employees = employeeDao.getEmployee(employee);
for (Employee emp:
employees) {
System.out.println(emp);
}
//查询所有员工
List<Employee> employees = employeeDao.getEmployee(employee);
for (Employee emp:
employees) {
System.out.println(emp);
}
虽然小编第一次接触到JDBC的crud,但是用我男神代码大帝的话说,有手就行。模板开发么,懂的都懂!!!