关于mybatis插入语句包含对象

药药丶 2014-07-15 12:07:25
新人菜鸟一枚,找专业大大来解惑 直接上问题:
我现在有个User对象,里面有个字段‘经销商
public class User implements Serializable{

private static final long serialVersionUID = 1L;
private long ID;
private String userName;
private String password;
private String name;
private User dealer;//经销商
private String contact;//联系人
private String telephone;
private String lastLoginIP;//最后登录IP
private Date lastLoginTime;//最后登录时间
private int loginNum;//登录次数
private String email;
private String address;
private double balance;//账户余额
private Date createTime = new Date();
private boolean invalidate = false;//是否禁用
private String salt;//加密随机码
private boolean isDealer = false;//是否是经销商
//省略get set方法


现在我从jsp页面插入数据,添加‘经销商’字段时候进行判断,当不是供应商的时候,show一个供应商(key:id)下拉选(集合咯),等提交的时候就可以根据经销商id查到该经销商的User对象!
问题来了:

<insert id="insert" parameterType="user">
INSERT INTO users (username,password,name,dealer,contact,telephone,email,address,createTime,salt,isDealer)
VALUES (#{userName},SHA1(CONCAT(#{password},#{salt},'sleeping-lion')),#{name},#{dealer.userName},#{contact},#{telephone},#{email},#{address},#{createTime},#{salt},#{isDealer})
</insert>

报错如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'userName' in 'class java.lang.Boolean'
org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
com.sun.proxy.$Proxy28.insert(Unknown Source)
org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:237)
org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:79)
org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
com.sun.proxy.$Proxy29.insert(Unknown Source)
com.tpear.CloudHealth.service.UserServiceImpl.add(UserServiceImpl.java:23)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
com.sun.proxy.$Proxy30.add(Unknown Source)
com.tpear.CloudHealth.action.user.UserAction.add(UserAction.java:105)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
com.tpear.CloudHealth.action.SessionCheckInterceptor.intercept(SessionCheckInterceptor.java:62)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)

重点是这句:There is no getter for property named 'userName' in 'class java.lang.Boolean';
数据库中dealer经销商字段为varchar(30)--mysql

各位大大 怎么破 头疼啊
...全文
4555 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mumufans 2017-03-23
  • 打赏
  • 举报
回复
看不懂,这什么原理? 谁来解释下,非常感谢
药药丶 2014-07-15
  • 打赏
  • 举报
回复
引用 1 楼 defonds 的回复:
private boolean isDealer = false;//是否是经销商
把这个字段换个名字试试,应该就好了
我试试吧 但我觉得应该不是这问题 不至于说 mybatis取值都不能一一对应
药药丶 2014-07-15
  • 打赏
  • 举报
回复
引用 2 楼 jiafeng_lee 的回复:
is no getter for property named 'userName' in 'class java.lang.Boolean' private String userName; 类型报错
没有 我mysql里的显然是varchar啊
jiafeng_lee 2014-07-15
  • 打赏
  • 举报
回复
is no getter for property named 'userName' in 'class java.lang.Boolean' private String userName; 类型报错
Defonds 2014-07-15
  • 打赏
  • 举报
回复
private boolean isDealer = false;//是否是经销商
把这个字段换个名字试试,应该就好了
jayung 2014-07-15
  • 打赏
  • 举报
回复

private User dealer;//经销商
private boolean isDealer = false;
生成getter、setter时,有两个

public boolean isDealer() {
...
}

public User getDealer() {
...
}
冲突了
药药丶 2014-07-15
  • 打赏
  • 举报
回复
引用 4 楼 pp365789 的回复:
[quote=引用 1 楼 defonds 的回复:]
private boolean isDealer = false;//是否是经销商
把这个字段换个名字试试,应该就好了
我试试吧 但我觉得应该不是这问题 不至于说 mybatis取值都不能一一对应 [/quote] 谢谢 我该了字段名 的确好了 但是我很费劲 这是什么原理 方便讲解下么 3q啦
以最短的时间学会Mybatis,并使用到项目中,包括搜集的很多资料;很全很全:并且有项目实例 例如:mybatis中的#和$的区别? 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".    2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.    3. #方式能够很大程度防止sql注入。    4.$方式无法防止Sql注入。 5.$方式一般用于传入数据库对象,例如传入表名.    6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用: ORDER BY ${columnName} 这里MyBatis不会修改或转义字符串。 重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
MyBatis知识点总结 MyBatis是一款优秀的持久层框架,为Java应用程序提供了数据库访问的灵活性和高度可控性。以下是关于MyBatis的一些重要知识点总结: 1. MyBatis基础: MyBatis是一个支持自定义SQL、存储过程和高级映射的持久层框架。 MyBatis通过XML或注解的方式将Java对象映射到数据库中的SQL语句。 2. 配置文件和配置项: mybatis-config.xml是MyBatis的主配置文件,其中包含了数据库连接信息、类型别名、映射器配置等。 配置项如数据源、事务管理器、缓存配置、全局设置等可在配置文件中进行定义。 3. 映射器文件: 映射器文件(Mapper XML)定义了SQL语句和映射规则。每个映射器文件对应一个数据访问接口。 映射器文件中定义了SQL语句、参数映射、结果映射等。 4. SQL语句映射: MyBatis支持静态SQL和动态SQL。使用等元素来定义SQL语句。 使用${}和#{}来插入参数,其中${}会直接替换,#{}会被预编译防止SQL注入。 5. 参数映射: 参数映射使用#{}或${}来引用参数,#{}使用PreparedStatement,$${}直接替换。 6. 结果映射: 结果映射将查询结果映射到

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧