为什么要在service层加上@ mapper注解
时间: 2023-03-25 15:00:27 浏览: 79
在service层加上@ mapper注解是为了将该service类与对应的mapper接口绑定起来,使得在service层中可以直接调用mapper接口中定义的方法,从而方便地进行数据库操作。同时,@ mapper注解也可以让Spring容器自动扫描并注入mapper接口的实现类,避免手动创建mapper实例的繁琐操作。
相关问题
service层加了@Autowire还报空指针
在SpringMVC框架中,我们通常使用@Autowired注解来注入Service或Mapper接口。在controller层中注入service接口,在service层中注入其他的service接口或mapper接口是可以的。然而,在我们自定义的非controller或service类中直接使用@Autowired注解进行注入是不可能的,会导致空指针异常。
解决这个问题的方法是,我们可以使用下面的方式来实现注入。首先,在我们自定义的类中声明一个@Autowired注解的成员变量,然后通过构造方法或setter方法来对该成员变量进行赋值。这样,在使用该类时,Spring会自动将依赖的实例注入进来,避免了空指针异常的发生。具体实现步骤和相关使用技巧可以参考Spring实战之@Autowire注解的文章。
举个例子,假设我们有一个非controller或service类叫做UserInfoService,在该类中需要注入一个IUserInfoService接口的实例。我们可以在UserInfoService类中声明如下成员变量并加上@Autowired注解:
@Autowired
private IUserInfoService userInfoService;
然后,在UserInfoService类的构造方法或setter方法中对该成员变量进行赋值:
public UserInfoService(IUserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
或者
@Autowired
public void setUserInfoService(IUserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
这样,在使用UserInfoService类时,IUserInfoService接口的实例就会被自动注入进来,避免了空指针异常的发生。如果你仍然遇到service层加了@Autowire注解后报空指针异常的问题,请检查是否正确声明了@Autowired注解的成员变量并是否正确进行了赋值。如果仍然无法解决问题,可以参考引用中的解决办法,可能会帮助你解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
使用Java编程和springboot和mybatis框架,连接mysql数据库,给出具体程序,包含Controller层、Service层、Service实现类、Dao层以及Mapper.xml文件,统计本周第一天 本月第一天 本年第一天起到今天为止的中奖趋势接口 并对接口使用redis进行缓存处理 过期时间10分钟
好的,下面是具体的程序:
Controller层:
```java
@RestController
@RequestMapping("/lottery")
public class LotteryController {
@Autowired
private LotteryService lotteryService;
@GetMapping("/trend")
public List<Trend> getTrend() {
return lotteryService.getTrend();
}
}
```
Service层:
```java
public interface LotteryService {
List<Trend> getTrend();
}
```
Service实现类:
```java
@Service
public class LotteryServiceImpl implements LotteryService {
@Autowired
private LotteryDao lotteryDao;
@Override
@Cacheable(value = "trendCache", keyGenerator = "myKeyGenerator")
public List<Trend> getTrend() {
return lotteryDao.getTrend();
}
}
```
Dao层:
```java
@Repository
public interface LotteryDao {
List<Trend> getTrend();
}
```
Mapper.xml文件:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.lottery.dao.LotteryDao">
<select id="getTrend" resultType="com.example.lottery.entity.Trend">
SELECT DATE_FORMAT(lottery_time, '%Y-%m-%d') as date, COUNT(*) as count
FROM lottery
WHERE lottery_time BETWEEN #{weekBegin} AND NOW()
GROUP BY DATE_FORMAT(lottery_time, '%Y-%m-%d')
ORDER BY DATE_FORMAT(lottery_time, '%Y-%m-%d') DESC
</select>
</mapper>
```
其中,Trend是一个中奖趋势的实体类,包含date和count两个属性。
缓存处理使用了Redis,具体的配置可以在application.properties中进行:
```properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
```
同时,在启动类上加上@EnableCaching注解启用缓存:
```java
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
最后,自定义一个KeyGenerator,用于生成缓存的key:
```java
@Component
public class MyKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
}
```
这样就完成了本周第一天、本月第一天、本年第一天起到今天为止的中奖趋势接口,并使用Redis进行了缓存处理,缓存过期时间为10分钟。