JDBC数据库的增删改查(员工ERP系统)

目录

JDBC的介绍

JDBC的基本操作

使用Druid连接池

 员工erp系统的案例


JDBC的介绍

        什么是JDBCJava 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,但是用我男神代码大帝的话说,有手就行。模板开发么,懂的都懂!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值