【JDBC】JDBC工具类封装

【JDBC】JDBC工具类封装

前言

最近有用到JDBC,然后封装了个JDBC工具类(增删改查)。

如何使用可以看xxxDemo()方法。注意修改数据库url和用户名密码。

一、工具类

import java.sql.*;
import java.util.*;

/**
 * JDBC工具类:负责数据库操作。
 *
 * @author ChangSheng
 * @date 2020-02-27
 */
public class JdbcUtil {
    /** 加载数据库驱动程序 */
    private final static String DRIVER = "com.mysql.jdbc.Driver";
    /** URL */
    private final static String URL = "jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8";
    /** 数据库用户名 */
    private final static String USERNAME = "root";
    /** 数据库密码 */
    private final static String PASSWORD = "root";

    private static Connection conn;
    private static PreparedStatement ps;
    private static ResultSet rs;

    public static void main(String[] args) {
        // 连接测试
        jdbcConnTest();

        // 增删改使用演示。(demo中sql语句与参数仅供参考)
        int i = executeUpdateDemo();
        System.out.println(i);

        // 查询使用演示。(demo中sql语句与参数仅供参考)
        List<Map<String, Object>> list = executeQueryDemo();
        System.out.println(list+"\n");

        // 将List<Map<String, Object>>转成List<ProductType>
        List<ProductType> pts = new ArrayList<>();
        for (Map<String, Object> map : list) {
            pts.add(new ProductType(Integer.parseInt(map.get("product_type_id")+""), map.get("product_type_name")+"", map.get("product_type_picture")+""));
        }
        System.out.println(pts);
    }

    /**
     * JDBC连接测试
     */
    public static void jdbcConnTest() {
        if (JdbcUtil.getConn() != null) {
            System.out.println("Connection success.");
        }
    }

    /**
     * 获得数据库连接
     *
     * @return 数据库连接
     */
    public static Connection getConn() {
        try {
            Class.forName(DRIVER);
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 释放资源
     *
     * @param conn 数据库连接
     * @param ps   PreparedStatement对象
     * @param rs   结果集
     */
    public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 封装增加、删除、修改。
     *
     * @param preparedSql 预编译的 SQL 语句
     * @param params      预编译的 SQL 语句中的"?"占位符
     * @return 影响的条数
     */
    public static int executeUpdate(String preparedSql, Object... params) {
        try {
            // 1.建立连接
            conn = getConn();
            // 2.处理预编译SQL语句
            ps = conn.prepareStatement(preparedSql);
            // 3.给占位符赋值
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    // 为预编译sql设置参数
                    ps.setObject(i + 1, params[i]);
                }
            }
            // 4.执行预编译SQL语句
            return ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeAll(conn, ps, null);
        }
        return 0;
    }

    /**
     * 封装查询。
     *
     * @param preparedSql 预编译的 SQL 语句
     * @param params      预编译的 SQL 语句中的"?"占位符
     * @return 结果集
     */
    public static List<Map<String, Object>> executeQuery(String preparedSql, Object... params) {
        List<Map<String, Object>> list = new ArrayList<>();
        try {
            // 1.建立连接
            conn = JdbcUtil.getConn();
            // 2.处理预编译SQL语句
            ps = conn.prepareStatement(preparedSql);
            // 3.给占位符赋值
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]);
                }
            }
            // 4.执行预编译SQL语句(获得结果集)
            rs = ps.executeQuery();
            // 获得表结构(用于获取ResultSet对象中列的类型和属性的信息的对象。如字段数、字段名等等)
            ResultSetMetaData rsmd = rs.getMetaData();
            // 获取表中列的数量(ResultSet对象中的列数)
            int cols = rsmd.getColumnCount();
            // 5.遍历结果集
            while (rs.next()) {
                Map<String, Object> map = new HashMap<>(cols);
                for (int i = 0; i < cols; i++) {
                    String colName = rsmd.getColumnName(i + 1);
                    Object colValue = rs.getObject(colName);
                    if (colValue == null) {
                        colValue = "";
                    }
                    map.put(colName, colValue);
                }
                list.add(map);
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.closeAll(conn, ps, rs);
        }
        return null;
    }

    /**
     * 工具类JdbcUtil,查询使用演示。
     */
    static List<Map<String, Object>> executeQueryDemo() {
        // 参数
        String sql = "select * from product_type where product_type_name=? and product_type_picture=?";
        Object[] params = new Object[]{"类型名称1", "图片1"};
        // 执行查询
        return JdbcUtil.executeQuery(sql, params);
    }

    /**
     * 工具类JdbcUtil,增删改使用演示。
     */
    static int executeUpdateDemo() {
        // 参数
        String sql = "insert into product_type(product_type_name, product_type_picture) values(?, ?)";
        Object[] params = new Object[]{"类型名称1", "图片1"};
        // 执行增删改
        return JdbcUtil.executeUpdate(sql, params);
    }
}

二、使用案例

1.接口

import java.util.List;

public interface IUserDao {
    /**
     * 增加用户
     *
     * @param a 用户
     * @return 成功条数
     */
    int insUser(User a);

    /**
     * 删除用户
     *
     * @param id 用户id
     * @return 成功条数
     */
    int delUser(long id);

    /**
     * 修改用户
     *
     * @param a 需要修改的用户
     * @return 成功条数
     */
    int updUser(User a);

    /**
     * 使用id查询用户
     *
     * @param id 用户id
     * @return 用户
     */
    User selUserById(long id);

    /**
     * 使用用户名查询用户
     *
     * @param name 用户name
     * @return 用户
     */
    User selUserByName(String name);

    /**
     * 查询用户列表
     *
     * @return 用户列表
     */
    List<User> selUsers();
}

2.类

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author ChangSheng
 * @date 2020-03-13
 */
public class UserDaoImpl implements IUserDao {
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public int insUser(User u) {
        String sql = "insert into user(user_id, user_name, user_password, user_role, create_time)" +
                "values(?, ?, ?, ?, ?)";
        Object[] params = {u.getId(), u.getName(), u.getPassword(), u.getRole(), f.format(u.getCreateTime())};
        return JdbcUtil.executeUpdate(sql, params);
    }

    @Override
    public int delUser(long id) {
        String sql = "delete from user where user_id = ?";
        return JdbcUtil.executeUpdate(sql, id);
    }

    @Override
    public int updUser(User u) {
        String sql = "update user set user_name=?, user_password=?, user_role=?, create_time=? where user_id=?";
        Object[] params = {u.getName(), u.getPassword(), u.getRole(), f.format(u.getCreateTime()), u.getId()};
        return JdbcUtil.executeUpdate(sql, params);
    }

    @Override
    public User selUserById(long id) {
        String sql = "select * from user where user_id = ?";
        List<Map<String, Object>> maps = JdbcUtil.executeQuery(sql, id);
        if (maps.size() > 0) {
            // 转换
            User u = new User();
            u.setId((long) maps.get(0).get("user_id"));
            u.setName((String) maps.get(0).get("user_name"));
            u.setPassword((String) maps.get(0).get("user_password"));
            u.setRole((String) maps.get(0).get("user_role"));
            try {
                u.setCreateTime(f.parse(maps.get(0).get("create_time").toString()));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return u;
        }
        return null;
    }

    @Override
    public List<User> selUsers() {
        String sql = "select * from user";
        List<Map<String, Object>> maps = JdbcUtil.executeQuery(sql);
        List<User> list = new ArrayList<>();
        // 转换
        for (Map<String, Object> map : maps) {
            User u = new User();
            u.setId((long) map.get("user_id"));
            u.setName((String) map.get("user_name"));
            u.setPassword((String) map.get("user_password"));
            u.setRole((String) map.get("user_role"));
            try {
                u.setCreateTime(f.parse(map.get("create_time").toString()));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            list.add(u);
        }
        return list;
    }

    @Override
    public User selUserByName(String name) {
        String sql = "select * from user where user_name=?";
        List<Map<String, Object>> maps = JdbcUtil.executeQuery(sql, name);
        if (maps.size() > 0) {
            // 转换
            User u = new User();
            u.setId((long) maps.get(0).get("user_id"));
            u.setName((String) maps.get(0).get("user_name"));
            u.setPassword((String) maps.get(0).get("user_password"));
            u.setRole((String) maps.get(0).get("user_role"));
            try {
                u.setCreateTime(f.parse(maps.get(0).get("create_time").toString()));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return u;
        }
        return null;
    }
}

3.测试

import java.util.Date;
import java.util.List;

/**
 * @author ChangSheng
 * @date 2020-03-13
 */
public class UserDaoTest {
    static IUserDao ud = new UserDaoImpl();

    public static void main(String[] args) {
        // ins();
        // del();
        // update();
        // sel();
        selUserByName();
        //selList();
    }

    static void ins() {
        Date d = new Date();
        User u = new User(3, "name2", "password2", "管理员", d);
        int i = ud.insUser(u);
        System.out.println("执行成功条数" + i);
    }

    static void del() {
        int i = ud.delUser(3);
        System.out.println("执行成功条数" + i);
    }

    static void update() {
        Date d = new Date();
        User u = new User(2, "name2222", "password2222", "管理员2", d);
        int i = ud.updUser(u);
        System.out.println("执行成功条数" + i);
    }

    static void sel() {
        User u = ud.selUserById(1);
        if (u != null) {
            System.out.println(u) ;
        } else {
            System.out.println("没有该id值");
        }
    }

    static void selUserByName() {
        User user = ud.selUserByName("name");
        System.out.println(user);
    }


    static void selList() {
        List<User> answers = ud.selUsers();
        for (User u : answers) {
            System.out.println(u);
        }
    }
}

三、附上JDBC概念图