@insert mybatis踩坑記錄,實體接收前端傳遞的參數
@insert mybatis踩坑實體接收前端傳遞的參數
插入方法使用的使用entity實體對象進行接收的
@Insert(" insert into infor (name,pass,salary) values (#{infor.name},#{infor.pass},#{infor.salary})") public int save(@Param("infor") Infor infor);
//必須添加@param這個註解,使得mybatis去解析這個數據,否則一直提示infor的沒有getter方法
@Insert(" insert into infor (name,pass,salary) values (#{name},#{pass},#{salary})") public int save( Infor infor);
經過後來的工作才 認識到,使用上面的一種方式確實可行,同時我們可以直接使用這個實體類的屬性進行對應的insert的操作,特此來更新博文。
錯誤提示:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'infor' in 'class com.ys.study.entity.Infor'
at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:419) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.reflection.MetaObject.metaObjectForProperty(MetaObject.java:145) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:115) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:79) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:93) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198) ~[mybatis-3.4.6.jar:3.4.6]
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185) ~[mybatis-3.4.6.jar:3.4.6]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
mybatis獲取主鍵及參數傳遞的有關問題
獲取主鍵值
insert into emp values(null,#{ename},#{age},#{sex}) /*insert into emp values(null,'${ename}',${age},'${sex}')*/
不同的參數類型,${}和#{}的不同取值方式
1.當傳輸參數為單個String或基本數據類型及其包裝類
#{}
:可以以任意的名字獲取參數值:
隻能以{value}huo${_parameter}獲取
2.當傳輸參數為javabean時
#{}和都可以通過屬性名直接獲取屬性值,但是要註意{}的單引號問題
3.當傳輸多個參數時,mybatis會默認將這些參數放在map集合中
兩種方式:
(1) 鍵為01.2,3,…n-1 以參數為值
(2) 鍵為param1,param2,param3…param(n).以參數為值
#{}
:#{arg0}/#{arg1};#{param1},#{param2}:
{param1},param2,{arg0},arg1.但是要註意{}的單引號問題
4.當傳輸map參數時
#{}和都可以通過鍵的名字直接獲值,但是要註意{}的單引號問題
5.命名參數
可以通過@param(:‘key’)為map集合指定鍵的名字
Emp getEmpByIDAndEnameParam(@Param(“eid”) Integer eid, @Param(“ename”) String ename);
#{}和都可以通過鍵的名字直接獲值,但要註意{}的單引號問題
6.當傳輸參數為List或Array,mybatis會將List或Array放在map中
List以list為鍵,Array以array為鍵
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- mybatis相同的sql查詢第二次查不出結果問題
- Mybatis第三方PageHelper分頁插件的使用與原理
- 淺談MyBatis Plus主鍵設置策略
- springboot連接sqllite遇到的坑及解決
- mybatis參數類型不匹配錯誤argument type mismatch的處理方案