编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

为什么需要持久层框架(为什么要进行持久状况下正常使用极限状态的计算)

wxchong 2024-09-19 06:01:21 开源技术 17 ℃ 0 评论

jdbc问题分析和解决思路

jdbc代码

        Class.forName("com.mysql.cj.jdbc.Driver");
        String dbUrl = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
        String username = "root";
        String password = "123456";
        Connection connection = DriverManager.getConnection(dbUrl, username, password);

        String sql = "select * from user where username = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setString(1, "张三");
        ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("username");
            System.out.println(id+"===="+name);
        }
        connection.close();


问题分析

  1. 数据库配置信息存在硬编码
  2. 频繁的创建释放数据库连接
  3. sql语句,设置参数,返回结果集存在硬编码
  4. 手动封装结果集

解决思路

  1. 配置文件解决硬编码问题
  2. 采用数据库连接池解决频繁创建和释放数据库连接问题
  3. 使用反射,内省机制封装结果集

持久层框架

Apache DBUtils

        //传入数据源,可以使用c3p0,Hikari等
		QueryRunner queryRunner = new QueryRunner(dataSource);
        String sql = "select * from user where username = ?";
        User user = queryRunner.query(sql, new BeanHandler<User>(User.class), "张三");
  1. 采用数据库连接池,解决频繁创建释放数据库连接
  2. 对crud进行了封装
  3. 传入指定类型的handler自动把结果集封装成List,实体bean或Map
  4. 自动映射要求数据库字段名和对象属性名称保持一致

Spring JDBC

        String sql = "select * from user";
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        List<User> query = jdbcTemplate.query(sql, new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet resultSet, int i) throws SQLException {
                User user = new User();
                int id = resultSet.getInt("id");
                String name = resultSet.getString("username");
                user.setId(id);
                user.setUsername(name);
                return user;
            }
        });

解决的问题

  1. 对数据库的crud进行了封装
  2. 数据库连接这块不需要频繁的手动处理了
  3. 对结果集的返回进行了封装,可以映射成List,Map,Pojo

存在的问题

  1. sql语句还是存在硬编码问题
  2. 参数设置,通过占位符替换,不能传入对象或map自动映射
  3. 没有缓存,性能还有优化空间

Hibernate

@Entity
@Table(name = "user")
public class User {
    @Id
    @Column(name="id")
    private Integer id;
    @Column(name="username")
    private String username;

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

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

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

        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory
                .openSession();
        Query query = session.createQuery("from cn.bijy.pojo.User");
        List list = query.list();
        System.out.println(list);
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory
                .openSession();
        Query query = session.createQuery("from cn.bijy.pojo.User");
        List list = query.list();
        System.out.println(list);

解决的问题

  1. hibernate是一个全自动的ORM持久层框架,实现了对象与关系型数据库的完全映射
  2. 自动管理连接资源
  3. 提供了缓存机制
  4. 能够根据数据库方言自动生成sql

存在的问题

  1. hibernate是一个全自动框架,灵活性不是很好。比如,save,update操作的是所有字段
  2. 自动生成sql,对sql进行一些优化就比较麻烦,这样的话,会存在一些性能问题

MyBatis

  1. MyBatis是基于ORM的半自动化轻量级持久层框架
  2. 支持定制化sql,存储过程以及高级映射
  3. 屏蔽了jdbc代码,手动设置参数以及获取结果集
  4. 支持缓存

具体代码大家可自行搜索,相对来说上手比较简单

自定义持久层框架

设计思路

使用侧

  1. 提供核心配置文件
  2. sqlMapConfig.xml 存放数据源配置信息 xxxMapper.xml 存放sql配置信息

框架侧

  1. 读取配置文件
  2. Configuration 存放数据源配置信息,Map<唯一标识,Mapper> MappedStatement sql语句,statement类型,输入参数类型,输出参数类型
  3. 解析配置文件
  4. 类SqlSessionFactoryBuilder,方法 SqlSessionFactory build() 通过dom4j解析配置文件,将信息存入Configuration和MappedStatment中 创建SqlSessionFactory的实现类DefaultSessionFactory
  5. 创建SqlSessionFactory
  6. 方法openSession创建sqlSession
  7. 创建SqlSession
  8. selectList() selectOne() close() 创建Executor
  9. 创建Executor
  10. 实际执行sql语句

声明:这是一篇学习笔记,部分内容摘抄自课堂笔记,如有侵权可联系作者删除

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表