今天在写 JavaEE 作业的时候,出了些 bug ,最初以为是 MyBatis 的映射问题,后来发现与 EL 表达式的取值原理有关。写篇文章记录一下这个小经验。
背景
用 MyBatis 获取数据库中的书籍信息(books表),然后用 EL 表达式,将查询结果显示在 jsp 界面上。
在 books 表中,有一个 book_name 属性,在 Book 类中也有同名属性。在 jsp 中用 EL 表达式 ${book.book_name} 输出 book 对象的属性值。
问题
报错显示找不到 Book 中的 book_name 属性。
刚开始我以为默认开启了 “驼峰映射”,就把 EL 表达式改为 ${book.bookName},再刷新,果然有效。但是后来的测试中,发现类似的问题接二连三的出现。试了无数次后,震惊地发现,Book 类中是否有 get 方法也会影响程序是否报错。
结果
查了很多资料后,总结如下:
如果在 EL 表达式中使用 ${book.book_name} 方法,那么在 Book 中就必须存在 getbook_name 方法( getBook_name 方法也可以,但是不能为 getBook_Name )。否则就会显示,没有 book_name 这个属性。
如果使用 ${book.bookName},那么就必须有 getbookName 方法或 getBookName 方法。
也就是说,EL 表达式并不会真的去找类中是否存在某个属性,只是找对应的 get 方法。
而 MyBatis 将数据库中的数据存入类中时,会比较类中的属性与数据库的列名是否一致。如果数据库中有 book_name 这一列,那么就会把数据存入类中的 book_name 属性。而如果类的属性名为 bookName,那么就无法映射,类的 bookName 属性最终会为 null 。