Spring基于注解的CRUD

源码

代码实现

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_03account_annoioc</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>
<mysql.version>8.0.33</mysql.version>
<dbutils.version>1.7</dbutils.version>
<c3p0.version>0.9.1.2</c3p0.version>
<lombok.version>1.18.30</lombok.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>

Dao层实现

package com.zjw.dao.impl;

import com.zjw.dao.IAccountDao;
import com.zjw.domain.Account;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Repository; import java.sql.SQLException;
import java.util.List; /**
* 账户的持久层实现类
* @author zjw
*/
@Repository("accountDao")
public class AccountDaoImpl implements IAccountDao { public QueryRunner runner; /**
* 使用Lookup注解,告诉Spring这个方法需要使用查找方法注入
* 这里直接使用@Lookup,则Spring将会依据方法返回值
* 将它覆盖为一个在Spring容器中获取QueryRunner这个类型的bean的方法
* 但是也可以指定需要获取的bean的名字,如:@Lookup("runner")
* 此时,名字为runner的bean,类型必须与方法的返回值类型一致
*/
@Lookup
public QueryRunner getRunner(){
return runner;
} @Override
public List<Account> findAllAccount() {
try {
return getRunner().query("SELECT * FROM account",new BeanListHandler<>(Account.class));
} catch (SQLException e) {
throw new RuntimeException(e);
}
} @Override
public Account findAccountById(Integer accountId) {
try {
return getRunner().query("SELECT * FROM account WHERE id=?",new BeanHandler<>(Account.class),accountId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
} @Override
public void saveAccount(Account account) {
try {
getRunner().update("INSERT INTO account(name,money) VALUES(?,?)",account.getName(),account.getMoney());
} catch (SQLException e) {
throw new RuntimeException(e);
}
} @Override
public void updateAccount(Account account) {
try {
getRunner().update("UPDATE account SET name=?,money=? WHERE id=?",account.getName(),account.getMoney(),account.getId());
} catch (SQLException e) {
throw new RuntimeException(e);
}
} @Override
public void deleteAccount(Integer accountId) {
try {
getRunner().update("DELETE FROM account WHERE id=?",accountId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

Service层实现

Java8后Resource不在javax中维护,改为了jakarta

package com.zjw.service.impl;

import com.zjw.dao.IAccountDao;
import com.zjw.domain.Account;
import com.zjw.service.IAccountService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import java.util.List; /**
* 账户的业务层实现类
* @author zjw
*/
@Service("accountService")
public class AccountServiceImpl implements IAccountService { @Resource
private IAccountDao accountDao; @Override
public List<Account> findAllAccount() {
return accountDao.findAllAccount();
} @Override
public Account findAccountById(Integer accountId) {
return accountDao.findAccountById(accountId);
} @Override
public void saveAccount(Account account) {
accountDao.saveAccount(account);
} @Override
public void updateAccount(Account account) {
accountDao.updateAccount(account);
} @Override
public void deleteAccount(Integer accountId) {
accountDao.deleteAccount(accountId);
}
}

测试

方式一:使用Junit方式测试

package com.zjw.test;

import com.zjw.domain.Account;
import com.zjw.service.IAccountService;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; /**
* 使用Junit单元测试,测试我们的配置
*/
public class AccountServiceTest { private ApplicationContext ac ; @Before
public void init(){
ac = new ClassPathXmlApplicationContext("bean.xml");
} /**
* 查询所有账户
*/
@Test
public void testFindAll(){
IAccountService accountService = ac.getBean("accountService", IAccountService.class);
List<Account> accountList = accountService.findAllAccount();
for (Account account : accountList) {
System.out.println(account);
}
} /**
* 根据账户id查询账户
*/
@Test
public void testFindAccountById(){
IAccountService accountService = ac.getBean("accountService", IAccountService.class);
Account account = accountService.findAccountById(1);
System.out.println(account);
} /**
* 新建账户
*/
@Test
public void testSaveAccount(){
IAccountService accountService = ac.getBean("accountService", IAccountService.class);
Account account = new Account();
account.setId(4);
account.setName("zzz");
account.setMoney(9999f);
accountService.saveAccount(account);
} /**
* 更新账户信息
*/
@Test
public void testUpdateAccount(){
IAccountService accountService = ac.getBean("accountService", IAccountService.class);
Account account = accountService.findAccountById(4);
System.out.println(account);
account.setMoney(888F);
accountService.updateAccount(account);
} /**
* 删除账户
*/
@Test
public void testDeleteAccount(){
IAccountService accountService = ac.getBean("accountService", IAccountService.class);
accountService.deleteAccount(4);
}
}

方式二:使用@RunWith(SpringJUnit4ClassRunner.class)注解测试

package com.zjw.test;

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; /**
* 使用@RunWith测试,测试我们的配置
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:/*.xml"})
public class AccountServiceTest2 { @Resource
private IAccountService accountService; /**
* 查询所有账户
*/
@Test
public void testFindAll(){
List<Account> accountList = accountService.findAllAccount();
for (Account account : accountList) {
System.out.println(account);
}
} /**
* 根据账户id查询账户
*/
@Test
public void testFindAccountById(){
Account account = accountService.findAccountById(1);
System.out.println(account);
} /**
* 新建账户
*/
@Test
public void testSaveAccount(){
Account account = new Account();
account.setId(4);
account.setName("zzz");
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的更多相关文章

  1. Spring基于注解的Cache支持

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

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

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

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

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

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

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

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

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

  6. 从源码分析 Spring 基于注解的事务

    在spring引入基于注解的事务(@Transactional)之前,我们一般都是如下这样进行拦截事务的配置: <!-- 拦截器方式配置事务 --> <tx:advice id=&q ...

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

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

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

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

  9. Spring基于注解开发异常

    基于注解开发: 一开始:用的jar包: 百度查到: 导入aop包: 没用 有的说: Spring版本和jdk版本不匹配 于是我换成了4.0版本 导入的jar包: 还是报错. 解决办法:添加spring ...

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

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

随机推荐

  1. Mac安装Flume

    一.下载Flume(在SoftWare目录下) wget http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.8.0/apache-flume-1.8 ...

  2. C#/.NET/.NET Core技术前沿周刊 | 第 25 期(2025年2.1-2.9)

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

  3. .Net 配置绑定 IOptions

    准备   首先准备下appsettins.json以及目标类   appsettins.json "StudentSettings": { "Id": 1023 ...

  4. 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

    title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过 ...

  5. CF1837E Play Fixing 题解

    首先来考虑什么情况方案数为 \(0\): 可以确定,在某一层中,两个原本都能晋级的队伍比赛: 可以确定,在某一层中,两个原本都不能晋级的队伍比赛. 发现假如写出每一场比赛及其胜者,可以形成一棵树形结构 ...

  6. autMan奥特曼机器人-自建autMan插件市场

    一.自建市场配置 配置参数 二.上架设置 设置哪些插件上架,哪些不上架 三.检测是否成功 怎样检查是否成功了?订阅一下自己,然后看应用市场上是否显示 四.用户怎样购买插件 用户想买自建市场作者的插件, ...

  7. 从零开始!Jupyter Notebook 安装教程

    一.引言 Jupyter Notebook 是一款非常实用的交互式编程环境,广泛应用于数据分析.机器学习.教学等领域.在安装 Jupyter Notebook 之前,需要确保计算机已安装 Python ...

  8. 应急响应靶场之vulntarget-n

    vulntarget-n 用户名密码:root/Vulntarget@123 一.分析history命令 1.先将历史命令导出 history > 1.txt 2.分析history 1)篡改网 ...

  9. ubuntu20.04使用EasyConnect

    起因:BUAA校外访问内网vpn的客户端 用的学校vpn内下载的deb包EasyConnect_x64_7_6_7_3.deb,就直接sudo apt install安装了,之后应用的目录在/usr/ ...

  10. 昨晚接收的俄罗斯Meteor-M2气象卫星云图,接收质量还可以!

    接收设备: 天馈:自制四臂螺旋天线 硬件:SDRsharp 跟踪:Orbitron.SDRSharpDriverDDE 频率:137.1MHZ 解码:SDRSharp.QPSK.M2_LRPT_Dec ...