• MyBatis环境搭建&&测试增删改查


    目录

    一、MyBatis简介

            1.1 什么是MyBatis?

    二、MyBatis环境搭建

            2.1 MyBatis环境搭建步骤

    三、MyBatis generator插件的使用

            3.1 基于ssm逆向工程的使用

    四、测试MyBatis增删改查


    一、MyBatis简介

    1.1 什么是MyBatis?

    MyBatis 是一款持久层框架,支持自定义 SQL、存储过程以及高级映射。

    MyBatis 省略了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

    MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    简单直白的来说的话就是: 

            是一款ORM框架,即对象映射关系框架;

            是一款关于数据库层面的框架;


    二、MyBatis环境搭建

    2.1 MyBatis环境搭建步骤

         2.1.1 创建maven工程

         2.1.2导入相关pom依赖

         这里放上一些我们需要导入的pom依赖:

         建立一个用于我们数据库连接信息的配置文件:jdbc.properties

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=用户名
    4. jdbc.password=密码

         2.1.3Mybatis相关插件安装

            我们先把这四个插件下载好:

            安装以下插件

    Free mybatis plugin

    Mybatis generator

    mybatis tools

    maven helper     

         2.1.4Mybatis.cfg.xml配置

         导入框架的配置文件:mybatis.cfg.xml

          

    1. configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    2. <configuration>
    3. <properties resource="jdbc.properties"/>
    4. <settings>
    5. <setting name="logImpl" value="LOG4J2"/>
    6. settings>
    7. <typeAliases>
    8. typeAliases>
    9. <environments default="development">
    10. <environment id="development">
    11. <transactionManager type="jdbc"/>
    12. <dataSource type="POOLED">
    13. <property name="driver"
    14. value="${jdbc.driver}"/>
    15. <property name="url"
    16. value="${jdbc.url}"/>
    17. <property name="username" value="${jdbc.username}"/>
    18. <property name="password" value="${jdbc.password}"/>
    19. dataSource>
    20. environment>
    21. environments>
    22. <mappers>
    23. mappers>
    24. configuration>

    三、MyBatis generator插件的使用

    3.1 基于ssm逆向工程的使用

    使用这个插件我们就可以自动生成增删改查的代码;

    我们使用这个要使用MyBatis generator这个插件,需要做到的一些步骤:

    1. 安装Mybatis generator插件
    2. 配置generatorConfig.xml
    3. 配置maven运行generator命令
    4. 在pom中处理generatorConfig.xml不能编译问题

    第一步的插件就放在我们上面要安装的那四个插件之中;

    第二步:建立generatorConfig.xml配置文件

    1. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    2. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    3. <generatorConfiguration>
    4. <properties resource="jdbc.properties"/>
    5. <classPathEntry location="D:\\initPath\\mvn_repository\\mysql\\mysql-connector-java\

    第三步:配置maven运行这个插件的命令:

    1、idea的工具栏 ---> 点击 Add Configuration...

     2、点击添加命令 ---> 选择Maven

    3、命令取 个名字 ---> 填入这一串:

    mybatis-generator:generate -e

    ---> 选择要生成代码的项目

     4、右键选择Run Maven ---> 选择我们刚刚配置好的命令 

    代码生成后:

    然后我们看看生成的代码:


    四、测试MyBatis增删改查

    我们已经完成了自动生成增删改查的代码,但是现在我们还并不知道能不能成功使用,所以我们就通过几个增删改查的案例来测试一下!

    4.1 测试增删改查所需要的工具类

            4.1.2 sqlSession的作用:

           ① 可以拿到Mapper对象(二级缓存);② 作为缓存使用(一级缓存)也是默认开启的缓存;

           ③ 处于性能的考虑,会采用二级缓存,二级缓存需要手动开启。

    生成Session的一个工具类:

    SessionUtile.java

    1. package com.leaf.util;
    2. import org.apache.ibatis.session.SqlSession;
    3. import org.apache.ibatis.session.SqlSessionFactory;
    4. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    5. /**
    6. * sqlSession
    7. * @author Leaf
    8. * @site 2977819715
    9. * @company 玉渊工作室
    10. * @create  2022-08-11 1:00
    11. */
    12. public class SessionUtil {
    13. private static SqlSessionFactory sessionFactory;
    14. private static ThreadLocal threadLocal = new ThreadLocal();
    15. static {
    16. sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml"));
    17. }
    18. public static SqlSession openSession() {
    19. SqlSession session = threadLocal.get();
    20. if (null == session) {
    21. session = sessionFactory.openSession();
    22. threadLocal.set(session);
    23. }
    24. return session;
    25. }
    26. public static void main(String[] args) {
    27. SqlSession session = openSession();
    28. System.out.println(session.getConnection());
    29. session.close();
    30. // System.out.println(session.getConnection());
    31. }
    32. }

     4.2 测试逆向生成的代码是否正确

    我们先来分析一下:

            有事务:增删改 

            无事务:查询

    结论:

    我们就测试一下查询和删除,如果这两个没有问题的话就基本没有什么问题;

     我们建立一个测试的接口:BookBiz:

    1. package com.leaf.biz;
    2. import com.leaf.model.Book;
    3. /**
    4. * @author Leaf
    5. * @site 2977819715
    6. * @company 玉渊工作室
    7. * @create  2022-08-11 1:09
    8. */
    9. public interface BookBiz {
    10. //删除
    11. int deleteByPrimaryKey(Integer bid);
    12. //查询
    13. Book selectByPrimaryKey(Integer bid);
    14. }

    然后我们实现这个接口:BookBizImpl ,快捷建立方法:

    鼠标放在类名上面 ---> Alt + Enter ---> 选择implement interface

     然后自己建立要存放的目录结构 ---> 点击OK

     然后再次点击OK:

     就自动帮我们创建实现方法啦:

     一份快捷小技巧:

    //Alt+Enter 快速构建实现类,填充代码的前半部分 Ctrl+1
    //Alt+Insert 快速提供set/get/toString/构造方法

    我们调用自动生成的代码,编写好的实现类代码:BookBizImpl 

    1. package com.leaf.biz.impl;
    2. import com.leaf.biz.BookBiz;
    3. import com.leaf.mapper.BookMapper;
    4. import com.leaf.model.Book;
    5. /**
    6. * @author Leaf
    7. * @site 2977819715
    8. * @company 玉渊工作室
    9. * @create  2022-08-11 2:21
    10. */
    11. public class BookBizImpl implements BookBiz {
    12. private BookMapper bookMapper;
    13. //Alt+Enter 快速构建实现类,填充代码的前半部分 Ctrl+1
    14. //Alt+Insert 快速提供set/get/toString/构造方法
    15. public BookMapper getBookMapper() {
    16. return bookMapper;
    17. }
    18. public void setBookMapper(BookMapper bookMapper) {
    19. this.bookMapper = bookMapper;
    20. }
    21. @Override
    22. public int deleteByPrimaryKey(Integer bid) {
    23. return bookMapper.deleteByPrimaryKey(bid);
    24. }
    25. @Override
    26. public Book selectByPrimaryKey(Integer bid) {
    27. return bookMapper.selectByPrimaryKey(bid);
    28. }
    29. }

    然后我们还要建立一个测试类进行测试:Alt + Enter ---> 选择Create Test

     

    然后我们把一些没有用的、报红的包都删掉,最后写好的测试类:

    1. package com.leaf.biz.impl;
    2. import com.leaf.biz.BookBiz;
    3. import com.leaf.mapper.BookMapper;
    4. import com.leaf.util.SessionUtil;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.junit.After;
    7. import org.junit.Before;
    8. import org.junit.Test;
    9. import org.junit.runner.RunWith;
    10. import static org.junit.Assert.*;
    11. /**
    12. * @author Leaf
    13. * @site 2977819715
    14. * @company 玉渊工作室
    15. * @create  2022-08-11 2:29
    16. */
    17. public class BookBizImplTest {
    18. private BookBiz bookBiz;
    19. private SqlSession sqlSession;
    20. @Before
    21. public void setUp() throws Exception {
    22. System.out.println("初始化方法...");
    23. BookBizImpl bookBiz = new BookBizImpl();
    24. //工具类中获取session对象
    25. sqlSession = SessionUtil.openSession();
    26. //从session对象中获取mapper对象
    27. BookMapper mapper = sqlSession.getMapper(BookMapper.class);
    28. bookBiz.setBookMapper(mapper);
    29. this.bookBiz = bookBiz;
    30. }
    31. @After
    32. public void tearDown() throws Exception {
    33. System.out.println("方法测试结束...");
    34. sqlSession.commit();
    35. sqlSession.close();
    36. }
    37. @Test
    38. public void deleteByPrimaryKey() {
    39. bookBiz.deleteByPrimaryKey(44);
    40. }
    41. @Test
    42. public void selectByPrimaryKey() {
    43. System.out.println("测试的业务方法...");
    44. System.out.println(bookBiz.selectByPrimaryKey(45));
    45. }
    46. }

    然后我们去到我们之前建立的MyBatis的配置文件:mybatis.cfg.xml 中,

    把其中的关于 配置我们写的实现类 的那一行代码 注释打开:

    由于项目开发中,一般会集成日志框架,可以帮助程序猿在开发的过程中快熟排查问题,所以我们还需要建立一个日志框架的配置文件:log4j2.xml

    1. <Configuration status="WARN" monitorInterval="30">
    2. <Properties>
    3. <Property name="LOG_HOME">/root/workspace/lucenedemo/logsProperty>
    4. <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/errorproperty>
    5. <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warnproperty>
    6. <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%nproperty>
    7. Properties>
    8. <Appenders>
    9. <Console name="Console" target="SYSTEM_OUT">
    10. <ThresholdFilter level="trace" onMatch="ACCEPT"
    11. onMismatch="DENY" />
    12. <PatternLayout pattern="${PATTERN}" />
    13. Console>
    14. <File name="log" fileName="logs/test.log" append="false">
    15. <PatternLayout
    16. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    17. File>
    18. <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
    19. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
    20. <ThresholdFilter level="info" onMatch="ACCEPT"
    21. onMismatch="DENY" />
    22. <PatternLayout
    23. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    24. <Policies>
    25. <TimeBasedTriggeringPolicy interval="1"
    26. modulate="true" />
    27. Policies>
    28. RollingFile>
    29. <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
    30. filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
    31. <ThresholdFilter level="warn" onMatch="ACCEPT"
    32. onMismatch="DENY" />
    33. <PatternLayout
    34. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    35. <Policies>
    36. <TimeBasedTriggeringPolicy />
    37. <SizeBasedTriggeringPolicy size="2 kB" />
    38. Policies>
    39. <DefaultRolloverStrategy max="20" />
    40. RollingFile>
    41. <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
    42. filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
    43. <ThresholdFilter level="error" onMatch="ACCEPT"
    44. onMismatch="DENY" />
    45. <PatternLayout
    46. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    47. <Policies>
    48. <TimeBasedTriggeringPolicy interval="1"
    49. modulate="true" />
    50. Policies>
    51. RollingFile>
    52. Appenders>
    53. <Loggers>
    54. <logger name="org.springframework" level="INFO">logger>
    55. <logger name="org.mybatis" level="INFO">logger>
    56. <logger name="org.springframework" level="ERROR" />
    57. <logger name="org.hibernate" level="ERROR" />
    58. <logger name="org.apache.struts2" level="ERROR" />
    59. <logger name="com.opensymphony.xwork2" level="ERROR" />
    60. <logger name="org.jboss" level="ERROR" />
    61. <root level="all">
    62. <appender-ref ref="Console" />
    63. <appender-ref ref="RollingFileInfo" />
    64. <appender-ref ref="RollingFileWarn" />
    65. <appender-ref ref="RollingFileError" />
    66. root>
    67. Loggers>
    68. Configuration>

    然后我们来测试一下查询(无事务):

     选择Run...

     运行结果:

    然后我们再测试一下删除方法: 

    方法是执行成功了,然后我们又去数据库看看:

    我们呢发现数据库中还是没有删除!

    所以我们联想到增删改都是有事务的,于是我们添加两行代码: 

    1. @After
    2. public void tearDown() throws Exception {
    3. System.out.println("方法测试结束...");
    4. //在结束方法里面添加提交事务的代码
    5. sqlSession.commit();
    6. sqlSession.close();
    7. }

    然后再次测试:

    这一次数据库也删除成功啦! 


    OK,以上就是Leaf今天带来的MyBatis环境搭建以及一些插件的使用,我们下期再见!!!

  • 相关阅读:
    吃货贴 | 「咸、甜、辣」如何影响肠道菌群?
    ESP8266-Arduino编程实例-OLED显示BMP180传感器数据
    Linux引入中saltstack介绍与使用
    Hadoop之HDFS——【模块二】数据管理
    windows10下安装Mujoco 详细安装教程 + 附安装包
    【Linux】进程与服务
    浏览器插件开发爬虫记录
    pychon假消息生产器
    c++复合数据类型
    【架构】常见技术点--服务治理
  • 原文地址:https://blog.csdn.net/qq_63492318/article/details/126276734