spring整合mybatis,junit纯注解开发(包括连接druid报错的所有解决方法)

news2024/9/23 10:27:50

目录

Spring整合mybatis开发步骤

第一步:创建我们的数据表

第二步:编写对应的实体类

 第三步:在pom.xml中导入我们所需要的坐标

spring所依赖的坐标

mybatis所依赖的坐标

druid数据源坐标

 数据库驱动依赖

 第四步:编写SpringConfig配置类

 第五步:编写数据源配置类(目的:返回一个数据源bean对象)

第六步:编写MybatisConfig配置类

第七步:编写dao层的接口文件

第八步:编写测试类

这里也许就会有人疑惑:明明没有把StudentMapper类交给spring管理,为什么可以直接ctx.getBean(StudentMapper.class);获取bean对象?

 错误分析

第一个错误

解决方法:

1. jdbc.propetties配置文件中所有属性名加上前缀,如

2.注意看你写的配置文件里有没有多余的空格

3.数据库驱动和数据库版本不一致

4.数据库驱动

还有第二个错误

解决方法:

 Spring整合junit


项目大致结构:

Spring整合mybatis开发步骤

第一步:创建我们的数据表

第二步:编写对应的实体类

public class Student {
  private Integer id;
  private String name;
  private Integer age;

  public Student() {
  }

  public Student(Integer id, String name, Integer age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "Student{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            '}';
  }
}

 第三步:在pom.xml中导入我们所需要的坐标

spring所依赖的坐标

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
<!--        spring数据层依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

mybatis所依赖的坐标

<!--导入mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>
<!--        整合mybatis和spring数据库-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

druid数据源坐标

<!--        导入druid数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

 数据库驱动依赖

<!--        导入连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

 第四步:编写SpringConfig配置类

@Configuration
@ComponentScan("com.hhh")
@PropertySource("classpath:jdbc.properties")
@Import({MybatisConfig.class,JdbcConfig.class})
public class SpringConfig {
}
  • @Configuration说明这是一个配置类
  • @ComponentScan("com.hhh")说明spring要扫描(管理)的范围
  • @@PropertySource("classpath:jdbc.properties")全局引入外部文件
  • @Import({MybatisConfig.class,JdbcConfig.class})导入外部配置类

 第五步:编写数据源配置类(目的:返回一个数据源bean对象)

public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String name;
    @Value("${jdbc.password}")
    private String password;
    //让返回的druid数据源对象成为bean
    @Bean
    public DataSource getDataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUsername(name);
        druidDataSource.setUrl(url);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}

我在这个配置类中写了一个getDataSource()方法,并加上@Bean注解目的是让这个方法的返回值成为一个Bean对象

  • druidDataSource.setDriverClassName(driver);
  • druidDataSource.setUsername(name);
  • druidDataSource.setUrl(url);
  • druidDataSource.setPassword(password);

这四行分别配置了连接数据库的四大参数,这四大参数通过@Value的方式进行注入

第六步:编写MybatisConfig配置类

public class MybatisConfig {
    //使用了mybatis整合bean的工厂类,不然会报错
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        //直接在参数上写需要的数据源类型,spring会根据bean的类型自动依赖注入
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //设置别名,让com.hhh.pojo这个包下的类只需要写类名即可
        sqlSessionFactoryBean.setTypeAliasesPackage("com.hhh.pojo");
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

    /**
     * 创建 MapperScannerConfigurer Mapper类对象,用来加载dao层接口
     * @return
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        //扫描mapper
        mapperScannerConfigurer.setBasePackage("com.hhh.dao");
        return mapperScannerConfigurer;
    }
}

这个配置类有两个目的:

1.返回一个SqlSessionFactory工厂类Bean对象

2.扫描dao层的接口文件

所以我写了两个方法

第一个方法:返回值类型要写成SqlSessionFactoryBean,这是mybatis整合bean的工厂类

不能只写SqlSessionFactory

在这个方法里配置了所有实体类的别名和配置了所需要的数据源

第二个方法:扫描了dao层的所有mapper接口文件,并返回MapperScannerConfigurer类型的bean对象

第七步:编写dao层的接口文件

public interface StudentMapper {
    //根据id查询
     @Select("select id,name,age from student where id =#{id};")
     Student findById(@Param("id")Integer id);
}

第八步:编写测试类

public class App {
    public static void main(String[] args) {
        //加载配置类
        ApplicationContext ctx= new AnnotationConfigApplicationContext(SpringConfig.class);
        StudentMapper studentMapper = ctx.getBean(StudentMapper.class);
      
        Student student = studentMapper.findById(1);
        System.out.println(student);

    }
}

 结果:

这里也许就会有人疑惑:明明没有把StudentMapper类交给spring管理,为什么可以直接ctx.getBean(StudentMapper.class);获取bean对象?

我们先来打印一个这个studentMapper对象看看

MapperProxy接口代理对象,可见spring帮我们创建了一个 MapperProxy类型的bean,这是哪里创建的?

这就是MybatisConfig配置类中mapperScannerConfigurer()方法通过扫描dao层的所有接口文件时创建的。

 错误分析

第一个错误

com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
7月 20, 2024 12:05:46 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl error
严重: create connection SQLException, url: jdbc:mysql://localhost:3306/mysql_day2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false, errorCode 1045, state 28000
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 

无限循环报以上的错误

解决方法:

1. jdbc.propetties配置文件中所有属性名加上前缀,如

2.注意看你写的配置文件里有没有多余的空格

3.数据库驱动和数据库版本不一致

select VERSION();查询数据库版本

<!--        导入连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

 这里我因为之前下载的数据库为8.30,没有这个高版本的数据库驱动,所以我还重新安装了数据库,哭

4.数据库驱动

mysql5 使用的驱动为 com.mysql.jdbc.Driver

mysql8 使用的驱动为 com.mysql.cj.jdbc.Driver

我在使用了上述四种方法后还是报错,

继续试了不使用外部文件,直接注入,依旧不行,把密码改成root,也不行,当时真的快崩溃了

,但是我没有放弃,继续查看报错

errorCode 1045, state 28000 

我通过查询大量文章的得知1045时用户名和密码错误,但是我的配置文件里的用户名和密码都是正确的,所以我注意到了上面红字的部分,我看到别人的报错在@前面都会有他们自己的数据库用户名,但是我的没有显示用户名,我就在想是不是数据源的用户名没有传进去。我查看

通过对比发现setName()并不是配置用户名的,我马上修改成 

最后运行正确,历时一个下午,一个晚上(甚至做梦梦到),最后在早晨醒来时豁然开朗,发现错误。

还有第二个错误

 create connection SQLException, url: jdbc:mysql://localhost:3306/mysql_day2, errorCode 0, state 01S00
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

解决方法:

在url后面加上 ?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false

完整的jdbc.properties配置文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysql_day2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=123456

 Spring整合junit

导入所需要的依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

测试

//添加spring整合junit专用的类加载器
@RunWith(SpringJUnit4ClassRunner.class)
//加载spring配置类
@ContextConfiguration(classes= SpringConfig.class)
public class Test {
    @Autowired
    private StudentMapper studentMapper;//这里会一直报错No beans of 'StudentMapper' type found.
    //但是我们通过MybatisConfig配置类扫描了dao层的所有接口,会创建出一个代理类bean,所以不用管
    @org.junit.Test
    public void testFindById(){
        Student student = studentMapper.findById(1);
        System.out.println(student);
    }


}

 结果:

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

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

相关文章

软件测试点

案例&#xff1a; 需求&#xff1a; 动物品系&#xff1a;动物类型-动物品系体重&#xff1a;[1,无穷)年龄&#xff1a; 等价类&#xff1a;6个 界面测试&#xff1a; 默认值、颜色、布局动物品系下拉框&#xff0c;数据来源&#xff0c;排序规则 功能测试&#xff1a; …

【MySQL06】【MVCC】

文章目录 一、前言二、事务1. 事务的四大特性&#xff08;ACID&#xff09;1.1. 原子性1.2. 一致性1.3. 持久性1.4. 隔离性 2. 脏写、脏读、不可重复读、幻读3. 隔离级别 三、MVCC1. 版本链2. ReadView3. 二级索引与 MVCC 四、关于 purge五、参考内容 一、前言 最近在读《MySQ…

网安小贴士(20)网络物理隔离技术

前言 网络物理隔离技术是一种网络安全技术&#xff0c;其核心原理是通过物理方式将网络或网络设备分隔开来&#xff0c;以确保数据安全、降低风险并提升系统的整体安全性。以下是对网络物理隔离技术原理与应用的详细解析&#xff1a; 一、网络物理隔离技术原理 物理断开&#x…

gradle学习及问题

一、下载安装 参考&#xff1a;https://blog.csdn.net/chentian114/article/details/123344839 1、下载Gradle并解压 安装包&#xff1a;gradle-6.7-bin.zip 可以在idea的安装目录查看自己适配的版本 路径&#xff1a;D:\IDEA2021.3\plugins\gradle\lib 下载地址&#xff1a…

java之log4j反序列化

1 审计思路 以Log4j漏洞审计为案例,谈一谈审计如何快速的锁定通用型漏洞 1.1 确定源码是否引用了漏洞所属的开源组件 该项目是一个maven项目,直接在Pom文件中搜索log4j的jar包及版本引用问题,如果该版本受影 响,进入下一步 1.2 寻找漏洞的入口 1.3 逐个排查入口是否有效…

手持式气象站:便携科技,掌握微观气象的利器

手持式气象站&#xff0c;顾名思义&#xff0c;是一种可以随身携带的气象监测设备。它小巧轻便&#xff0c;通常配备有温度、湿度、风速、风向、气压等多种传感器&#xff0c;能够实时测量并显示各种气象参数。不仅如此&#xff0c;它还具有数据存储、数据传输、远程控制等多种…

【python学习】思考-如何在PyCharm中编写一个简单的Flask应用示例以及如何用cProfile来对Python代码进行性能分析

引言 Python中有两个流行的Web框架&#xff1a;Django和Flask。Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计&#xff1b;Flask是一个轻量级的Web应用框架&#xff0c;适用于小型到大型应用。以下是使用Flask创建一个简单应用的基本步骤cPro…

Spring Framework各种jar包官网下载2024年最新下载官方渠道。

Spring其实就是一个大家族&#xff0c;它包含了Spring Framework&#xff0c;Spring Boot等一系列技术&#xff0c;它其实就是由许许多多的jar包构成&#xff0c;我们要使用Spring的框架&#xff0c;就要去下载支持这个框架的jar包即可。 1.官网下载Spring Framework的jar包 官…

C++系列-List的使用

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 测试代码 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<list> using namespace std; void test_list1() {list<int> lt1 { 10,2,3,3,4,3…

Dockerfile制作部署wordpress-6.6

目录 一. 环境准备 二. 准备对应的配置文件 三. 编写Dockerfile 四. 构建镜像 五. 配置MySQL 六. 安装wordpress 七. 扩展 一. 环境准备 localhost192.168.226.25 rocky_linux9.4 Docker version 27.0.3 关闭防火墙和selinux&#xff0c;进行时间同步。 安装docker…

配置RIPv2的认证

目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击&#xff0c;为R3配置RIPv2 四、在R…

微软史诗级的蓝屏

本周经历了微软的蓝屏&#xff0c;一直到周末还在加班处理公司的问题。 个人终端受到的影响较大&#xff0c;服务器上也受到了影响。因为蓝屏的事情导致不少麻烦&#xff0c;据同事说因为蓝屏的问题&#xff0c;MGH 的手术安排也受到了影响。 目前我们也在着手处理有部署 Wind…

《书生大模型实战营第3期》入门岛 学习笔记与作业:Git 基础知识

文章大纲 Git 是什么&#xff1f;-- 分布式版本控制系统版本控制系统简介Git 基本概念1. 安装 Git1.1 Windows 系统1.2 Linux 系统 2. Git 托管平台3. 常用 Git 操作4. tips4.1 全局设置 vs. 本地设置4.2 如何配置4.3 验证设置4.4 Git 四步曲 5. 常用插件6. 常规开发流程 作业其…

leetcode hot100 (面试复习用)

数组 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 示例&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4]输出&#xff1a;6解释&#xff1…

《算法笔记》总结No.9——高效配招

一.打表 一种经典的空间换时间方式&#xff1a;即将所有可能用到的结果实现计算出来&#xff0c;这样后面用到的时候直接可以查表获得。具体来说有3种方式&#xff1a; 1.计算所有结果 这个是最常用到的用法&#xff0c;例如在一个需要查询大量Fibonacci数F(n)的问题中&#x…

分布式Apollo配置中心搭建实战

文章目录 环境要求第一步、软件下载第二步、创建数据库参考文档 最近新项目启动&#xff0c;采用Apollo作为分布式的配置中心&#xff0c;在本地搭建huanj 实现原理图如下所示。 环境要求 Java版本要求&#xff1a;JDK1.8 MySql版本要求&#xff1a;5.6.5 Apollo版本要求&…

kettle从入门到精通 第七十九课 ETL之kettle kettle读取数据库BLOB字段转换为文件

上一课我们讲解了如何将文件以二进制流的方式写入数据库&#xff0c;本节课我们一起学习下如何将二进制数据读取为文件。 1、将二进制流转换为文件这里主要用到了步骤【文本文件输出】。表输入步骤从表中读取blob字段&#xff0c;java代码定义二进制流转换为文件的全路径&#…

微星主板 B450M 设置 Legacy 启动模式

问题来源 我安装阵列卡需要Legacy启动模式 主板设置 微星主板BIOS不熟悉&#xff0c;找了好久。 在 BIOS -> Setting -> Advanced -> Windows OS Configuaration 中把 BIOS CSM/UEFI Mode 设置成 CSM 模式 在 Setting -> Boot 中把 Boot mode select 改成带 “L…

在 CI/CD Pipeline 中实施持续测试的最佳实践!

随着软件开发周期的不断加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;已经成为现代软件开发的重要组成部分。在这一过程中&#xff0c;持续测试的实施对于确保代码质量、提高发布效率至关重要。本文将详细介绍在CI/CD流水线中…

mac数据恢复软件哪个好用 macbook数据恢复专业软件下载 mac数据恢复概率大吗 苹果电脑数据恢复软件哪个好

作为办公的必需品&#xff0c;mac的普及率虽然比不上其他品牌的windows操作系统&#xff0c;但是使用人群也一致居高不下&#xff0c;因此&#xff0c;mac数据丢失的问题也时常发生。当数据丢失以后&#xff0c;如何找回数据成了一大难题。 一、Mac数据恢复概率大吗 一般情况下…