JDBC仿Mybatis的封装简化使用

JDBC的使用繁琐复杂,这里提供两个工具类仿照Mybatis对JDBC进行快速调用

1.创建一个resource包,添加jdbc.properties配置文件

输入你的数据库名和账号密码,在your_db替换为你的数据库名称

jdbc.url=jdbc:mysql://localhost:3306/your_db?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

2.创建包装JDBC类

注意,现在JDBC连接时不需要进行Class.forName操作,直接连接就行:

执行查询的结果将会得到一个ResultSet

public class JdbcWrapper {
    private static Connection connection;
    private static Properties properties;
    private static Statement statement;
    private static PreparedStatement preparedStatement;
    
    //数据库连接
    public static void connect() throws SQLException, IOException {
        properties = new Properties();
        //在这里填入你的jdbc配置文件路径
        FileInputStream fis = new     
        FileInputStream("jdbc.properties");
        properties.load(fis);

        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        connection = DriverManager.getConnection(url, username, password);
    }
    
    //不传入参数的sql
    public static ResultSet executeQuery(String sql) throws SQLException {
        statement = connection.createStatement();
        return statement.executeQuery(sql);
    }
    
    //执行查询语句
    public static ResultSet executeQuery(String sql, Object... params) throws SQLException {
        preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i + 1, params[i]);
        }
        return preparedStatement.executeQuery();
    }
    
    //执行更新语句
    public static int executeUpdate(String sql, Object... params) throws SQLException {
        PreparedStatement statement = connection.prepareStatement(sql);

        for (int i = 0; i < params.length; i++) {
            statement.setObject(i + 1, params[i]);
        }

        return statement.executeUpdate();
    }


    //关闭所有JDBC连接
    public static void close() {
        try {
            if (statement != null) {
                statement.close();
            }
            if (preparedStatement != null){
                preparedStatement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3.创建映射工具类ResultSetMapper

//指定返回的类型泛型
public class ResultSetMapper<T> {
    private final Class<T> clazz;
    
    public ResultSetMapper(Class<T> clazz) {
        this.clazz = clazz;
    }
    
    //返回单个查询结果
    public T mapSingleResult(ResultSet resultSet) throws SQLException {
        if (resultSet.next()) {
            return mapRow(resultSet);
        }
        return null;
    }
    
    //返回集合查询结果
    public List<T> mapResultList(ResultSet resultSet) throws SQLException {
        List<T> resultList = new ArrayList<>();
        while (resultSet.next()) {
            T object = mapRow(resultSet);
            resultList.add(object);
        }
        return resultList;
    }
    
    //对类进行反射操作来映射
    private T mapRow(ResultSet resultSet) throws SQLException {
        try {
            //通过构造器new出类型
            T object = clazz.getDeclaredConstructor().newInstance();
            //获取MetaData中的所有数据,也就是查询出的键和值
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();
            
            //对这些进行对属性的一一映射
            for (int i = 1; i <= columnCount; i++) {
                String columnName = metaData.getColumnName(i);
                Object columnValue = resultSet.getObject(i);
                Field field = clazz.getDeclaredField(columnName);
                field.setAccessible(true);
                field.set(object, columnValue);
            }

            return object;
        } catch (Exception e) {
            throw new SQLException("映射类失败: " + clazz.getSimpleName(), e);
        }
    }
}

4.使用方法:

假设当前MySQL中存在表user,字段name,password

创建类:User,注意进行实现序列化的接口

public class User implements Serializable{
    private static final long serialVersionUID = 52028138999216232L;
    private String name;
    private String password;
    //你的get和set方法
}

对不需要传参的sql语句:这里用查询所有user数据举例

public List<User> getAllUser(){
        ResultSet resultSet = null;
        List<User> users = null;
        try {
            //输入sql语句,得到resultSet
            resultSet = JdbcWrapper.executeQuery("select * from user");
            //对resultSet进行映射,指定泛型
            users  = newsMapper.mapResultList(resultSet);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return users;
    }

结果返回一个User的List,这里的newsMapper是外面new的ResultSetMappet类。

对需要传参的语句:这里以用用户名删除用户举例

public boolean delUser(String name){
        int done = -1;
        try {
            //执行语句
            done = JdbcWrapper.executeUpdate("DELETE FROM user WHERE name = ?", name);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return done!=-1;
    }

此处?为占位符,将会和后面传入的参数进行拼接再执行,例如,若传入的name值为admin.

则执行的sql语句为delete from user where name = admin

其他语句同理,现在你可以试着去写一个demo了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDBCMyBatis是两种不同的持久层框架。JDBCJava Database Connectivity)是Java语言访问关系型数据库的标准API,而MyBatis是一个开源的持久层框架,它封装JDBC的细节,简化了数据库访问的操作。 JDBC的缺点包括工作量较大和异常处理的复杂性。使用JDBC需要手动连接数据库、处理事务、操作各种对象并关闭它们。同时,我们还需要对可能出现的异常进行捕捉和正确关闭资源。 相比之下,MyBatis提供了更高级的抽象层,使得数据库操作更加简单和灵活。MyBatis通过XML或注解的方式将SQL语句与Java代码解耦,提供了更好的可维护性和可读性。此外,MyBatis还提供了缓存机制,可以提高查询性能。 总结来说,JDBC是一种更底层的数据库访问API,需要手动处理更多的细节,而MyBatis则是在JDBC之上提供了更高级的抽象,简化了数据库操作的过程,并提供了更好的可维护性和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [木木的Java知识整理——JDBCMyBatis的区别](https://blog.csdn.net/weixin_42287169/article/details/105781951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值