使用user = userInfoMapper.selectOne(user);可以正常查到收,可是使用user = userInfoMapper.selectByPrimaryKey(userId);却报错,Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2213b08a] was not registered for synchronization because synchronization is not active JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@636b6be4] will not be managed by Spring ==> Preparing: SELECT id,session_key,nickname,role,avatar_url,gender,country,province,city,phone_number,create_time,update_time FROM user WHERE id = ? AND session_key = ? AND nickname = ? AND role = ? AND avatar_url = ? AND gender = ? AND country = ? AND province = ? AND city = ? AND phone_number = ? AND create_time = ? AND update_time = ? ==> Parameters: oFBP54qpN074mehPS6CAlMoFzMhA(String), null, null, null, null, null, null, null, null, null, null, null,请详细说明原因
时间: 2023-12-10 13:38:18 浏览: 70
这个错误是因为在使用`userInfoMapper.selectByPrimaryKey(userId)`方法时,MyBatis框架默认使用了事务管理,但是Spring容器没有开启事务。因此,MyBatis无法将JDBC连接注册到Spring的事务管理中,导致报错。
解决方法可以有两种:
1. 在`userInfoMapper.selectByPrimaryKey(userId)`方法上添加`@Transactional`注解,让MyBatis框架使用Spring的事务管理。
```
@Transactional
public UserInfo selectByPrimaryKey(Integer userId) {
return userInfoMapper.selectByPrimaryKey(userId);
}
```
2. 在Spring的配置文件中开启事务管理,这样就可以避免在每个方法上都添加`@Transactional`注解。
```
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
```
相关问题
public class UserController { private static Integer userid = -1; long staretime = 0; @Autowired IUserService iUserService; @GetMapping("/selectone") public Result selectone(){ User user = iUserService.selectuser(userid); if (user == null) return Result.error(); return Result.success(user); }
这是一个Spring Boot的UserController类,其中包含一个selectone方法。该方法使用@GetMapping注释标记,表示它将处理HTTP GET请求。当该方法被调用时,它将从数据库中获取一个用户对象,并将其作为JSON响应返回。该方法还使用@Autowired注释将IUserService接口的实现注入到UserController中。另外,该类还包含了一个静态的userid变量和一个staretime变量,但是这两个变量没有在selectone方法中使用。
public boolean buy(String username, String componname) { List<User> users = userMapper.selectByUsername(username); List<Compon> compons = componMapper.selectAllByComponname(componname); Integer userid = users.get(0).getUserid(); Integer componid = compons.get(0).getComponid(); QueryWrapper<Order> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("userid",userid); queryWrapper.eq("componid",componid); Order order = orderMapper.selectOne(queryWrapper); if (order == null){ orderMapper.insert(new Order(userid, componid)); return true; }else { int res = orderMapper.updateNumberByUseridAndComponid(userid, componid); if (res > 0) return true; else return false; } }
这段代码实现了一个购买组件的功能。首先根据用户名和组件名查询用户和组件信息,然后获取用户 ID 和组件 ID。接着使用 MyBatis-Plus 提供的 QueryWrapper 构造查询条件,查询订单表中是否已经存在该用户对应该组件的订单记录。如果订单不存在,则向订单表插入一条新的记录,并返回 true 表示购买成功;否则更新订单数量并返回 true,若更新失败则返回 false。
需要注意的是,这段代码中没有对用户账户余额进行判断,如果用户账户余额不足以支付该组件的价格,购买会失败。同时,如果同一用户购买同一组件的操作过于频繁,可能会导致数据库中出现重复的订单记录,需要在应用层面上加以限制。
阅读全文