提问与解答: 提问: 当我们使用注解开发时有时会遇到数据库字段名与实体类属性名不一致的问题。xml方式开发可以通过结果集映射的方式解决,那注解方式开发要怎么解决呢?
解答: 利用 @Results() 注解!
Results注解中有两个常用的参数,一个是id,另一个是value。
id :这个参数的主要作用在于唯一标记这个Results注解,如果接口中的其他抽象方法也需要通过result注解来解决属性名和数据库字段名不一致问题,那么重新写一个Results注解就太麻烦了,这时我们就可以通过@ResultMap()注解中传入Results注解的参数id来引用Results注解中的内容。
value :这个参数用于建立实体类与数据库表的映射关系,其中可以填写多个@Result注解,用来将实体类的属性名和数据库字段名一一对应。⚠需要注意如果是主键字段,@Result注解中需要设置id=true。
代码示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public interface UserMapper { @Select ("select * from user" ) @Results (id="aaa" ,value={ @Result (id=true ,column = "id" ,property = "userId" ), @Result (column = "name" ,property = "userName" ), @Result (column = "age" ,property = "userAge" ) }) List<User> getUsers () ; @Select ("select count(id) from user" ) @ResultMap (value={"aaa" }) int findTotalUser () ; }
补充:xml中的解决方式 方式一:利用 as 关键字 1 2 3 4 5 6 7 8 9 10 <select id ="selectAll" resultType ="com.geyu.mybatis.pojo.Car" > select id, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType from t_car </select >
方式二:使用resultMap进行结果映射 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <resultMap id ="carResultMap" type ="Car" > <id property ="id" column ="id" /> <result property ="carNum" column ="car_num" /> <result property ="guidePrice" column ="guide_price" /> <result property ="produceTime" column ="produce_time" /> <result property ="carType" column ="car_type" /> </resultMap > <select id ="selectAllByResultMap" resultMap ="carResultMap" > select * from t_car </select >
方式三:开启驼峰命名自动映射 使用这种方式的前提是:属性名遵循Java的命名规范,数据库表的列名遵循SQL的命名规范。
Java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名方式。
SQL命名规范:全部小写,单词之间采用下划线分割。 比如以下的对应关系:
实体类中的属性名——-数据库表的列名
carNum————–car_num
carType————–car_type
produceTime——-produce_time
如何启用该功能,在mybatis-config.xml文件中进行如下配置:
1 2 3 4 <settings > <setting name ="mapUnderscoreToCamelCase" value ="true" /> </settings >
再在Mapper.xml中配置如下:
1 2 3 <select id ="selectAllByMapUnderscoreToCamelCase" resultType ="Car" > select * from t_car </select >