flydoging 2019-12-10
这篇文章主要介绍了Mybatis中实体类属性与数据列表间映射方法介绍,一共四种方法方法,供大家参考。
Mybatis不像Hibernate中那么自动化,通过@Column注解或者直接使用实体类的属性名作为数据列名,而是需要自己指定实体类属性和数据表中列名之间的映射关系,这一点让用惯了Hibernate的人很不习惯,所幸经过探索找到了建立映射关系的几种办法,其中总也有比较简单的。
首先定义一个实体类User,如下:
public class User { private Integer id; private String username; private Date birthday; private String address; private String sex; ....... (setter,getter省略) }
其次定义一个接口UserDao ,如下:
public interface UserDao { List<User> selectUserByName (); }
还有设计一张user数据库表,如下:
然后下面将详细说明四种常用的方法。
1. 通过XML映射文件中的resultMap
这种方式是最常见的,类似如下:
<mapper namespace="demo.UserDao"> <resultMap id="userResultMap" type="entity.User"> <!-- 用id属性来映射主键字段 --> <id property="id" column="uid"/> <!-- 用result属性来映射非主键字段 --> <result property="username" column="uusername "/> <result property="birthday" column="ubirthday"/> <result property="address" column="uaddress"/> <result property="sex" column="usex"/> </resultMap> </mapper>
通过里面的id标签和result标签来建立映射关系,由property和column分别指定实体类属性和数据表的列名。
2. 通过注解@Results和@Result
这两个注解是与XML文件中的标签相对应的:
@Results对应resultMap
@Result对应result
这两个注解是应用在方法的级别上的,也就是在UserDao的方法上,这时候就需要xml了,如下:
@Select("select * from user where uusername = #{userName}") @Results({ @Result( id = true ,property = "id", column = "uid"), @Result(property="username" ,column="uusername"), @Result(property="birthday", column="ubirthday"), @Result(property="address", column="uaddress"), @Result(property="sex" ,column="usex"), } ) User selectUserByName(@Param("userName") String username);
在这里把参数username,和userName区别开了,目的是在凸显Param注解后面的参数要与sql语句里的对应上,方法里的形参随便都可以。id为是否为主键。
缺点:
由于注解是针对方法的,对于Mapper中的每个操作数据库的方法都必须有相同的注解完成映射关系的建立,导致很多的配置是重复的;
如果要避免配置重复的问题,可以采用在XML配置文件中配置这个resultMap,然后再@Result中通过id属性引用这个resultMap,
但是这样感觉很麻烦(由于使用了两种配置方式),不如直接使用基于XML的resultMap配置方式;
3. 通过属性配置完成映射
Mybatis给我们提供了一种映射方式,如果属性的命名是遵从驼峰命名法的,数据列名遵从下划线命名,
那么可以使用这种方式,类似如下:
实体类中属性userName对应数据库列名user_name;
userId对应user_id;
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); Configuration configuration = new Configuration(); configuration.setMapUnderscoreToCamelCase(true); sqlSessionFactoryBean.setConfiguration(configuration);
4. 通过使用在SQL语句中定义别名完成映射
这种方式最直接,直接在SQL语句中建立别名来完成映射,如下:
@Select("select user_name as username, user_id as id from user where user_name = #{userName}") User selectUserByName(@Param("userName") String username);