关于#java#的问题:代码实际运行出现了如下问题:以下两行代码报错——表示price的值为空此前price处是直接goods.getPrice来获取的,系统还未获取到值(相关搜索:数据库)

编写java商品系统简单的购物车功能板块:
1.maven框架使用mybatis的mapper代理开发。
2.数据库表jsu_1存放的商品信息
3.jsu_1_shopcar存放购物车的商品信息,
4.代码逻辑:将须下单商品通过方法拿出来,下单处理后,将商品变化的数量更新jsu_1的数据,同时将下单的商品数量信息存入jsu_1_shopcar表。
代码实际运行出现了如下问题:
以下两行代码报错——表示price的值为空
此前price处是直接goods.getPrice来获取的,问题出现后我以为是代码运行快啦,系统还未获取到值,直接运行完了,但我修改代码后,问题始终存在。

shopcar shopcar = new shopcar(name,price,number);
 mapper.addshopcar(shopcar);

以下是改板块的实现代码:

public class Buy extends BasePurchase {
    @Override
    public void buy(){
        try {
            System.out.println("输入商品名及须下单数量:");
            Scanner scanner = new Scanner(System.in);
            String name = scanner.nextLine();
            int number = scanner.nextInt();
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            jsu_1Mapper mapper = sqlSession.getMapper(jsu_1Mapper.class);
            goods goods = mapper.selectByname(name);
            if(goods!=null){
                String price = goods.getPrice();
                if (price != null) {
                    int Number = goods.getNumber();
                    if (goods.getNumber()>=number){
                        shopcar shopcar = new shopcar(name,price,number);
                        mapper.addshopcar(shopcar);
                        goods goods1 =new goods("","",Number-number);
                        mapper.update(goods1);
                        System.out.println("下单成功");
                    }else {
                        System.out.println("库存不足");
                    }
                } else {
                    System.out.println("商品价格为空");
                }
            }else{
                System.out.println("商品不存在");
            }
            sqlSession.commit();
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以下是报错信息:


```java
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'price' cannot be null
### The error may exist in mapper\jsu_1Mapper.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: INSERT INTO jsu.jsu_1_shopcar(name,price,number)VALUES(?,?,?);
### Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'price' cannot be null
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:199)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
    at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
    at com.sun.proxy.$Proxy4.addshopcar(Unknown Source)
    at implementation.shop.Buy.buy(Buy.java:36)
    at page.ShopPage.shoppage(ShopPage.java:36)
    at implementation.manage.UserEnter.userenter(UserEnter.java:37)
    at page.Sign_in.sign_in(Sign_in.java:21)
    at Main.main(Main.java:4)
Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'price' cannot be null
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:118)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:47)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
    at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
    at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
    ... 10 more

求路人指点迷津

确定price是否有值,字段是否对应

【以下回答由 GPT 生成】

问题原因可能是在获取商品价格时出现了问题,导致price的值为空。可能的解决方案有以下几点:

  1. 确保数据库表jsu_1中的商品记录包含了正确的价格数据,请检查数据库中的数据是否正确。可以直接查看数据库中相应的商品记录并确认价格数据是否存在。如果价格数据确实为空,可以通过修改数据库数据或添加默认值解决。

  2. 确保goods.getPrice()方法能够正确返回商品价格数据。请确认该方法的实现是否正确,可以在该方法中添加日志输出或使用调试器进行调试,以确认是否能够正确获取到价格数据。

  3. 确保mapper.selectByname(name)方法能够正确返回商品对象。请确认该方法的实现是否正确,可以添加日志输出或使用调试器进行调试,以确认是否能够正确返回商品对象。

  4. 确保goods.getPrice()方法或mapper.selectByname(name)方法没有出现并发或线程安全问题。如果存在并发访问的情况,可以考虑在方法上加锁或使用线程安全的方式来处理。

  5. 尝试使用延迟加载来解决问题。可以将mapper.selectByname(name)方法的延迟加载属性设置为true,这样在调用goods.getPrice()方法时才会去实际获取价格数据,避免了提前获取到空值的问题。

以下是对应代码示例:

// 添加延迟加载配置
<!-- mybatis-config.xml -->
<configuration>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
</configuration>

// 修改查询方法
goods goods = mapper.selectByname(name); // 此时不会立即查询数据库,而是在调用具体属性时才会去查询
String price = goods.getPrice(); // 这里才会去实际查询价格数据

如果以上解决方案都不能解决该问题,我无法给出具体解决方案。请检查以上步骤,并确保代码逻辑正确、数据库中的数据正确,并进行适当的调试和排查。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^