【Spring全家桶与Mybatis】Spring环境下整合Mybatis(纯注解方式)

news2024/10/6 18:34:31

⭐️前面的话⭐️

本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍在Spring环境下整合mybatis。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年5月11日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《无》
💬参考在线编程网站:🌐牛客网🌐力扣🌐acwing
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


📌导航小助手📌

    • 1.项目结构与项目所需依赖
    • 2.整合Mybatis
      • 2.1基本工作
      • 2.2创建配置类
      • 2.3基于配置文件完成SQL
      • 2.4整合junit完成单元测试
      • 2.5基于注解完成SQL


封面


1.项目结构与项目所需依赖

1

第一步,创建Maven项目

第二步,在pom中导入相关依赖

本项目使用的依赖如下:

        <!--  spring框架依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.15</version>
        </dependency>
        <!-- druid数据库连接池依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
        <!--   mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--    spring整合mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.7</version>
        </dependency>
        <!--  jdbc依赖  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.15</version>
        </dependency>
        <!--  mysql驱动依赖  -->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--  lombok依赖 用于快速生成setter getter 和 toString  -->
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
            <scope>provided</scope>
        </dependency>
        <!-- 整合junit -->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!-- spring test环境-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

第三步,创建服务层service, 配置层config,实体层mode,持久层dao
2

第四步,创建properties文件,用来配置数据库信息

jdbc.properties文件内容如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/accounts?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

第五步,创建验证类

App类

2.整合Mybatis

2.1基本工作

编写sql语句,进行建数据库,建数据表,我们创建一个银行账户表为例,数据库为accounts,数据表为account

相关SQL语句如下:

create database if not exists accounts;
use accounts;
-- 创建银行账户表
drop table if exists account;
create table account (
    -- 用户编号uid
                         uid int primary key auto_increment,
    -- 身份证号
                         id varchar(32) unique,
    -- 姓名
                         username varchar(32),
    -- 年龄
                         age int,
    -- 性别
                         sex varchar(4),
    -- 住址
                         address varchar(256),
    -- 电话
                         telephone varchar(24),
    -- 余额
                         money double(8, 2) not null default 0
    );

insert into account values (null, '120321202011111232', '小明', 32, '男', '上海市', '12345678900', 1222.56);
insert into account values (null, '430321202011111242', '小花', 18, '女', '湖南省长沙市', '12345678901', 12466.56);
insert into account values (null, '310321202011111252', '小卷', 32, '男', '福建省厦门市', '12345678902', 31222.56);

2.2创建配置类

第一步,创建Spring配置类
创建SpringConfig类,加上@Configuration注解,配置基础扫描包@ComponentScan("com.mybatis.demo"),加载properties配置文件@PropertySource("classpath:jdbc.properties")

@Configuration
@PropertySource("classpath:jdbc.properties")
@ComponentScan("com.mybatis.demo")
public class SpringConfig {
}

第二步,配置连接数据库连接池和配置DataSource

创建一个JdbcConfig配置类,加上dataSource方法用于产生DataSource对象,在配置mybatis配置类需要使用到。

public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String drive;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    //配置数据源
    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(drive);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}

第三步,创建Mybatis配置类

首先我们来回个一下mybatis配置文件的格式,大致如下:

3

我们需要将mybatis的xml文件转换为配置类,在此之前,我们来了解一下mybatis的进行sql操作的流程:

  1. 创建SqlSessionFactoryBuilder对象,用于建设SqlSessionFactory对象。
  2. 加载mybatis的xml配置文件,并读取到流当中。
  3. 通过SqlSessionFactoryBuilder对象和保存的配置流创建SqlSessionFactory对象,用于造SqlSession对象。
  4. 获取SqlSession,用于获取mybatis中的mapper接口“对象”。
  5. 获取相关的mapper接口对象,调用查询方法进行查询,获取结果。

翻译成代码就是如下:

// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config-xml.xml");
// 3. 创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 4. 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 执行SqlSession对象执行查询,获取结果
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
//验证查询方法
Account account = accountDao.findByUid(1);
System.out.println(account);

所以我们创建mybatis配置类时最起码需要将DataSource数据源配置好交给SqlSessionFactory,对于 SqlSessionFactory对象,在spring整合mybatis包中有一个SqlSessionFactoryBean类可以用于生产SqlSessionFactory对象,所以我们实例化并配置SqlSessionFactoryBean类对象即可,当然SqlSessionFactory类需要数据源初始化,那对于SqlSessionFactoryBean类对象也得给它数据源。

数据源通过setDataSource方法进行配置。

加载properties配置文件在SpringConfig已经做过了,并且已经生成了DataSource对象,所以这里就不需要额外配置了。

对于mybatis配置文件中有个typeAliase标签,该标签其实就是给项目中对应的类(包含包)改名。我们知道在项目中,一个包含包的类名字那是长的不得了,这不,mybatis来帮我们省力气了。

    <!-- 配置别名:在MyBatis中为一个类取别名   配置别名是为了在对象映射文件中接收参数类型和返回参数类型时使用-->  
    <typeAliases>  
        <!--       
            设置这个包下面的所有类的别名  默认是类名小写
            <package name="cn.itsource.domain"/>   
        -->  
          
        <!--   
            设置单个类的别名       
            alias:取的别名    
            type:这个别名所对应的Java类    别名使用的时候与大小写无关 
        -->  
        <typeAlias alias="Product" type="cn.itsource.domain.Product"/>  
    </typeAliases>

下面来通过一个例子来说明typeAliase的作用:

例如模糊查询示例,当不使用别名,而使用全路径时,配置示例代码如下:

<select id="findUserByUsername" parameterType="java.lang.String" resultType="cn.com.mybatis.pojo.User">
    SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>

当通过设置 MyBatis 的全局配置文件 SqlMapConfig 中的 typeAliases 属性后,就可以为 sql 映射文件中的输入或输出参数设置类型别名,然后在 sql 映射配置文件中指定输入输出参数类型时使用的别名。首先,SqlMapConfig 配置文件示例如下:

<typeAliases>
    <typeAlias alias="user" type="cn.com.mybatis.pojo.User"/>
    <typeAlias alias="str" type="java.lang.String"/>
</typeAliases>

这样就可以在 sql 映射配置文件中使用别名来指定输入 / 输出参数的类型了,其示例代码如下:

<select id="findUserByUsername" parameterType="str" resultType="user">
    SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>

设置package标签后,会自动将所设置包下所有的类,都取一个别名,默认名字为类名的小驼峰形式。

不使用typeAliases

<!--    根据uid查询-->
    <select id="selectByUid" resultType="com.mybatis.demo.mode.Account">
        select * from Account where uid = #{uid}
    </select>

typeAliases配置,将所设置包下所有的类自动取别名。

    <typeAliases>
        <package name="com.mybatis.demo.mode"/>
    </typeAliases>

使用typeAliases

<!--    根据uid查询-->
    <select id="selectByUid" resultType="account">
        select * from Account where uid = #{uid}
    </select>

一般使用package比较多,因为方便简单,功能强大。

这个配置也是在SqlSessionFactoryBean类对象中配置的,使用setTypeAliasesPackage进行设置。

至于事务配置先不管,不设置会默认使用JDBC事务。

最后还有一个mapper标签,对于加载mapper配置文件加载SQL则需要在SqlSessionFactoryBean类对象中使用setMapperLocations方法设置对应mapper配置文件路径。

如果使用通过注解加载SQL,需要再设置一个实例化一个MapperScannerConfigurer来设置扫描的包,使用setBasePackage方法配置即可。

综上所述,MybatisConfig配置类如下:

public class MybatisConfig {
    //配置mybatis
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.mybatis.demo.mode");
        //设置mapper文件路径
        sqlSessionFactoryBean.setMapperLocations(new ClassPathResource("mapper/AccountsMapper.xml"));
        return sqlSessionFactoryBean;
    }
    //配置dao扫描包
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.mybatis.demo.dao");
        return mapperScannerConfigurer;
    }
}

最后在SpringConfig将这俩配置类加载即可。

@Configuration
@PropertySource("classpath:jdbc.properties")
@ComponentScan("com.mybatis.demo")
@Import({MybatisConfig.class, JdbcConfig.class})
public class SpringConfig {
}

2.3基于配置文件完成SQL

这个就比较简单了,在resources文件夹中创建配置文件,然后将路径正确配置到mybatis配置类即可。

配置文件内容如下:

4

具体都在图上了,我就不多说了,对应的mapper接口如下:

4
包路径如下:

5

Service层对应类实现如下:

@Service
public class AccountsServiceImpl implements AccountsService {
    @Resource
    private AccountsDao accountsDao;

    public Account selectByUid(int uid){
        System.out.println("service : select by uid ...");
        return accountsDao.selectByUid(uid);
    }
}

最后我们编写一下测试类App:

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        AccountsService service = context.getBean(AccountsService.class);
        Account account = service.selectByUid(1);
        System.out.println(account);
    }
}

运行结果:

service : select by uid ...
四月 21, 2023 1:26:19 上午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
Account(uid=1, id=120321202011111232, username=小明, age=32, sex=, address=上海市, telephone=12345678900, money=1222.56)

Process finished with exit code 0

2.4整合junit完成单元测试

我们直接使用一个测试类运行main方法,其实会运行全部项目模块,其实没有必要,在实际开发中常常使用单元测试进行测试,最出名的单元测试就是junit,下面我们来进行整合。

第一步,导入相关依赖

        <!-- 整合junit -->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!-- spring test环境-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

第二步,在test目录下的java文件夹中创建测试类

现在我们要测试我们刚才的查询操作是否正确,我们可以创建一个AccountsServiceTest类,要使用的话,需要一些配置:

第一,设置junit测试环境,加上以下注解

//设置junit4的测试环境
@RunWith(SpringJUnit4ClassRunner.class)

第二,设置Spring环境对应的配置类

@ContextConfiguration(classes = {SpringConfig.class})

如果是配置文件请加载配置文件

@ContextConfiguration(locations={"classpath:applicationContext.xml"})//加载配置文件

编写方法,加上@Test注解标记为单元测试方法,测试过程中,需要使用AccountsService对象,直接注入即可,具体测试代码如下:

//设置junit4的测试环境
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring环境对应的配置类
@ContextConfiguration(classes = {SpringConfig.class})
//如果是配置文件请加载配置文件@ContextConfiguration(locations={"classpath:applicationContext.xml"})//加载配置文件
public class AccountsServiceTest {
    @Autowired
    private AccountsService accountsService;
    @Test
    public void SelectByUidTest() {
        Account account = accountsService.selectByUid(1);
        System.out.println(account);
    }
}

运行结果:

6

2.5基于注解完成SQL

这个其实很简单,使用配置文件我们需要创建配置文件,然后指定是那个文件,而使用注解加载SQL,直接在对应接口上面加上对应操作的注解,括号里面的属性填好SQL属性即可,注意要将配置的扫描的路径包含这个接口类的位置。

对应操作注解也就对应SQL的增删查改,分别为:

  • @Select,查询
  • @Update,更新/修改
  • @Delete,删除
  • @Insert,插入/新增

将上面基于配置文件的查询改为基于注解的代码为:

7

服务层实现代码:
8
9

单元测试:
10

单元测试结果:

11
OK,没有任何问题,本文整合mybatis只使用了一个查询方法演示,其实其他操作是一模一样的,整合过程完全一样,唯一的区别就是要重新写SQL和测试类。


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

520快给你喜欢的女生发个表白软件吧!【手把手教学】

文章目录 项目介绍一、创建项目二、设计窗体三、添加事件总结 项目介绍 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 开发工具&#xff1a;Visual Studio 2022 本项目是用C# Winform开发的一个小软件。 实现非常简单&#xff0c;下面看一下这个软件运行…

Vector - CAPL - CANoe硬件CANCANFD参数

如何更改与 CAPL 的 CAN 总线通信的波特率&#xff1f; 解决办法 通常我们常见的配置方法主要有两种方法可以使用 CAPL 更改波特率&#xff0c;使用函数 setBtr或使用 canSetConfiguration、canFdSetConfiguration。 1. setBtr(long channel, byte btr0, byte btr1) setBtr仅…

flink watermark介绍及watermark的窗口触发机制

Flink的三种时间 在谈watermark之前&#xff0c;首先需要了解flink的三种时间概念。在flink中&#xff0c;有三种时间戳概念&#xff1a;Event Time 、Processing Time 和 Ingestion Time。其中watermark只对Event Time类型的时间戳有用。这三种时间概念分别表示&#xff1a; …

[golang gin框架] 30.Gin 商城项目- 购物车商品确认页面以及收货地址的增删改查

一.界面展示 购物车页面 增加功能&#xff1a; 展示用户加入的购物车数据&#xff0c;并点击‘去结算’按钮&#xff0c; 判断是否选中商品 确认订单页面 展示 选中的购物车商品数据(商品标题&#xff0c;图片&#xff0c;数量等)以及 结算的数据(总的价格&#xff0c;总的数量…

【Spring】初识MyBatis (二)

&#xff08;接上一篇【Spring】[初识MyBatis&#xff08;一&#xff09;]&#xff09; 目录 1.2 根据用户名模糊查询用户信息2 添加客户3 更新用户4 删除用户 1.2 根据用户名模糊查询用户信息 【示例6-2】模糊查询的实现只需要在映射文件中通过元素编写相应的SQL语句&#x…

华为手机如何进入开发者模式?连接studio真机调试

对于安卓开发者来说&#xff0c;真机调试是非常好的选择&#xff0c;对电脑配置也没有过分的要求。如果采用Android Studio自带安卓虚拟机调试&#xff0c;真的很慢&#xff0c;一点都不友好。 真机调试的步骤&#xff1a;打开设置->关于手机->版本号&#xff0c;然后连…

并发编程12:AQS

文章目录 12.1 前置知识12.2 AQS入门级别理论知识12.2.1 是什么&#xff1f;12.2.2 AQS为什么是JUC内容中最重要的基石12.2.3 能干嘛&#xff1f;12.2.4 小总结 12.3 AQS源码分析前置知识储备12.3.1 AQS内部体系架构图12.3.2 AQS内部体系架构----AQS自身12.3.1 AQS内部体系架构…

一、H3C-NE实验-抓包实验

实验一&#xff1a;抓包实验&#xff08;PING包&#xff09; 实验拓扑结构图 1. 修改设备名称 步骤1&#xff1a;启动设备 步骤2&#xff1a;在路由器1&#xff0c;进入系统视图&#xff0c;并修改设备名称为R1 步骤3&#xff1a;在路由器2&#xff0c;进入系统视图&#xf…

【Java|基础篇】类和对象

文章目录 1. 前言2. 什么是面向对象3. 类的定义4. 类的实例化5. 对象的构造及初始化6. this引用7. 总结 1. 前言 本篇文章主要讲解了下面三个问题 类的定义和实例化构造方法this关键字 2. 什么是面向对象 众所周知面向过程和面向对象是两种重要的编程思想,而Java是属于面向…

C语言函数大全-- v 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- v 开头的函数 1. va_start 1.1 函数说明 函数声明函数功能void va_start(va_list ap, last_arg);用于初始化一个 va_list 类型的变量&#xff0c;使其指向可变参数列表中的第一个参数 参数&#xff1a; ap&#xff1a; 一个指向 va_…

我的创作纪念日(个人感悟)

昨天2023年5月10日是我成为创作者的第128天纪念日&#xff0c;感谢CSDN官方的纪念信让我铭记这特殊的一天。 机缘 要说与CSDN的初次相遇&#xff0c;还是2022年的高考结束完的暑假&#xff0c;当时对于大学的学习没有什么概念&#xff0c;当初的高考志愿报的有计算机相关的专…

spring集成mybatis的原理

spring是怎样和mybatis继承的&#xff1f; 在idea里点mapper.queryOne()直接跳到了接口或xml&#xff0c;它究竟是怎样利用jdbc执行的&#xff1f; 我直接调用mapper.queryOne是怎么使用的sqlsession&#xff1f;怎么去connect的&#xff1f; mybatis是怎样根据mapper找到对应的…

【Java面试】Java并发基础(1)

文章目录 1. 可见性&#xff0c;有序性&#xff0c;原子性2. java中并发和并行3. 通常线程有哪几种使用方式? 1. 可见性&#xff0c;有序性&#xff0c;原子性 可见性&#xff08;Visibility&#xff09;&#xff1a; 指一个线程修改了共享变量的值之后&#xff0c;其他线程能…

学习网络通信必备的DNS解析和Socket通信知识

OkHttp是一个开源的网络请求框架&#xff0c;由Square公司开发。它通过封装Java底层的HttpURLConnection和Okio等库&#xff0c;提供一个简单易用的API&#xff0c;让开发人员能够方便地向服务器发送HTTP/HTTPS请求&#xff0c;支持异步请求和响应回调&#xff0c;并提供丰富的…

未来已来, 新能源与IT的技术碰撞;学习Android车载开发的必然趋势

Android工程师前景 Android车载工程师扮演着关键的角色&#xff0c;他们致力于将最新的Android技术和汽车技术相结合&#xff0c;为汽车行业提供优质的产品。随着越来越多的汽车制造商投资于智能汽车技术和车联网技术&#xff0c;Android车载工程师成为了一个越来越重要的职业…

MATLAB实现二维稳态导热

MATLAB实现二维稳态导热 一、理论基础二、代码实现 一、理论基础 步骤&#xff1a; Step.1 二维模型传热控制微分方程的确定&#xff0c;具体推导可以在任何一本传热学的书中找到。 d 2 T d x 2 d 2 T d y 2 0 \frac{d^{2}T}{dx^{2}}\frac{d^{2}T}{dy^{2}}0 dx2d2T​dy2d2T…

Ansible 自动化运维工具(一)——部署以及命令行模块

文章目录 一、 ansible 的概述1、ansible简介2.、官方网站3、ansible 的特点4、ansible的工作机制5、ansible的组成模块 二、ansible部署1、Asible的安装 三、ansible 命令行模块1、command 模块2、shell 模块3、cron 模块4、user 模块5、group 模块6、copy 模块7、file 模块8、…

【ros/ros2】ros1和ros2的区别-要点记录

dds data distribution service&#xff0c;数据分发服务 rcl ros client libraries&#xff0c;ros客户端库文件 rmw ros middle ware interface&#xff0c;ros中间件接口 lcn life cycle node&#xff0c;生命周期节点&#xff0c;受控节点 lmn lifecycle manageme…

C++二叉树递归方法存入和三种递归方法读出(前序,中序,后序)

#include <stdio.h> #include <malloc.h> typedef struct op //定义子树结构 { int data; struct op *lchild; struct op *rchild; }treestruct; treestruct *createtree() //这里这种表达形式意思是bittree类型的函数 最终要返回bitt…

【Linux】版本管理器Git

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、Git是什么二、Git有什么…