Spring | SM整合(Spring+MyBatis)

news2024/9/23 23:32:06

0️⃣使用工具

  • 编辑器:IDEA企业版

  • 构建系统:Maven

  • 数据库:MySQL

1️⃣创建项目

🎏创建maven项目

选择新建项目,在E盘下创建名为SMDemo的项目,构建系统选择Maven.

🎏项目结构

  • src/main/java - java 逻辑代码类 存放的位置

  • src/main/resources - 配置文件、资源包等存放的位置

  • src/test/java - java测试类 存放的位置

  • pom.xml - 添加依赖的位置,maven自动帮我们导入依赖对应的jar包

2️⃣添加依赖

打开pom.xml文件,初始代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SMDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

🎏导入MyBatis与数据库相关依赖

添加<dependencies></dependencies>标签,在标签中加入相关依赖<dependency>

⭕MyBatis

       <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

⭕MySQL连接

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

⭕Druid数据库连接池

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.23</version>
        </dependency>

🎏导入Spring依赖

⭕Spring

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>

⭕Spring对ORM的支持

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>

🎏导入Spring与MyBatis关联的依赖

⭕Spring与MyBatis关联

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>

🎏导入其他依赖

⭕junit

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

🎏最终代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SMDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--mybatis与数据库相关-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.23</version>
        </dependency>

        <!--spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>


        <!--spring与mybatis关联-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>


        <!--其他-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

点击右上角的小按钮刷新导入

3️⃣配置文件

🎏MyBatis阶段编写配置文件

在以前MyBatis阶段,我们编写项目会添加一个mybatis-config.xml文件,在文件中配置数据库连接的相关参数等,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--配置别名-->
    <typeAliases>
        <typeAlias type="com.app.pojo.User" alias="user"/>
    </typeAliases>

    <!--配置多个环境,default属性指定使用哪个环境-->
    <environments default="mysql">
        <!--配置具体环境-->
        <environment id="mysql">
            <!--
            配置事务管理器,type属性为JDBC,说明事务的管理底层使用JDBC事务
                Connection:
                    setAutoCommit(false):开启事务
                    commit():提交事务
                    rollback():回滚事务
            -->
            <transactionManager type="JDBC"/>
            <!--
            配置数据源,type属性有:
                POOLED:使用数据库连接池,底层由MyBatis实现
                UNPOOLED:没有使用数据库连接池
                JNDI:JavaEE技术之一,底层实现类似于操作系统的注册表
            -->
            <dataSource type="POOLED">
                <!--配置参数-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db_study"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--配置关联映射文件-->
    <mappers>
        <!--配置具体映射文件,resource属性是关联映射文件的路径-->
        <mapper resource="com/app/dao/UserMapper.xml"/>
    </mappers>
</configuration>

🎏使用Spring编写配置文件

如今我们使用Spring,对于Dao的Dao.xml实现,我们需要使用Spring的IoC容器进行bean的管理。因此,我们不再需编写mybatis-config.xml,而是在Spring的配置文件中编写相关配置,将所有dao对应的dao.xml生成对应的实例。

⭕编写Spring配置文件

新建Spring的xml配置文件app.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

</beans>

⭕扫描所有要被Spring管理实例(通过注解方式开发)

    <!--扫描所有要被Spring管理的实例-->
    <context:component-scan base-package="com.app"/>

⭕生成数据库连接池对象

    <!--生成Druid数据库连接池对象-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_study"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

⭕配置SqlSessionFactory

    <!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.app.pojo"/>
    </bean>

⭕生成dao.xml对应实例

    <!--扫描所有的dao,将所有dao对应的dao.xml生成对应的实例-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--依赖于sqlSessionFactory-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <property name="basePackage" value="com.app.dao"/>
    </bean>

🎏最终代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--扫描所有要被Spring管理的实例-->
    <context:component-scan base-package="com.app"/>

    <!--生成Druid数据库连接池对象-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_study"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.app.pojo"/>
    </bean>

    <!--扫描所有的dao,将所有dao对应的dao.xml生成对应的实例-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--依赖于sqlSessionFactory-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <property name="basePackage" value="com.app.dao"/>
    </bean>
</beans>

4️⃣打开数据库

🎏登录MySQL

管理员身份启动cmd,输入 net start mysql 启动 mysql 数据库服务。

net start mysql

输入用户名、密码登录 mysql 。

mysql -u 你的用户名 -p

查看 mysql 中的数据库,选择你的数据库

show databases;
use 你的数据库;

🎏创建 user 表

创建了一张 user 表,包含了 id,name,password 三个字段。其中 id 字段为主键,设置为自动增长

create table user(
    id int primary key auto_increment,
    name varchar(20),
    password varchar(20)
    );

🎏插入数据

插入若干条记录,用于后面的测试

insert into user values(null,"ketty","root");

查看表

select * from user;

5️⃣IDEA连接数据库

🎏选择MySQL

打开IDEA右侧的数据库连接,选择 + 号,选择MySQL.

🎏填写相关配置

填写相关配置,包括MySQL连接的用户名和密码,要连接的数据库,在URL的后面添加如下字段。

?serverTimezone=GMT&useSSL=false

连接成功后,可以看见我们数据库中的表。如果没有出现表,可以点击上面的刷新按钮刷新一下。

6️⃣生成Pojo、Dao类

🎏新建目录存放类

右键src/main/java目录,新建com.app.pojo、com.app.dao、com.app.service目录

🎏添加插件

找到插件,在搜索栏搜索better-mybatis-generator插件,点击添加。

🎏填写要生成类的相关信息

右键user类,选择mabatis-generate选项。

这里我们修改pojo类dao类dao.xml 三大类文件生成的位置(红框标注处),分别修改成我们刚刚新建的com.app.pojo包以及com.app.dao包。

❗注意如果你的mysql版本是8.0及以上,需要勾选下面mysql_8(红框标注处)。

❗查看mysql版本:打开cmd,输入mysql -V

mysql -V

修改完毕后,点击确定。第一次连接会要我们输入数据库连接的账号和密码。填写后在点击确定。

可以看见,我们的com.app.pojo和com.app.dao目录下多了四个文件。这四个文件是插件自动帮我们生成的,包括生成了一些常用的SQL单表操作,如根据条件查询,根据条件修改等。我们在service中就可以直接使用他们了。

7️⃣编写Service类

🎏编写接口

编写UserService接口,定义2个方法。

package com.app.service;

import com.app.pojo.User;

import java.util.List;

public interface UserService {
    List<User> getAllUser();

    long countByExample();
}

🎏编写实现类

创建Impl目录,编写UserServiceImpl实现类,实现2个方法。

package com.app.service.impl;

import com.app.dao.UserDao;
import com.app.pojo.User;
import com.app.pojo.UserExample;
import com.app.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    @Autowired // 自动注入
    private UserDao userDao;

    @Override
    public List<User> getAllUser() {
        return userDao.selectByExample(null);
    }

    @Override
    public long countByExample() {
        UserExample userExample = new UserExample();
        UserExample.Criteria criteria = userExample.createCriteria();
        criteria.andNameLike("%t%");
        return userDao.countByExample(userExample);
    }
}

🎏Criteria

⭕在我们使用插件创建的类中,有一个之前没有见过的类UserExample。这个类是给我们拼接条件用的。

在SQL语句中,我们可能会使用到条件进行增删改查。UserExample中有一个内部类Criteria,通过这个内部类中的方法,我们可以拼接我们像要的条件。

⭕如上面的第二个方法中,我们使用了userDao的countByExample()方法。这个方法的SQL语句原本是如下这样:

select count(*) from user;

当我们使用criteria的andNameLike("%t%")方法时,这个方法帮助我们在查询语句后面添加了一个根据name模糊查询的条件。Criteria还有其他很多方法可供选择,这样我们就可以自由的根据需求去拼接我们想要的SQL语句。

⭕当然,如果我们在使用XXXByExample()方法时传入了null值,SQL就没有任何条件,如第一个方法那样,查询表中所有的记录。

8️⃣编写Test类

🎏创建Test类

src/test/java目录下创建com.app.test目录,创建UserTest类。

🎏编写Test类

注解执行顺序:@Before -> @Test -> @After

即@Before在@Test标注的方法前执行;

@After在@Test标注的方法后执行。

package com.app.test;

import com.app.dao.UserDao;
import com.app.pojo.User;
import com.app.service.UserService;
import com.app.service.impl.UserServiceImpl;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class UserTest {
    private ApplicationContext applicationContext;

    @Before
    public void before() {
        applicationContext = new ClassPathXmlApplicationContext("app.xml");
    }

    @Test
    public void test() {
        UserDao userDao = applicationContext.getBean(UserDao.class);
        User user = userDao.selectByPrimaryKey(8);
        System.out.println(user);
    }

    @Test
    public void testGetAllUser() {
        UserService userService = applicationContext.getBean(UserServiceImpl.class);
        List<User> users = userService.getAllUser();
        for (User user : users) {
            System.out.println(user);
        }
    }

    @Test
    public void testCountByExample() {
        UserService userService = applicationContext.getBean(UserServiceImpl.class);
        long i = userService.countByExample();
        System.out.println(i);
    }
}

🎏测试

⭕test()方法

⭕testGetAllUser()方法

⭕testCountByExample()方法

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

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

相关文章

企业宣传新闻稿撰写方法和技巧分享,纯干货

企业宣传新闻稿重点在于“宣传”&#xff0c;目的性强&#xff0c;具有极强的商业价值&#xff0c;怎么撰写是一大难关。 企业新闻稿堪比公关小组&#xff0c;表面上看起来只是简简单单一篇新闻稿&#xff0c;但是实际上企业新闻稿也能起到大作用&#xff0c;企业新闻稿的价值…

Python Kafka客户端性能测试比较

前言 由于工作原因使用到了 Kafka&#xff0c;而现有的代码并不能满足性能需求&#xff0c;所以需要开发高效读写 Kafka 的工具&#xff0c;本文是一个 Python Kafka Client 的性能测试记录&#xff0c;通过本次测试&#xff0c;可以知道选用什么第三方库的性能最高&#xff0c…

umi4+antd5兼容360安全浏览器

项目场景&#xff1a; umi4创建的大屏项目&#xff0c;部分模块使用了antd5进行开发 问题描述 开发完成后&#xff0c;得知客户是360安全浏览器&#xff0c;内核为86&#xff0c;测试过程中出现了样式混乱。 混乱样式有下拉内容的组件&#xff08;如select、dataPicker&#…

Microsoft 365中的智能应用—翻译、朗读、听写

Microsoft 365 是一种订阅式的跨平台办公软件&#xff0c;基于云平台提供多种服务&#xff0c;通过将Word、Excel、PowerPoint和Outlook、OneNote等应用与OneDrive 和 Microsoft Teams等强大的云服务相结合&#xff0c;让任何人使用任何设备随时随地创建和共享内容。 Microsof…

【JavaScript】仿青柠搜索界面

点击搜索栏&#xff0c;背景模糊&#xff0c;出现图标。点击界面任意处&#xff0c;失去焦点&#xff0c;恢复原样 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X…

Elasticsearch高级查询—— 查询所有文档

目录一、初始化文档数据二、查询所有文档示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","age":22,"sex…

Qt的开源库TabToolbar

开源地址&#xff1a;https://github.com/SeriousAlexej/TabToolbar 该库的使用方式有两种&#xff1a; 使用json配置文件配置TabToolBar使用代码构建TabToolBar 编译 项目是使用Qt和CMake管理的&#xff0c;并且在开发的时候使用的是Qt6&#xff0c;我实测通过更改CMake的…

设计模式——代理模式

文章目录引入案例提出问题解决思路遇到的困难代理模式概念生活中的代理相关术语静态代理动态代理织入的概念基于JDK的动态代理基于Cglib的动态代理JDK 和 CGLIB 的区别引入案例 计数器的接口 public interface Calculator {int add(int i, int j);int sub(int i, int j);int …

pandas案例——预处理部分地区数据

数据清洗的任务是过滤那些不符合要求的数据&#xff0c;将过滤的结果交给业务主管部门&#xff0c;确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。数据清洗是与问卷审核不同&#xff0c;录入后的数据…

使用反射和泛型简化Golang查询数据库代码的方案

大纲Postgresql数组案例常规写法定义结构体查询数据问题反射泛型写法结构体定义接口Tag实现逻辑泛型设计实例化模型结构体获取表名过滤字段组装SQL语句查询遍历读取结果实例化模型结构体组装Scan方法的参数调用Scan方法并保存结果完整代码小结Postgresql数组 Postgresql有个很…

7、操作DOM对象(重点)

核心&#xff1a;浏览器网页就是一个DOM树形结构 更新&#xff1a;更新该DOM节点的内容&#xff0c;相当于更新了该DOM节点表示的HTML的内容&#xff1b; 遍历&#xff1a;遍历该DOM节点下的子节点&#xff0c;以便进行进一步操作&#xff1b; 添加&#xff1a;在该DOM节点下…

Matlab中的dsp.AudioFileReader函数的认识和学习

在Matlab中的dsp.AudioFileReader函数的认识和学习1.描述2.语法2.1 语法描述2.2 属性Properties2.3 举例Stream from audio file 来自音频文件的流 1.描述 dsp.AudioFileReader系统对象™ 从音频文件读取音频样本。 要从音频文件读取音频样本&#xff0c;请执行以下操作&…

小方制药冲刺A股上市:毛利率走低,方之光、鲁爱萍夫妇为实控人

近日&#xff0c;上海小方制药股份有限公司&#xff08;下称“小方制药”&#xff09;公开预披露更新招股书&#xff0c;准备在上海证券交易所主板上市。据贝多财经了解&#xff0c;小方制药于2022年7月1日递交招股书&#xff0c;国信证券为其保荐机构。 本次冲刺上市&#xff…

扫码器:壹码通(EMT 6621)二维码带多个回车换行处理

摘要&#xff1a;二维码运用越来越广泛了&#xff0c;目前在医院中一个二维码可以串联多个系统&#xff0c;二维码的内容也可以设置一些特殊字符去达成系统便捷性。本次遇到为二维码中开头内置了回车和空格&#xff0c;在程序判断为回车(KEY_ENTER)时就会触发业务逻辑&#xff…

mybatis之一级缓存和二级缓存

缓存&#xff1a; 查询需要连接数据库&#xff0c;非常的耗费资源&#xff0c;将一次查询的结果&#xff0c;暂存在一个可以直接取到的地方&#xff0c;我们将其称之为缓存&#xff0c;当我们需要再次查询相同的数据时&#xff0c;直接走缓存这个过程&#xff0c;就不用走数据…

【RabbitMQ三】——RabbitMQ工作队列模式(Work Queues)

RabbitMQ工作队列模式为什么要有工作队列模式如何使用工作队列模式轮询消息确认验证消息确认消息持久化公平调度验证公平调度**现在将消费者1中的Thread.sleep(1000)改为Thread.sleep(3000);不添加公平调度相关代码进行测试。**现在将消费者1中的Thread.sleep(1000)改为Thread.…

BC即将登录Coinbase Institutional,2023年以全新姿态出发

以支付为最初定位的加密资产&#xff0c;在支付领域的发展始终停滞不前&#xff0c;尤其是在2022年&#xff0c;加密行业经历了几次“至暗时刻”&#xff0c;导致加密市场资金不断出逃市场全面转熊&#xff0c;越来越多的人对加密资产市场的发展前景失去信心。 而在2021年年底开…

【GD32F427开发板试用】移植CoreMark验证0等待区Flash大小

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Doravmon 引言 非常荣幸能够参与到此次GD32F427开发板试用的活动中来&#xff0c;在拿到开发板之前就翻了翻手册&#xff0c;一直有个疑问困惑…

APM/STM32F072RB基于HAL库配置USB CDC虚拟串口功能

APM/STM32F072RB基于HAL库配置USB CDC虚拟串口功能&#x1f4e2;采用的自制开发板&#xff0c;开源PCB工程详情放在《极海APM32F072RB开发环境测试》✨本案例基于STM32CubeMX工具配置。&#x1f4fa;使用STM32CubeMX工具配置工程改为APMF072RB型号过程如下&#xff1a; ⛳注意…

性能测试实战 | 电商业务的性能测试(一): 必备基础知识

本文为霍格沃兹测试学院优秀学员课程学习系列笔记&#xff0c;想一起系统进阶的同学文末加群交流。 1.1 测试步骤总览 需求分析与测试设计&#xff08;性能需求目标业务模型拆解&#xff09; 测试数据准备和构造(基于模型的数据准备) 性能指标预期(性能需求目标) 发压工具配…