商城实战项目3:dao层开发(二)

目录

第一步,定义SQL语句的接口

第二步,定义SQL语句抽象实体类

第三步,定义SQL语句不同类型的实体类

第四步,定义生产SQL语句的工厂类

第五步,改进dao层实现类


这三天来我们开始练习做项目,分成了很多组,我在我们组中充当项目经理的角色,负责思考项目结构、分配任务等工作。

商城实战项目链接:

商城实战项目2:dao层开发(一):https://blog.csdn.net/NewReErWen/article/details/102513401

商城实战项目3:dao层开发(二):https://blog.csdn.net/NewReErWen/article/details/102513420

好的,现在开始对dao层实现类开始改进。

第一步,定义SQL语句的接口

SqlBean接口

public interface SqlBean {
    /**
     * 添加列
     *
     * @param columns 列名
     */
    void addColumns(String[] columns, Object... params);
    /**
     * 添加where中的条件
     * 比如原先where语句为where (id=?) 可变为where (id=?) and (name=?)
     * 或where(id=?) and (name=? or name=?)
     * 但通常这里写的是除却等号之外的条件(比如大于)
     *
     * @param condition 条件
     */
    void addWhere(String condition, Object... params);
    /**
     * 添加where中的条件
     *
     * @param conditionMap 条件与值的映射关系
     */
    void addWhere(Map<String, Object> conditionMap);
    /**
     * 设置分页
     *
     * @param currentIndex offset
     * @param pageSize     每页最大数据行数
     */
    void setLimit(int currentIndex, int pageSize);
    /**
     * 创建最终sql语句
     *
     * @return sql语句
     */
    String createSql();
    /**
     * 获取值的集合
     *
     * @return List<Object>列表对象
     */
    List<Object> getValues();
}

第二步,定义SQL语句抽象实体类

SqlEntity抽象实体类继承SqlBean接口,在此抽象类中重写SqlBean接口中方法,实现其功能。

public abstract class SqlEntity implements SqlBean

第三步,定义SQL语句不同类型的实体类

这些实体类都继承SqlEntity抽象实体类。

我总共设定了四个SqlEntity实体。

public class InsertSqlEntity extends SqlEntity
public class DeleteSqlEntity extends SqlEntity
public class SelectSqlEntity extends SqlEntity
public class UpdateSqlEntity extends SqlEntity

第四步,定义生产SQL语句的工厂类

SqlLibFactory工厂类,内含一个创建SqlEntity实体的规定,所以只能生成所需的SQL语句。

/**
 * sql语句库,输入参数即可拼接sql语句
 */
public class SqlLibFactory {
    public enum SqlType {
        /**
         * 查询sql的实体
         */
        SELECT("select"),
        /**
         * 修改sql的实体
         */
        UPDATE("update"),
        /**
         * 插入sql的实体
         */
        INSERT("insert"),
        /**
         * 删除sql的实体
         */
        DELETE("delete");

        /**
         * sql实体种类
         */
        private String type;

        SqlType(String type) {
            this.type = type;
        }
    }

    /**
     * 创建SqlEntity对象
     * @param sqlType 枚举对象
     * @param tableName 表名
     * @return 指定的SqlEntity对象
     */
    public static SqlEntity createSqlEntity(SqlType sqlType, String tableName) {
        switch (sqlType.type) {
            case "select":
                return new SelectSqlEntity(tableName);
            case "update":
                return new UpdateSqlEntity(tableName);
            case "insert":
                return new InsertSqlEntity(tableName);
            case "delete":
                return new DeleteSqlEntity(tableName);
            default:
                throw new RuntimeException("SqlLibFactory.createSqlEntity方法中,出现意外情况");
        }
    }
}

第五步,改进dao层实现类

同样的,我更改了一个实现类,其余实现类组员按模板完成。

public class AdminDaoImpl implements AdminDaoInte {
    public Connection connection;
    private static String[] columns;

    static {
        columns = 表中所有列名的数组
    }

    public AdminDaoImpl(Connection connection) {
        this.connection = connection;
    }

    @Override
    public Integer add(Admin bean) {
        SqlEntity sqlEntity = SqlLibFactory.createSqlEntity(SqlLibFactory.SqlType.INSERT, "表名");
        // 列值
        Object[] columnValues = {
                表中各个字段的值
        };
        sqlEntity.addColumns(columns, columnValues);
        String sql = sqlEntity.createSql();
        Integer rows = DBUtil.insert(
                connection,
                sql,
                new ScalarHandler<Long>(),
                sqlEntity.getValues().toArray()
        );
        return rows;
    }

    @Override
    public Integer delete(Map<String, Object> map) {
        SqlEntity sqlEntity = SqlLibFactory.createSqlEntity(SqlLibFactory.SqlType.DELETE, "表名");
        sqlEntity.addWhere(map);
        String sql = sqlEntity.createSql();
        Integer rows = DBUtil.update(connection, sql, sqlEntity.getValues().toArray());
        return rows;
    }

    @Override
    public Integer update(Admin bean) {
        SqlEntity sqlEntity = SqlLibFactory.createSqlEntity(SqlLibFactory.SqlType.UPDATE, "表名");
        // 列值
        Object[] columnValues = {
                各个字段的值
        };
        sqlEntity.addColumns(columns, columnValues);

        sqlEntity.addWhere("判定条件", 判定条件对应的值);

        String sql = sqlEntity.createSql();
        return DBUtil.update(connection, sql, sqlEntity.getValues().toArray());
    }

    @Override
    public List<Admin> query(Map<String, Object> map) {
        SqlEntity sqlEntity = SqlLibFactory.createSqlEntity(SqlLibFactory.SqlType.SELECT, "表名");
        sqlEntity.addWhere(map);

        String sql = sqlEntity.createSql();
        return DBUtil.query(connection, sql, new BeanListHandler<实体类>(实体类.class), sqlEntity.getValues().toArray());
    }

    @Override
    public List<Admin> querySplit(Map<String, Object> map, PageEntity<Admin> pageEntity) {
        SqlEntity sqlEntity = SqlLibFactory.createSqlEntity(SqlLibFactory.SqlType.SELECT, "表名");
        sqlEntity.addWhere(map);
        int pageSize = pageEntity.getPageSize();
        int page1 = (pageEntity.getCurrentPage() - 1) * pageSize;
        sqlEntity.setLimit(page1, pageSize);
        String sql = sqlEntity.createSql();
        return DBUtil.query(connection, sql, new BeanListHandler<实体类>(实体类.class), sqlEntity.getValues().toArray());
    }

    @Override
    public List<Admin> queryCondition(String condition, Object... params) {
        SqlEntity sqlEntity = SqlLibFactory.createSqlEntity(SqlLibFactory.SqlType.SELECT, "表名");
        sqlEntity.addWhere(condition, params);
        String sql = sqlEntity.createSql();
        return DBUtil.query(connection, sql, new BeanListHandler<实体类>(实体类.class), sqlEntity.getValues().toArray());
    }

    @Override
    public int count() {
        SqlEntity sqlEntity = SqlLibFactory.createSqlEntity(SqlLibFactory.SqlType.SELECT, "表名");
        sqlEntity.addColumns(new String[]{"count(主键名)"});
        String sql = sqlEntity.createSql();
        long l = DBUtil.query(connection, sql, new ScalarHandler<>());
        return (int) l;
    }
}

商城实战项目链接:

商城实战项目2:dao层开发(一):https://blog.csdn.net/NewReErWen/article/details/102513401

商城实战项目3:dao层开发(二):https://blog.csdn.net/NewReErWen/article/details/102513420

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NewReErWen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值