代码

  1. 代码结构
├── lib\
│   ├── mysql-connector-j-8.0.33.jar
│   └── mysql-connector-java-5.1.38.jar
├── src\
│   ├── com\
│   │   └── company\
│   │       ├── BaseDao.java
│   │       ├── DeleteSql.java
│   │       ├── InsertSql.java
│   │       ├── Main.java
│   │       ├── SelectSql.java
│   │       └── UpdateSql.java
│   └── pojo\
│       └── User.java
└── wangke.iml

如果继承 BaseDao 就不需要写重复的代码。本文演示了继承和不继承的代码量。用于比对比

  1. 实体类

public class User {
    private Integer uid;
    private  String username;
    private   String password;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

  1. 连接数据库工具类
package com.company;

import java.sql.*;

public class BaseDao {
    Connection connection;
    PreparedStatement ps;
    ResultSet rs;
    // 数据的地址
    String url = "jdbc:mysql://127.0.0.1:3306/test";
    //数据库的用户名
    String username = "root";
    //数据库的密码
    String password = "1234";

    //创建链接
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void getConnection() {
        try {
            connection = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //执行SQL
    //增删改
    public int executeUpdate(String sql, Object... objs) {
        getConnection();
        try {
            ps = connection.prepareStatement(sql);
            //传入参数
            for (int i = 1; i <= objs.length; i++) {
                ps.setObject(i, objs[i - 1]);
            }
            return ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return -1;
    }

    //查
    public ResultSet executeQuery(String sql, Object... objs) {
        getConnection();
        try {
            ps = connection.prepareStatement(sql);
            //传入参数
            for (int i = 1; i <= objs.length; i++) {
                ps.setObject(i, objs[i - 1]);
            }
            return ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //关闭连接
    public void close() {

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}


  1. 查询
import pojo.User;

import java.sql.*;

public class SelectSql extends BaseDao {

    public User getUser(String sql, Object... objs) throws SQLException {
        ResultSet rs = this.executeQuery(sql, objs);
        User user = new User();
        while (rs.next()) {
            user.setUid(rs.getInt("uid"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));

        }
        this.close();
        return user;
    }


    private void close(PreparedStatement ps, Connection connection, ResultSet resultSet) throws SQLException {
        resultSet.close();
        ps.close();
        connection.close();
    }

    public static void main(String[] args) {
        SelectSql selectSql = new SelectSql();
        String sql = "select *from user1 where username=?";
        User user = null;
        try {
            user = selectSql.getUser(sql, "张三");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println(user);
    }


}
  1. 新增
import java.sql.SQLException;

public class InsertSql extends BaseDao{
 //添加数据
 public  int addUser(){
     String sql = "insert into user1 (uid ,username,password) values(?,?,?)";
      int i= this.executeUpdate(sql,10,"老九","123456");
            this.close();
            return  i;
 }
    public static void main(String[] args) throws SQLException,ClassNotFoundException{
        InsertSql insertSql = new InsertSql();
            insertSql.addUser();
    }


}

  1. 删除

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DeleteSql {
    // 数据的地址
    String url = "jdbc:mysql://127.0.0.1:3306/text";
    //数据库的用户名
    String username = "root";
    //数据库的密码
    String password = "1234";

    static {
        //加载驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private Connection getConnection() {
        try {
            return DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void init() throws ClassNotFoundException, SQLException {
//创建链接
        Connection connection = getConnection();
        //执行Sql语句并返回结果集
        String sql = "delete from user1 where uid=?";
        //预编译
        PreparedStatement ps = connection.prepareStatement(sql);
        //传入参数
        ps.setObject(1, 7);

        //影响行数
        int i = ps.executeUpdate();
        //解析结果
        System.out.println("影响行数" + i);
        //关闭连接
        close(ps, connection);
    }

    private void close(PreparedStatement ps, Connection connection) throws SQLException {
        ps.close();
        connection.close();
    }

    public static void main(String[] args) {
        DeleteSql deleteSql = new DeleteSql();
        try {
            deleteSql.init();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


}

  1. 修改

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UpdateSql {
    // 数据的地址
    String url = "jdbc:mysql://127.0.0.1:3306/day23";
    //数据库的用户名
    String username = "root";
    //数据库的密码
    String password = "1234";

    static {
        //加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private Connection getConnection() {
        try {
            return DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void init() throws ClassNotFoundException, SQLException {
//创建链接
        Connection connection = getConnection();
        //执行Sql语句并返回结果集
        String sql = "update user1 set username=? where uid=?";
        //预编译
        PreparedStatement ps = connection.prepareStatement(sql);
        //传入参数
        ps.setObject(1, "田七");
        ps.setObject(2, 8);
        //影响行数
        int i = ps.executeUpdate();
        //解析结果
        System.out.println("影响行数" + i);
        //关闭连接
        close(ps, connection);
    }

    private void close(PreparedStatement ps, Connection connection) throws SQLException {
        ps.close();
        connection.close();
    }

    public static void main(String[] args) {
        UpdateSql updateSql = new UpdateSql();
        try {
            updateSql.init();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


}

  1. 查询2
public class Main {

    public static void main(String[] args) throws SQLException {
        SelectSql selectSql=new SelectSql();
        String sql="select *from user1 where username=?";
        User user =selectSql.getUser(sql,"张三") ;
        System.out.println(user);
    }
}


项目概述

这是一个简单的Java数据库操作项目,实现了对用户表( user1 )的基本CRUD(增删改查)操作。项目采用了两种不同的实现方式:部分类继承自 BaseDao.java ,部分类独立实现所有功能,用于对比代码量差异。
项目结构

  • 实体类 : User.java - 存储用户信息
  • 基础数据访问类 : BaseDao.java - 提供数据库连接、SQL执行和连接关闭等公共方法
  • 继承实现类 :
    • SelectSql.java (查询操作,42行)
    • InsertSql.java (插入操作,25行)
  • 非继承实现类 :
    • DeleteSql.java (删除操作,69行)
    • UpdateSql.java (更新操作,69行)
  • 测试类 : Main.java - 测试查询功能 代码量对比分析
  1. 继承方式优势 :

    • 继承类代码量显著减少:SelectSql(42行)和InsertSql(25行)平均约33.5行
    • 直接复用BaseDao中的公共方法(如数据库连接、SQL执行、关闭连接)
    • 代码更简洁、可读性更好
  2. 非继承方式劣势 :

    • 非继承类代码量明显更多:DeleteSql(69行)和UpdateSql(69行)均为69行
    • 重复实现相同功能(如加载驱动、获取连接、关闭连接)
    • 代码冗余、维护成本高
  3. 对比结果 :

    • 非继承类平均代码量(69行)约为继承类(33.5行)的2.06倍
    • 继承方式减少了约51.5%的代码量 结论
      通过对比可以清晰看到,面向对象编程中的继承机制能有效减少代码量、提高代码复用性和可维护性。本项目中,继承 BaseDao.java 的类比独立实现的类减少了约一半的代码量,充分体现了继承的优势。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐