经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍
来源:cnblogs  作者:随机的未知  时间:2024/4/24 7:26:26  对本文有异议

MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍

为了方便操作,我们在sjdwz_test数据库下建立一张表:

  1. CREATE TABLE `t_student` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3. `name` varchar(255) DEFAULT NULL COMMENT '名字',
  4. `age` int(255) DEFAULT NULL COMMENT '年龄',
  5. PRIMARY KEY (`id`) USING BTREE
  6. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

数据如下:

数据

实体类如下:

  1. package com.sjdwz.db;
  2. import lombok.*;
  3. /**
  4. * @Description 数据库实体
  5. * @Created by 随机的未知
  6. */
  7. @Data
  8. @ToString
  9. @NoArgsConstructor
  10. @AllArgsConstructor
  11. @Builder
  12. public class Student {
  13. private Long id;
  14. private String name;
  15. private Integer age;
  16. }

JDBC操作数据库

我们先来回顾一下JDBC操作数据库的代码:

  1. package com.sjdwz.jdbc;
  2. import com.sjdwz.db.Student;
  3. import java.sql.*;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. /**
  7. * @Description JDBC操作数据库代码示例
  8. * @Date 2023/12/14
  9. * @Created by 随机的未知 sjdwz.com
  10. */
  11. public class JDBCMain {
  12. public static void main(String[] args) throws SQLException, ClassNotFoundException {
  13. //数据库连接地址
  14. String url = "jdbc:mysql://localhost:3306/sjdwz_test";
  15. String user = "root";//用户名
  16. String password = "1234567";//密码
  17. //1.注册数据库驱动
  18. Class.forName("com.mysql.jdbc.Driver");
  19. //2.获取数据库连接对象Connection。
  20. Connection conn = DriverManager.getConnection(url, user, password);
  21. //3.创建Sql语句对象Statement,填写SQL语句
  22. PreparedStatement preparedStatement = conn.prepareStatement("select * from t_student where `name` = ?; ");
  23. //传入查询参数
  24. preparedStatement.setString(1, "张三");
  25. //4.执行SQL查询,返回结果集对象ResultSet
  26. ResultSet resultSet = preparedStatement.executeQuery();
  27. List<Student> studentList = new ArrayList<>();
  28. //5.循环解析结果集,获取查询用户list集合
  29. while (resultSet.next()) {
  30. Student student = Student.builder()
  31. .id(resultSet.getLong("id"))
  32. .name(resultSet.getString("name"))
  33. .age(resultSet.getInt("age"))
  34. .build();
  35. studentList.add(student);
  36. }
  37. //打印查询结果
  38. System.out.println(studentList);
  39. //6.关闭连接,释放资源
  40. resultSet.close();//关闭结果集对象
  41. preparedStatement.close();//关闭Sql语句对象
  42. conn.close();//关闭数据库连接对象
  43. }
  44. }

运行截图如下:

运行截图

这段代码主要有如下四点问题:

  1. 结果集解析复杂,列名硬编码,sql变化导致解析代码变化,系统不易维护;
  2. sql语句硬编码,数据库配置硬编码,难以维护;
  3. 频繁连接、释放数据库资源,没有用到池化思想,系统性能不高;
  4. prepareadStatement向占位符传参数存在硬编码,不易维护。

所以我们需要一个ORM框架,来解决这些痛点。我用的最多的ORM框架是MyBatis,我们就来从源码角度来分析它,看看MyBatis是怎么解决这些问题的。

MyBatis介绍

什么是MyBatis

  • MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。
  • MyBatis对JDBC封装使得开发者只需要关注SQL语句与业务本身即可,无需开发者处理加载驱动、获取连接、创建Statement等繁琐的过程。
  • MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。
  • MyBatis是一个实现了ORM思想的持久层框架。

什么是ORM?为什么说MyBatis是一个半ORM框架?

  • ORM:Object/Relation Mapping 对象/关系映射。
  • ORM思想:将数据库中的关系数据表映射为Java中的对象,把对数据表的操作转换为操作对象,实现面向对象编程。因此,ORM的目的是使得开发人员以面向对象的思想来操作数据库
  • MyBatis框架是一个半自动的ORM持久层框架,也可以在Java中实现类似insert(Student)的操作最终操作数据库,但是需要我们自己写SQL语句。

MyBatis操作数据库

项目结构截图如下:

项目结构截图

在resources目录下创建mybatis-config.xml文件,内容如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <!--数据库连接信息-->
  11. <property name="driver" value="com.mysql.jdbc.Driver"/>
  12. <property name="url" value="jdbc:mysql://localhost:3306/sjdwz_test?useSSL=false"/>
  13. <property name="username" value="root"/>
  14. <property name="password" value="1234567"/>
  15. </dataSource>
  16. </environment>
  17. </environments>
  18. <mappers>
  19. <!-- 加载sql映射文件-->
  20. <mapper resource="StudentMapper.xml"/>
  21. </mappers>
  22. </configuration>

在resources目录下创建StudentMapper.xml文件,内容如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="test">
  6. <!-- id是指sql的唯一标识,resulttype是指返回值的类型-->
  7. <select id="findListByName" resultType="com.sjdwz.db.Student" parameterType="string">
  8. select * from t_student where `name` = #{name};
  9. </select>
  10. </mapper>

MyBatis操作数据库代码如下:

  1. package com.sjdwz.mybatis;
  2. import com.sjdwz.db.Student;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.List;
  10. /**
  11. * @Description Mybatis示例
  12. * @Created by 随机的未知
  13. */
  14. public class MybatisTest {
  15. public static void main(String[] args) throws IOException {
  16. //1.创建SqlSessionFactoryBuilder对象
  17. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  18. //2.SqlSessionFactoryBuilder对象创建工厂对象
  19. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  20. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
  21. //3.工厂对象Factory打开SqlSession会话
  22. SqlSession sqlSession = sqlSessionFactory.openSession();
  23. //4.SqlSession会话对象执行SQL语句,findListByName(命名空间+查询语句唯一标识)
  24. List<Student> studentList = sqlSession.selectList("test.findListByName","张三");
  25. //5.打印查询结果
  26. System.out.println(studentList);
  27. //6.关闭sqlSession会话
  28. sqlSession.close();
  29. }
  30. }

运行截图如下:

运行截图

Mybatis配置和代码解决的问题

在前文,使用JDBC存在四个问题,而Mybatis就解决了这四个问题。

JDBC编码存在的第一个问题的解决

第一个问题是结果集解析复杂,列名硬编码,sql变化导致解析代码变化,系统不易维护;

MyBatis编码中我们不需要进行结果集解析,只需要在编码时指定sql即可,MyBatis会给我们结果;

  1. List<Student> studentList = sqlSession.selectList("test.findListByName","张三");

JDBC编码存在的第二个问题的解决

第二个问题是sql语句硬编码,数据库配置硬编码,难以维护;

数据库的配置和sql语句,我们写到了xml文件,解决了硬编码的问题

JDBC编码存在的第三个问题的解决

第三个问题是频繁连接、释放数据库资源,没有用到池化思想,系统性能不高

MyBatis使用了池化思想,解决了这个问题;

JDBC编码存在的第四个问题的解决

第三个问题是prepareadStatement向占位符传参数存在硬编码,不易维护

我们在配置文件标签上写明了参数,并在代码中传入,避免了占位符的硬编码,解决了此问题。

截图

截图

总结

我们回顾了JDBC和MyBatis的编码方式,了解了JDBC编码存在的问题,并知道了MyBatis编码确实解决了这几个问题。

后面我们就来分析MyBatis源码了。

原文链接:https://www.cnblogs.com/nicaicai/p/18154248

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号