Spring基于注解的CRUD,完全没有XML

源码

代码实现

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>com.zjw</groupId>
<artifactId>day02_eesy_04account_annoioc_withoutxml</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<encoding>UTF-8</encoding>
<spring.version>6.1.1</spring.version>
<jakarta.version>2.1.0</jakarta.version>
<lombok.version>1.18.30</lombok.version>
<mysql.version>8.0.33</mysql.version>
<dbutils.version>1.7</dbutils.version>
<c3p0.version>0.9.1.2</c3p0.version>
<junit.version>4.13.2</junit.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>${jakarta.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>${dbutils.version}</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies> </project>

数据库配置文件

jdbcConfig.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/eesy_spring?useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456

数据库配置类

package com.zjw.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope; import javax.sql.DataSource; /**
* @author zjw
*/
public class JdbcConfig { @Value("${jdbc.driver}")
private String driver; @Value("${jdbc.url}")
private String url; @Value("${jdbc.username}")
private String username; @Value("${jdbc.password}")
private String password; /**
* 用于创建一个QueryRunner对象
* @param dataSource 数据源对象
* @return QueryRunner对象
*/
@Bean(name = "runner")
@Scope(value = "prototype")
public QueryRunner createQueryRunner(@Qualifier("dataSource") DataSource dataSource){
return new QueryRunner(dataSource);
} /**
* 创建数据源对象
*/
@Bean("dataSource")
public DataSource createDataSource(){
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
} catch (Exception e) {
throw new RuntimeException(e);
}
} }

Spring配置类

package com.zjw.config;

import org.springframework.context.annotation.*;

/**
* 该类是一个配置类,他的作用和bean.xml是一样的
* spring中的新注解
* @author zjw
* @Configuration
* 作用:指定当前类是一个配置类
* 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写
* @ComponentScan
* 作用:用于通过注解指定spring在创建容器时要扫描的包
* 属性:
* value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
* 我们使用此注解就等同于在xml中配置了:
* <context:component-scan base-package="com.zjw"></context:component-scan>
* @Bean
* 作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
* 属性:
* name:用于指定bean的id。当不写时,默认是当前方法的名称
* 细节:
* 当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
* 查找的方式和Autowired注解的作用是一样的
* @Import
* 作用:用于导入其他配置类的字节码
* 属性:
* value:用于指定其他配置类的字节码
* 当我们使用Import的注解之后,有Import注解的类就是父配置类,而导入的都是子配置类
* @PropertySource
* 作用:用于加载 .properties 文件中的配置 。例如我们配置数据源时,可以把连接数据库的信息写到
* properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
*
* 属性:
* value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:
*
*/
//@Configuration
@ComponentScan({"com.zjw"})
@Import({JdbcConfig.class})
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration { }

测试

package com.zjw.test;

import com.zjw.config.SpringConfiguration;
import com.zjw.domain.Account;
import com.zjw.service.IAccountService;
import jakarta.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; /**
* 使用Junit单元测试,测试我们的配置
* Spring整合junit的配置 不用自己实例化容器
* 1、导入spring整合junit的jar(坐标) spring-test
* 2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
* @RunWith
* 3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并说明位置
* @ContextConfiguration
* locations:指定xml文件的位置,加上classpath关键字,表示类路径下
* classes:指定注解类所在的位置
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest2 { @Resource
private IAccountService accountService; @Test
public void testFindAll(){
List<Account> accountList = accountService.findAllAccount();
accountService.findAccountById(1);
for (Account account : accountList) {
System.out.println(account);
}
} @Test
public void testFindAccountById(){
Account account = accountService.findAccountById(1);
System.out.println(account);
} @Test
public void testSaveAccount(){
Account account = new Account();
account.setName("zaa");
account.setMoney(9999f);
accountService.saveAccount(account);
} @Test
public void testUpdateAccount(){
Account account = accountService.findAccountById(4);
System.out.println(account);
account.setMoney(888F);
accountService.updateAccount(account);
} @Test
public void testDeleteAccount(){ accountService.deleteAccount(4); }
}

Spring基于注解的CRUD,完全没有XML的更多相关文章

  1. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

  2. 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

    复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置 ...

  3. Spring基于注解的Cache支持

    Spring为我们提供了几个注解来支持Spring Cache.其核心主要是@Cacheable和@CacheEvict.使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回 ...

  4. Spring基于注解和XML混合方式的使用

    首先要明白,基于注解和XML两种方式的实现功能是一样的,只是两种不同的配置方式. 一.IoC配置 1.配置xml 在使用注解与xml结合的方式配置IoC之前,首先要引入context标签: xmlns ...

  5. spring基于注解的IoC以及IoC的案例

    1.Spring中IoC的常用注解 1.1明确: (1)基于注解的配置和xml的配置要实现的功能都是一样的,都是要降低程序之间的耦合,只是配置的形式不一样 2.案例:使用xml方式和注解方式实现单表的 ...

  6. Spring - 基于注解的组件扫描

    关于Spring的书籍都会花很大篇幅来讲解Spring如何注入各种bean的问题,非常令人头疼,自己在工作中还从来没有用到过. 所以就要跳过那些篇章,直接学习基于注解的组件扫描. 发现spring2是 ...

  7. (spring-第4回【IoC基础篇】)spring基于注解的配置

    基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样 ...

  8. spring基于注解进行注入(个人记录)

    spring的Bean基于注解进行配置,再结合自动装配属性,也就DI,其实说白了就相当于初始化的时候给对象赋初值. 配置文件的过程有些麻烦,记录一下. 基于注解进行配置: 1.在application ...

  9. SSM-Spring-07:Spring基于注解的di注入

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...

  10. spring 基于注解的@Scheduled和quartz定时器两种实现

    一.使用quartz 1.由于我的项目jar包使用的maven托管的,在pom文件中加入quartz的依赖就可以 2.配置quartz-context.xml,确保xml文件能被加载到 <?xm ...

随机推荐

  1. 使用C#对Godot属性进行改写(其实是覆盖)

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/14568221.html 背景 我还真没想到C#这个鬼东西还能这么用-- 起初是想通过某种办法改写一下La ...

  2. flutter-延时执行

    //1秒后这个i行 Future.delayed(Duration(milliseconds: 1000), () { //代码省略 });

  3. C#/.NET/.NET Core技术前沿周刊 | 第 26 期(2025年2.10-2.16)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  4. MacOS环境配置Homebrew

    Homebrew笔记 1. 介绍 官网:https://brew.sh/ 对于习惯了使用命令来完成一切的程序员来说,安装软件这种小事,自然是能够用命令解决,就不用图形界面选择.但是在 Linux 中, ...

  5. KUKA库卡机器人保养维修

    KUKA机器人由机械手和控制柜组成,每日机器人保养包括:控制箱.教导盒.手腕之表面擦拭,还有噴槍之清洁. KUKA机器人控制柜保养1)断掉控制柜的所有供电电源.2)检查主机板.存储板.计算板.以及驱动 ...

  6. 【.NET】调用本地 Deepseek 模型

    本篇咱们来聊一聊怎么在 .NET 代码中使用本地部署的 Deepseek 语言模型.大伙伴们不必要紧张,很简单的,你不需要学习新知识,只要你知道 .NET 如何访问 HTTP 和 JSON 的序列化相 ...

  7. git ssh秘钥生成及配置

    ssh-keygen -t rsa -C "email@gmail.com" 回车后提示输入密码, 此处密码可以不填, 直接回车,提示再次输入密码, 直接回车,生成成功 前往 /U ...

  8. 【编程思维】临近实施 WPF 下拉框闪烁问题!!

    私以为架构是业务开发的发展历史,顺应大方向而生,再为贴切时刻的用户需求,持续微改动. 我本以为了解这个软件的架构没甚意思,加快的开发速度不能过渡到下一个别的软件去: 却不知以小窥大,关键还是计算机思维 ...

  9. ADO.NET中SQL绑定变量方式总结

    最近在项目上遇到几个问题,关于ADO.NET中SQL绑定变量 总结一下,分享给大家. 1. 使用 SqlParameter(推荐方式,防止 SQL 注入) ADO.NET 提供 SqlParamete ...

  10. Golang Linux、Windows、Mac 下交叉编译

    前言 Golang 支持交叉编译, 即同一份代码,在一个平台上生成,然后可以在另外一个平台去执行. 之前写过一篇 Golang windows下 交叉编译 感觉写的不够全面,这篇作为补充. 交叉编译 ...