SpringBoot中自定义的普通类,工具类和main调用Controller或Service向数据库插入数据

SpringBoot中自定义的普通类,工具类和main无法直接调用Controller或Service向数据库插入数据。需要先新建一个工具类,然后调用工具类来间接调用Service向数据库存数据。

原因:
Spring中的Service不是想new就能new的,因为通过new实例化的对象脱离了Spring容器的管理,获取不到注解的属性值,所以会是null,就算调用service的类中有@Component注解加入了Spring容器管理,也还是null.

下面给出一个我实际碰到的问题及解决方法:
问题背景,我自定义一个线程类接收客户端传过来的数据,通讯方式是基于TCP的Socket通讯,然后在线程类中通过方法调用Controller或Service将数据存储到数据库中。
1、首先我自定义一个线程类(注意类中含有一个带参构造函数,且controller为灰色),save()用于接收和存储数据。
在这里插入图片描述
运行后系统报错:
在这里插入图片描述

通过调试发现,在调用Controller的地方显示controller:null,不过参数record是有数据的,说明这里的没有关联到Controller(或者说是没有声明,导致为null)。
在这里插入图片描述
2、第一次尝试:用new的方式声明一个控制器。
在这里插入图片描述
结果这次controller不是空了,而且可以进入到service
在这里插入图片描述
不过Service里的recordService为null,所以还是无法向数据库存数据,没有解决问题。
在这里插入图片描述
然后看过几个csdn,有说加@Component注解的,没有解决我的问题,原因就是我自定义的类中含有带参构造函数,如果是工具类或许可以。
3、正确解决方法:
首先建立一个Spring工具类,SpringUtil。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
@Component  
public class SpringUtil implements ApplicationContextAware {  
 
    private static ApplicationContext applicationContext = null;  
 
    @Override  
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
        if(SpringUtil.applicationContext == null){  
            SpringUtil.applicationContext  = applicationContext;  
        }  
    }  
 
 
    //获取applicationContext  
    public static ApplicationContext getApplicationContext() {  
        return applicationContext;  
    }  
 
    //通过name获取 Bean.  
    public static Object getBean(String name){  
        return getApplicationContext().getBean(name);  
    }  
 
    //通过class获取Bean.  
    public static <T> T getBean(Class<T> clazz){  
        return getApplicationContext().getBean(clazz);  
    }  
 
    //通过name,以及Clazz返回指定的Bean  
    public static <T> T getBean(String name,Class<T> clazz){  
        return getApplicationContext().getBean(name, clazz);  
    }  
 
}  

在自定义类中通过这个工具类,访问service,进而向数据库存数据。

ApplicationContext context = SpringUtil.getApplicationContext();
CopyRecordService dataCollectionService = context.getBean(CopyRecordService.class);// 注意是Service,不是ServiceImpl
boolean result = dataCollectionService.saveOrUpdate(record);//CopyRecordService就是要调用的Service

然后问题就解决啦,而且这三行代码在main里也可以使用。

https://blog.csdn.net/ElevenMu233/article/details/96346624
https://blog.csdn.net/wqc19920906/article/details/80009929

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,这个问题比较复杂,我会尽量详细地回答你。 首先,我们需要确定一个数据库项目的主题。为了方便,我们选择一个简单的学生信息管理系统。这个系统需要记录学生的基本信息,包括姓名、性别、年龄、班级、学号等,同时需要实现增删改查等基本功能。 接下来,我们分别使用Druid、Mybatis和JdbcTemplate来实现这个系统。 1. Druid整合 Druid是阿里巴巴开源的一个数据库连接池实现,具有监控、可扩展等优点,被广泛应用于企业级应用。 首先,我们需要在项目引入Druid的依赖,可以在pom.xml文件添加以下代码: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> ``` 接下来,我们需要在src/main/resources目录下创建一个druid.properties文件,并添加以下配置: ``` # 数据库连接信息 url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false driverClassName=com.mysql.jdbc.Driver username=root password=root # Druid连接池信息 initialSize=5 minIdle=5 maxActive=20 maxWait=60000 timeBetweenEvictionRunsMillis=60000 minEvictableIdleTimeMillis=300000 validationQuery=SELECT 1 FROM DUAL testWhileIdle=true testOnBorrow=false testOnReturn=false poolPreparedStatements=true maxPoolPreparedStatementPerConnectionSize=20 filters=stat,wall,log4j ``` 其,url是数据库连接地址,username和password是数据库登录的用户名和密码,其他配置是Druid连接池的一些参数。 接下来,我们需要定义实体(Student)和Mapper接口(StudentMapper),这个过程比较简单,这里就不再赘述。 最后,我们需要在Spring配置文件添加以下配置: ``` <!-- 配置Druid连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置Mybatis --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="com.example.demo.entity" /> <property name="mapperLocations" value="classpath*:com/example/demo/mapper/*.xml" /> </bean> <!-- 配置Mapper扫描器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.demo.mapper" /> </bean> ``` 其,dataSource是Druid连接池的配置,sqlSessionFactory是Mybatis的配置,mapperLocations是Mapper文件的路径,MapperScannerConfigurer是扫描Mapper接口的配置。 完成以上配置后,我们就可以在Controller调用Service层的方法来实现CRUD功能了。 2. Mybatis整合 Mybatis是一款优秀的持久层框架,可以与各种数据库连接池进行整合,应用广泛。 首先,我们需要在项目引入Mybatis的依赖,可以在pom.xml文件添加以下代码: ``` <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> ``` 接下来,我们需要在src/main/resources目录下创建一个mybatis-config.xml文件,并添加以下配置: ``` <configuration> <!-- 设置默认的执行器型为REUSE --> <settings> <setting name="defaultExecutorType" value="REUSE" /> </settings> <!-- 配置Mapper文件 --> <mappers> <mapper resource="mapper/StudentMapper.xml" /> </mappers> </configuration> ``` 其,defaultExecutorType是Mybatis的默认执行器型,REUSE表示复用执行器,mapper是Mapper文件的路径。 接下来,我们需要定义实体(Student)和Mapper接口(StudentMapper),这个过程比较简单,这里就不再赘述。 最后,我们需要在Spring配置文件添加以下配置: ``` <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置Mybatis --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> </bean> <!-- 配置Mapper扫描器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.demo.mapper" /> </bean> ``` 其,dataSource是数据源的配置,sqlSessionFactory是Mybatis的配置,configLocation是Mybatis配置文件的路径,MapperScannerConfigurer是扫描Mapper接口的配置。 完成以上配置后,我们就可以在Controller调用Service层的方法来实现CRUD功能了。 3. JdbcTemplate整合 JdbcTemplate是Spring框架提供的一款轻量级的数据库访问工具,可以简化数据库操作。 首先,我们需要在项目引入Spring JDBC的依赖,可以在pom.xml文件添加以下代码: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.9.RELEASE</version> </dependency> ``` 接下来,我们需要在Spring配置文件添加以下配置: ``` <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> ``` 其,dataSource是数据源的配置,jdbcTemplate是JdbcTemplate的配置。 接下来,我们需要定义实体(Student)和RowMapper(StudentRowMapper),这个过程比较简单,这里就不再赘述。 最后,我们需要在Service调用JdbcTemplate来实现CRUD功能,比如: ``` @Service public class StudentServiceImpl implements StudentService { @Autowired private JdbcTemplate jdbcTemplate; @Override public List<Student> findAll() { String sql = "SELECT * FROM student"; return jdbcTemplate.query(sql, new StudentRowMapper()); } @Override public Student findById(Long id) { String sql = "SELECT * FROM student WHERE id=?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, new StudentRowMapper()); } @Override public void save(Student student) { String sql = "INSERT INTO student(name, gender, age, class, number) VALUES(?,?,?,?,?)"; jdbcTemplate.update(sql, student.getName(), student.getGender(), student.getAge(), student.getClass(), student.getNumber()); } @Override public void update(Student student) { String sql = "UPDATE student SET name=?, gender=?, age=?, class=?, number=? WHERE id=?"; jdbcTemplate.update(sql, student.getName(), student.getGender(), student.getAge(), student.getClass(), student.getNumber(), student.getId()); } @Override public void delete(Long id) { String sql = "DELETE FROM student WHERE id=?"; jdbcTemplate.update(sql, id); } } ``` 其,jdbcTemplate是JdbcTemplate的实例,query是查询方法,update是更新方法,queryForObject是查询单个对象方法。 完成以上配置后,我们就可以在Controller调用Service层的方法来实现CRUD功能了。 以上就是使用Druid、Mybatis和JdbcTemplate整合实现一个简单的学生信息管理系统的过程。希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值