千锋逆战班,jdbc封装DQL和DML方法

千锋学习的第四十五天,
不积跬步无以至千里,不积小流无以成江河;

封装DQL和DML方法可以是代码进行重用,很大程度上减少了我们的代码冗余,而且业务层,数据访问层加上接口,这样可以降低模块之前的耦合性

这里思想最重要,尤其是那个封装的DQL方法内的接口回调,先实现一个接口,这个接口实现了一个方法,接受结果集然后把结果集内的零散数据组合起方法对象中,返回给DQL公共方法,再添加到集合中,其中对于泛型,以及接口回调思想尤为重要,要细细的思考。

以下是具体代码实现

测试代码/用户层次

package com.qf.day5.t2.view;

import com.qf.day5.t2.entity.User;
import com.qf.day5.t2.service.Impl.UserServiceImpl;
import com.qf.day5.t2.service.UserService;

public class Test {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
//        User user = new User(5,"大强子","123","山东","1777777");//注册
//        System.out.println(userService.register(user));
//
//        System.out.println(userService.login(4, "123"));//登录
//
//        //删除用户
//
//        System.out.println(userService.deleteUser(10));

        //查看所有用户

        userService.showAllUsers().forEach(System.out::println);


    }
}

业务层次(接受用户传递的参数,对数据访问层进行数据的操作)
业务层次接口

package com.qf.day5.t2.service;

import com.qf.day5.t2.entity.User;

import java.util.List;

public interface UserService {
    String login(int id,String password);
    String register(User user);
    List<User> showAllUsers();
    String update(User user);
    String deleteUser(int id);


}

业务层

package com.qf.day5.t2.service.Impl;

import com.qf.day5.t1.account.utils.DButil;
import com.qf.day5.t2.dao.UserDao;
import com.qf.day5.t2.dao.impl.UserDaoImpl;
import com.qf.day5.t2.entity.User;
import com.qf.day5.t2.service.UserService;

import java.sql.Connection;
import java.util.List;

public class UserServiceImpl implements UserService {

    //登录
    @Override
    public String login(int id, String password) {
        UserDaoImpl ud = new UserDaoImpl();



        User u = ud.select(id);
        if (u == null) {
            return "用户存在";
        }
        if (u.getPwd().equals(password)) {
            return "登陆成功";
        }


        return "登录失败密码错误";
    }
    //注册
    @Override
    public String register(User user) {
        UserDaoImpl ud = new UserDaoImpl();

        int i = ud.insert(user);
        if (i > 0) {
            return "注册成功";
        } else {
            return "注册失败";
        }


    }
    //查看所有用户
    @Override
    public List<User> showAllUsers() {
        UserDao ud = new UserDaoImpl();

        return ud.selectAll();
    }
    //修改用户信息
    @Override
    public String update(User user) {
        UserDao ud = new UserDaoImpl();
        int i = ud.update(user);
        if (i>0){
            return "修改成功";
        }else {
            return "修改失败";
        }
    }
    //删除用户
    @Override
    public String deleteUser(int id) {
        UserDao ud = new UserDaoImpl();
        int i = ud.delete(id);
        if (i>0){
            return "删除成功";
        }else {
            return "删除失败";
        }

    }
}

数据访问层

package com.qf.day5.t2.dao.impl;

import com.qf.day5.t2.advanced.Impl.UserRowMapperImpl;
import com.qf.day5.t2.advanced.RowMapper;
import com.qf.day5.t2.dao.UserDao;
import com.qf.day5.t2.entity.User;
import com.qf.day5.t2.utils.Daoutil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

public class UserDaoImpl implements UserDao {
    private Connection connection = null;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;
    //DAO通用方法工具
    private Daoutil<User> daoUtils = new Daoutil();
    @Override
    public int insert(User user) {
        String sql = "insert into user(userid,username,password,address,phone) values (?,?,?,?,?)";
        return daoUtils.cupdate(sql,user.getId(),user.getName(),user.getPwd(),user.getAddress(),user.getPhone());


    }

    @Override
    public int update(User user) {
        String sql = "update user set username=? , password = ?,address = ?, phone=? where userid=?";
        return daoUtils.cupdate(sql,user.getName(),user.getPwd(),user.getAddress(),user.getPhone(),user.getId());

    }

    @Override
    public int delete(int id) {

        return daoUtils.cupdate("delete from user where userid=?",id);
    }

    @Override
    public User select(int id) {

        RowMapper<User> ro = new UserRowMapperImpl();
        List<User> users = daoUtils.selects("select * from user where userid =?",ro,id);
        if(users != null){//判断查询是够查询到了数据
            return users.get(0);
        }
        return null;
    }

    @Override
    public List<User> selectAll() {
        RowMapper<User> ro = new UserRowMapperImpl();
        return daoUtils.selects("select * from user",ro,null);
    }
}

数据访问层接口

package com.qf.day5.t2.dao;

import com.qf.day5.t2.entity.User;

import java.util.List;

public interface UserDao {
    int insert(User user);
    int update(User user);
    int delete(int id);
    User select(int id);
    List<User> selectAll();

}

封装的数据访问层内的DML和DQL方法类

package com.qf.day5.t2.utils;

import com.qf.day5.t2.advanced.RowMapper;

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 Daoutil<T> {
    //DML重用
    /**
     * 公共处理增、删、改的方法
     * sql语句,参数列表
     *
     * @param sql  执行的sql语句
     * @param args 参数列表。为占位符赋值
     * @return
     */
    public int cupdate(String sql,Object... args){
        Connection conn = null;
        PreparedStatement pre = null;

        try {
            conn =DButil.getConnection();
            pre = conn.prepareStatement(sql);
            for (int i=0;i<args.length;i++){

                pre.setObject(i+1,args[i]);

            }
            return pre.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DButil.close(null,pre,null);
        }
        return 0;
    }

    /**
     * 公共查询方法 (可查询单个对象,也可查询多个对象,可以查任何一张表)
     *
     * @param sql
     * @param args
     * @return
     */
    //                              select * from t_account
    //                              select * from t_student
    //工具不知道查的是什么  调用者知道
    //封装对象、对象赋值  调用者清楚
    public List<T> selects(String sql, RowMapper<T> rm,Object... args){
        Connection conn = null;
        PreparedStatement pre = null;
        ResultSet re = null;
        List<T> list = new ArrayList<T>();

        try {
            conn = DButil.getConnection();
            pre = conn.prepareStatement(sql);
            if(args != null){
                for(int i =0;i<args.length;i++){
                    pre.setObject(i+1,args[i]);
                }
            }

            re = pre.executeQuery();
            while(re.next()){//根据查询到的结果完成ORM,如何进行对象的创建及赋值?
               //回调---->调用者提供的一个封装方法ORM
                T u  = rm.getRow(re);
                list.add(u);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DButil.close(null,pre,re);
        }
            return list;
    }

}

其中涉及到的接口回调类

package com.qf.day5.t2.advanced.Impl;

import com.qf.day5.t2.advanced.RowMapper;
import com.qf.day5.t2.entity.User;

import java.sql.ResultSet;
import java.sql.SQLException;

public class UserRowMapperImpl implements RowMapper<User> {
    /**
     * 接口实现类。明确创建的对象,并返回
     */
    @Override
    public User getRow(ResultSet resultSet) {
        User user = null;
        try {
            user = new User(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3),resultSet.getString(4),resultSet.getString(5));
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
        }
        return user;
    }
}

数据库的连接注册驱动

package com.qf.day5.t2.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DButil {
    private static final Properties properties = new Properties();

    private static final ThreadLocal<Connection> THREAD_LOCAL = new ThreadLocal<Connection>();


    static {
        InputStream is = DButil.class.getResourceAsStream("/dab.properties");
        try {
            properties.load(is);

            Class.forName(properties.getProperty("driver"));

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


    }

    public static Connection getConnection(){
        Connection conn = THREAD_LOCAL.get();

        try {
            if (conn == null){
                conn = DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"),properties.getProperty("password"));

                THREAD_LOCAL.set(conn);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void begin(){
        Connection connection  = getConnection();

        try {
            connection.setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }


    }
    public static void commit(){//提交
        Connection connection  = getConnection();

        try {
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(connection,null,null);
        }


    }

    public static void rollback(){//回滚
        Connection connection  = getConnection();

        try {
            connection.rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(connection,null,null);
        }

    }

    public static void close(Connection conn, Statement st, ResultSet re){

        try {
            if (re != null){
                re.close();
            }
            if (st != null){
                st.close();
            }
            if (conn != null){
                conn.close();
                THREAD_LOCAL.remove();
            }


        } catch (SQLException e) {
            e.printStackTrace();
        }

    }


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值