亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error處理)

 更新時間:2020年09月01日 14:13:54   作者:一介遺石  
這篇文章主要介紹了MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found)的Error處理方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

錯誤梗概

接手了一個新任務(wù),需要修改別人的代碼??纯磾?shù)據(jù)庫配置 ,連連接池都沒,然后引入了 druid,本來一切很順利。后來不知道怎么回事,運行起來后總是報 “Invalid bound statement (not found) ”,而且報錯的都是 MybatisPlus 生成的 BaseMapper 中的方法,自己寫的都能正常運行。

參考了很多其他帖子,都無果,最后弄了很久,終于搞定了,特級錄之。

druid 和 mybatis-plus 配置參數(shù)如下:

pom.xml

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
  <version>1.1.10</version>
 </dependency>

 <dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.2.0</version>
 </dependency>

 <dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper-spring-boot-starter</artifactId>
  <version>1.2.13</version>
  <exclusions>
  <exclusion>
   <artifactId>jsqlparser</artifactId>
   <groupId>com.github.jsqlparser</groupId>
  </exclusion>
  <exclusion>
   <artifactId>mybatis-spring</artifactId>
   <groupId>org.mybatis</groupId>
  </exclusion>
  </exclusions>
 </dependency>

application.properties

######################################################### MybatisPlus 配置
mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.type-aliases-package=com.yishi.entity
mybatis-plus.global-config.db-config.table-underline=true
mybatis-plus.global-config.banner=false
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.jdbc-type-for-null=NULL
mybatis-plus.configuration.auto-mapping-behavior=FULL
######################################################### druid 配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 參考 https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
#################################### JDBC 配置
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=${mysql.url}
spring.datasource.druid.username=${mysql.username}
spring.datasource.druid.password=${mysql.password}
#################################### 連接池配置
# 初始化大小,最小,最大
spring.datasource.druid.initial-size=10
spring.datasource.druid.max-active=500
spring.datasource.druid.min-idle=5
# 配置獲取連接等待超時的時間
spring.datasource.druid.max-wait=60000
# 打開PSCache,并且指定每個連接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#spring.datasource.druid.max-open-prepared-statements= #和上面的等價
#spring.datasource.druid.validation-query=
#spring.datasource.druid.validation-query-timeout=
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
# 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
#spring.datasource.druid.max-evictable-idle-time-millis=
# 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
spring.datasource.druid.filters=stat,wall,log4j
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#################################### 監(jiān)控配置
# WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=/druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
spring.datasource.druid.web-stat-filter.session-stat-enable=true
spring.datasource.druid.web-stat-filter.session-stat-max-count=10
#spring.datasource.druid.web-stat-filter.principal-session-name=
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
#spring.datasource.druid.web-stat-filter.profile-enable=
# StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
#spring.datasource.druid.stat-view-servlet.allow=
#spring.datasource.druid.stat-view-servlet.deny=

DruidDataSourceProperties

package com.yishi.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidDataSourceProperties {
 private String driverClassName;
 private String url;
 private String username;
 private String password;

 private int initialSize;
 private int minIdle;
 private int maxActive;
 private long maxWait;
 private long timeBetweenEvictionRunsMillis;
 private long minEvictableIdleTimeMillis;
 private String validationQuery;
 private boolean testWhileIdle;
 private boolean testOnBorrow;
 private boolean testOnReturn;
 private boolean poolPreparedStatements;
 private int maxPoolPreparedStatementPerConnectionSize;
 private String filters;
 private String connectionProperties;

 // 省略 get、set 方法
}

MysqlDruidConfiguration

package com.yishi.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
@EnableConfigurationProperties({DruidDataSourceProperties.class})
@MapperScan(value = MysqlDruidConfiguration.PACKAGE, sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDruidConfiguration {

 static final String PACKAGE = "com.yishi.dao";

 static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

 @Autowired
 private DruidDataSourceProperties properties;

 @Bean(name = "mysqlDataSource")
 @Primary
 public DataSource mysqlDataSource() {
 DruidDataSource druidDataSource = new DruidDataSource();
 druidDataSource.setDriverClassName(properties.getDriverClassName());
 druidDataSource.setUrl(properties.getUrl());
 druidDataSource.setUsername(properties.getUsername());
 druidDataSource.setPassword(properties.getPassword());
 druidDataSource.setInitialSize(properties.getInitialSize());
 druidDataSource.setMinIdle(properties.getMinIdle());
 druidDataSource.setMaxActive(properties.getMaxActive());
 druidDataSource.setMaxWait(properties.getMaxWait());
 druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
 druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
 druidDataSource.setValidationQuery(properties.getValidationQuery());
 druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());
 druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
 druidDataSource.setTestOnReturn(properties.isTestOnReturn());
 druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());
 druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
 druidDataSource.setConnectionProperties(properties.getConnectionProperties());
 try {
  druidDataSource.setFilters(properties.getFilters());
  druidDataSource.init();
 } catch (SQLException e) {
  e.printStackTrace();
 }

 return druidDataSource;
 }

 @Bean(name = "mysqlTransactionManager")
 @Primary
 public DataSourceTransactionManager mysqlTransactionManager() {
 return new DataSourceTransactionManager(mysqlDataSource());
 }

 @Bean(name = "mysqlSqlSessionFactory")
 @Primary
 public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
  throws Exception {
 final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
 sessionFactory.setDataSource(mysqlDataSource);
 sessionFactory.setMapperLocations(
  new PathMatchingResourcePatternResolver().getResources(MysqlDruidConfiguration.MAPPER_LOCATION));
 return sessionFactory.getObject();
 }

 @Bean(name = "mysqlJdbcTemplate")
 public JdbcTemplate hiveJdbcTemplate(@Qualifier("mysqlDataSource") DataSource dataSource) {
 return new JdbcTemplate(dataSource);
 }
}

開發(fā)環(huán)境

IDEA 2020.2
Apache Maven 3.2.5
主要庫版本:
org.springframework.boot.spring-boot-dependencies.2.1.1.RELEASE
com.baomidou.mybatis-plus-boot-starter.3.2.0
com.alibaba.druid-spring-boot-starter.1.1.10

異常信息

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.yishi.dao.UserDao.selectList
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
	at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)
	at org.apache.ibatis.binding.MapperProxy.lambda$cachedMapperMethod$0(MapperProxy.java:98)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
	at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:97)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:92)
	at com.sun.proxy.$Proxy105.selectList(Unknown Source)
	at com.yishi.impl.UserServiceImpl.insert(UserServiceImpl.java:104)
	at com.yishi.impl.UserServiceImpl.insert(UserServiceImpl.java:39)
	at com.yishi.impl.UserServiceImpl$$FastClassBySpringCGLIB$$ac0e5ea9.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
	at com.yishi.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$c9a67874.insert(<generated>)
	at com.yishi.controller.UserController.add(UserController.java:20)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

解決方式

一開始沒打開 Debug 日志,導致很多 Debug 的信息都沒法及時捕獲,打開 Debug 日志后,WARN 如下:

2020-09-01 10:02:15 [restartedMain] WARN  o.m.s.m.ClassPathMapperScanner - Skipping MapperFactoryBean with name 'userDao' and 'com.yishi.dao.UserDao' mapperInterface. Bean already defined with the same name!

...

2020-09-01 10:02:15 [restartedMain] WARN  o.m.s.m.ClassPathMapperScanner - No MyBatis mapper was found in '[com.yishi.dao]' package. Please check your configuration.

可以看到,在注入 dao 時說已經(jīng)存在了,難怪 Mybatis-Plus 生成的 BaseMapper 所有方法報錯,壓根就沒注入。那什么地方先注入了呢?看來看去,原來是在 MysqlDruidConfiguration.java 這個類在自動配置時配置 “mysqlSqlSessionFactory” 這個 bean 時已經(jīng)先注入 dao 相關(guān)的信息!

最后解決方式,刪掉 MysqlDruidConfiguration.java 和 DruidDataSourceProperties.java這兩個類,springboot 都已經(jīng)幫我們處理了 druid 的配置,其實這兩個類也沒什么用。

總結(jié)

到此這篇關(guān)于MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error處理)的文章就介紹到這了,更多相關(guān)MybatisPlus BaseMapper內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java AES256加密解密示例代碼

    Java AES256加密解密示例代碼

    這篇文章主要介紹了Java AES256加密解密示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Java實現(xiàn)數(shù)據(jù)脫敏的方法詳細講解

    Java實現(xiàn)數(shù)據(jù)脫敏的方法詳細講解

    這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)數(shù)據(jù)脫敏的相關(guān)資料,數(shù)據(jù)脫敏是指對某些敏感信息通過脫敏規(guī)則進行數(shù)據(jù)的變形,實現(xiàn)敏感隱私數(shù)據(jù)的可靠保護,需要的朋友可以參考下
    2023-06-06
  • 學生信息管理系統(tǒng)java版

    學生信息管理系統(tǒng)java版

    這篇文章主要為大家詳細介紹了java學生信息管理系統(tǒng)源代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java同學找工作最懵圈的問題:到底啥是分布式系統(tǒng)開發(fā)經(jīng)驗?(推薦)

    Java同學找工作最懵圈的問題:到底啥是分布式系統(tǒng)開發(fā)經(jīng)驗?(推薦)

    這篇文章主要介紹了分布式系統(tǒng)開發(fā)經(jīng)驗,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 解決IDEA中不能正常輸入光標變粗的問題

    解決IDEA中不能正常輸入光標變粗的問題

    這篇文章主要介紹了在IDEA中不能正常輸入光標變粗的解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • SpringMVC攔截器詳解

    SpringMVC攔截器詳解

    本篇文章主要介紹了SpringMVC攔截器配置及使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • Java輕松使用工具類實現(xiàn)獲取wav時間長度

    Java輕松使用工具類實現(xiàn)獲取wav時間長度

    在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用工具類來獲取一個wav文件的時間長度,感興趣的同學繼續(xù)往下閱讀吧
    2021-10-10
  • @Transactional和@DS怎樣在事務(wù)中切換數(shù)據(jù)源

    @Transactional和@DS怎樣在事務(wù)中切換數(shù)據(jù)源

    這篇文章主要介紹了@Transactional和@DS怎樣在事務(wù)中切換數(shù)據(jù)源問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MyBatis方法重載的陷阱及解決方案

    MyBatis方法重載的陷阱及解決方案

    在使用 MyBatis 進行開發(fā)時,尤其是使用注解模式(如 @Select、@Insert 等)時,開發(fā)者常常會遇到這樣一個問題:為什么我的方法重載不能正常工作?這篇文章將深入探討 MyBatis 的這個特性及如何規(guī)避相關(guān)的坑,需要的朋友可以參考下
    2024-09-09
  • java對接微信支付之JSAPI支付(微信公眾號支付)

    java對接微信支付之JSAPI支付(微信公眾號支付)

    這篇文章主要給大家介紹了關(guān)于java對接微信支付之JSAPI支付(微信公眾號支付)的相關(guān)資料,微信JSAPI支付是近年來非常流行的一種支付方式,它使用了微信支付的SDK和demo來實現(xiàn)支付接口的對接,需要的朋友可以參考下
    2023-07-07

最新評論