• MyBatis学习:创建工具类MyBatisUtil——整合简化代码量


    1、本篇博客的背景和目的

    目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,介绍了MyBatis框架,初步建立了使用MyBatis和MySQL的Maven项目,简单解释了STDOUT_LOGGING日志和INSERT语句手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口。本篇博客记录将一些固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。

    2、为什么使用工具类MyBatisUtil呢?

    我们在使用MyBatis的时候,如果需要执行一个SQL语句,总是需要加载总配置文件,然后创建SqlSessionFactoryBuilder对象,SqlSessionFactory对象,SqlSession对象。由于SqlSession不是线程安全的,因此每次需要执行SQL语句的时候,都需要新创建一个SqlSession对象。如果在不同的类中要执行SQL语句,上面的过程代码是不是需要重写很多遍啊!!!尽管我们可以复制粘贴,但是代码量很多啊!!!

    那么,我们能不能将上面的过程代码作为一个行为方法封装到一个工具类里面呢?当我们需要执行SQL语句的时候,只需要在类中new出来一个工具类对象,然后调用这个行为方法之后就得到一个SqlSession对象呢?所以:MyBatisUtil工具类就诞生了!!

    3、我的代码文件结构

    项目文件结构如下图所示:

    4、 POM文件代码内容

    POM文件代码如下所示:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.dcygroupId>
    6. <artifactId>MyBatis20220728artifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <properties>
    9. <maven.compiler.source>11maven.compiler.source>
    10. <maven.compiler.target>11maven.compiler.target>
    11. properties>
    12. <dependencies>
    13. <dependency>
    14. <groupId>junitgroupId>
    15. <artifactId>junitartifactId>
    16. <version>4.12version>
    17. <scope>testscope>
    18. dependency>
    19. <dependency>
    20. <groupId>org.mybatisgroupId>
    21. <artifactId>mybatisartifactId>
    22. <version>3.5.6version>
    23. dependency>
    24. <dependency>
    25. <groupId>mysqlgroupId>
    26. <artifactId>mysql-connector-javaartifactId>
    27. <version>8.0.28version>
    28. dependency>
    29. dependencies>
    30. <build>
    31. <resources>
    32. <resource>
    33. <directory>src/main/javadirectory>
    34. <includes>
    35. <include>**/*.propertiesinclude>
    36. <include>**/*.xmlinclude>
    37. includes>
    38. <filtering>falsefiltering>
    39. resource>
    40. resources>
    41. build>
    42. project>

    里面的依赖就是测试的junit依赖,mybatis的依赖,MySQL数据库驱动的依赖。最后由于mapper.xml文件没有写在resources目录下,因此需要有resources标签说明一下。

    5、MyBatis总配置文件mybatis.xml文件代码

    1. configuration
    2. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    4. <configuration>
    5. <settings>
    6. <setting name="logImpl" value="STDOUT_LOGGING"/>
    7. settings>
    8. <environments default="development">
    9. <environment id="development">
    10. <transactionManager type="JDBC">transactionManager>
    11. <dataSource type="POOLED">
    12. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    13. <property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowMultiQueries=true"/>
    14. <property name="username" value="root"/>
    15. <property name="password" value="123456"/>
    16. dataSource>
    17. environment>
    18. environments>
    19. <mappers>
    20. <mapper resource="com/dcy/dao/StudentDao.xml">mapper>
    21. mappers>
    22. configuration>

    6、StudentDao.xml文件代码(也就是不在resources目录下的mapper.xml文件)

    1. mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.dcy.dao.StudentDao">
    5. <select id="selectById" resultType="com.dcy.domain.Student">
    6. select id,name,email,age from student where id=#{studentId}
    7. select>
    8. <insert id="insertStudent">
    9. insert into student values (#{id},#{name},#{email},#{age})
    10. insert>
    11. <select id="selectStudents" resultType="com.dcy.domain.Student">
    12. select * from student
    13. select>
    14. mapper>

    7、dao层的接口StudentDao文件(其实这个文件目前没有实际作用)

    1. package com.dcy.dao;
    2. import com.dcy.domain.Student;
    3. import java.util.List;
    4. public interface StudentDao {
    5. public Student selectById(Integer id);
    6. public List selectStudents();
    7. public int insertStudent(Student student);
    8. }

    8、Student实体类,对应数据库中的student表

    1. package com.dcy.domain;
    2. public class Student {
    3. //这里我们的属性名和数据库表中的列名保持一致,如果不一致的话我们需要在mapper.XML文件中配置或者是使用注解配置
    4. private Integer id;
    5. private String name;
    6. private String email;
    7. private Integer age;
    8. public Integer getId() {
    9. return id;
    10. }
    11. public void setId(Integer id) {
    12. this.id = id;
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. this.name = name;
    19. }
    20. public String getEmail() {
    21. return email;
    22. }
    23. public void setEmail(String email) {
    24. this.email = email;
    25. }
    26. public Integer getAge() {
    27. return age;
    28. }
    29. public void setAge(Integer age) {
    30. this.age = age;
    31. }
    32. @Override
    33. public String toString() {
    34. return "一个学生实体的信息{" +
    35. "id=" + id +
    36. ", name='" + name + '\'' +
    37. ", email='" + email + '\'' +
    38. ", age=" + age +
    39. '}';
    40. }
    41. }

    9、数据表student

    这里我截一下图片,只展示表中字段名和字段类型:

     10、工具类MyBatisUtil代码

    1. package com.dcy.utils;
    2. import org.apache.ibatis.io.Resources;
    3. import org.apache.ibatis.session.SqlSession;
    4. import org.apache.ibatis.session.SqlSessionFactory;
    5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    6. import java.io.IOException;
    7. import java.io.InputStream;
    8. /*
    9. 这个类是一个工具类,是为了解决 使用MyBatis执行SQL语句之前需要准备的对象太多的问题
    10. */
    11. public class MyBatisUtil {
    12. /*
    13. 静态代码块只会执行一次,在加载类的时候执行,先于Main方法执行
    14. */
    15. private static SqlSessionFactory factory=null;
    16. static {
    17. String config="mybatis.xml";
    18. try {
    19. InputStream inputStream = Resources.getResourceAsStream(config);
    20. factory= new SqlSessionFactoryBuilder().build(inputStream);
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. //下面创建方法来获取SqlSession对象
    26. public static SqlSession getSqlSession(){
    27. SqlSession sqlSession=null;
    28. if (factory!=null){//说明存在SqlSessionFactory对象
    29. sqlSession=factory.openSession(true);//自动提交事务
    30. }
    31. return sqlSession;
    32. }
    33. }

    首先是一个静态代码块。静态代码块只会执行一次,并且是在加载类的时候执行,先于Main方法执行。也就是我们启动项目以后,由于静态代码块的存在,这个类中就已经加载好了SqlSessionFactory这个对象,并且只有一个此对象。

    然后又写了一个静态方法,我们只需要使用类名就可以调用这个方法,然后获得一个自动提交事务的SqlSession对象,然后可以使用这个对象的方法执行SQL语句。

    11、在Main方法中进行测试

    1. package com.dcy;
    2. import com.dcy.domain.Student;
    3. import com.dcy.utils.MyBatisUtil;
    4. import org.apache.ibatis.session.SqlSession;
    5. import java.util.List;
    6. public class starter {
    7. public static void main(String[] args) {
    8. //获取SqlSession对象
    9. SqlSession sqlSession= MyBatisUtil.getSqlSession();
    10. //拿到要执行的SQL语句的“地址”
    11. String SqlId="com.dcy.dao.StudentDao"+"."+"selectStudents";
    12. //执行SQL语句并拿到执行结果
    13. List students = sqlSession.selectList(SqlId);
    14. System.out.println(students);
    15. //关闭SqlSession对象
    16. sqlSession.close();
    17. }
    18. }

    上面代码比较简单,我不多解释了,运行后控制台的结果如下所示:

    因为在总配置文件中开启了STDOUT_LOGGING日志,所以打印的有日志。

    12、我的上一篇博文

    上一篇博文解释了MyBatis执行SQL的具体过程和需要使用到的一些重要类和对象,感兴趣的读者可以移步阅读,链接如下:

    MyBatis学习:MyBatis执行SQL语句的过程和Resources,SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession_你是我的日月星河的博客-CSDN博客icon-default.png?t=M666https://blog.csdn.net/weixin_46281472/article/details/126024873

    13、我的下一篇博文

     

  • 相关阅读:
    【广州华锐互动】利用AR远程指导系统进行机械故障排查,实现远程虚拟信息互动
    浅谈安科瑞无线测温产品在埃及某房建配电项目中的应用
    期末前端web大作业:餐饮美食网站设计与实现——HTML+CSS+JavaScript美食餐饮网站 3页面
    【车联网/自动驾驶仿真学习】VEINS_CARLA安装指南
    2023年软考高级系统规划与与管理师备考策略
    查找浏览器中保存的密码
    ip伪装..
    c++ LRU(最近最少使用)缓存机制
    ffmpeg视频编解码 demo初探(一)(包含下载指定windows版本ffmpeg)分离视频文件中的视频流每一帧YUV图片
    Python爬虫入门
  • 原文地址:https://blog.csdn.net/weixin_46281472/article/details/126064364