编写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
的值为空。可能的解决方案有以下几点:
确保数据库表jsu_1
中的商品记录包含了正确的价格数据,请检查数据库中的数据是否正确。可以直接查看数据库中相应的商品记录并确认价格数据是否存在。如果价格数据确实为空,可以通过修改数据库数据或添加默认值解决。
确保goods.getPrice()
方法能够正确返回商品价格数据。请确认该方法的实现是否正确,可以在该方法中添加日志输出或使用调试器进行调试,以确认是否能够正确获取到价格数据。
确保mapper.selectByname(name)
方法能够正确返回商品对象。请确认该方法的实现是否正确,可以添加日志输出或使用调试器进行调试,以确认是否能够正确返回商品对象。
确保goods.getPrice()
方法或mapper.selectByname(name)
方法没有出现并发或线程安全问题。如果存在并发访问的情况,可以考虑在方法上加锁或使用线程安全的方式来处理。
尝试使用延迟加载来解决问题。可以将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(); // 这里才会去实际查询价格数据
如果以上解决方案都不能解决该问题,我无法给出具体解决方案。请检查以上步骤,并确保代码逻辑正确、数据库中的数据正确,并进行适当的调试和排查。