基于注解实现多表查询
当数据库表中的属性和实体类属性名不一致时
单表查询
比如在这里,实体类属性为
private Integer userid;
private String userName;
private String userAddress;
private String userSex;
private Date userBirthday;
与数据库表属性不一致
那么我们可以在IUserDao中使用@Results和@Result注解
// 查询所有用户
@Select("select * from user")
/**
* @Results中的id是一个唯一标识,在别的地方也能用
* @Result中
* id是boolean类型,默认为false,如果此属性是id字段,设置为true
* column是数据库表中的属性,property是实体类中的属性名
*/
@Results(id = "userMap",value = {
@Result(id = true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "address",property = "userAddress"),
@Result(column = "sex",property = "userSex"),
@Result(column = "birthday",property = "userBirthday")
})
List<User> findAll();
多表查询
一对一查询
每个账户只属于一个用户
这里有account表
private Integer id;
private Integer uid;
private Double money;
// 多对一(mybatis中称之为一对一)的映射,一个账户只能属于一个用户
private User user;
在IAccountDao中
// 查询所有账户,并且获取每个账户所属的用户信息
@Select("select * from account")
@Results(id = "accountMap",value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
/**
* property是要封装的实体类Account中的user属性,column代表用account表的uid去查user表
* @One注解代表一对一
* select代表全限定方法名,fetchType代表加载方式,eager是立即加载,lazy是延迟加载
* 一对一通常是立即加载
*/
@Result(property = "user",column = "uid",
one = @One(select = "com.itheima.dao.IUserDao.findById",
fetchType = FetchType.EAGER))
})
List<Account> findAll();
// 根据用户id查询账户信息(在查询用户时,顺便查出账户)
@Select("select * from account where uid = #{userId}")
List<Account> findAccountByUid(Integer userId);
一对多查询
每个用户可以有多个账户
这里有user表
private Integer userId;
private String userName;
private String userAddress;
private String userSex;
private Date userBirthday;
// 一对多关系映射,一个用户对应多个账户
private List<Account> accounts;
在IUserDao中
// 查询所有用户
@Select("select * from user")
/**
* @Results中的id是一个唯一标识,在别的地方也能用
* @Result中
* id是boolean类型,默认为false,如果此属性是id字段,设置为true
* column是数据库表中的属性,property是实体类中的属性名
*/
@Results(id = "userMap",value = {
@Result(id = true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "address",property = "userAddress"),
@Result(column = "sex",property = "userSex"),
@Result(column = "birthday",property = "userBirthday"),
/**
* property是实体类User中的accounts属性,column代表用user表的id去查account表
* @Many注解代表一对多
* select代表全限定方法名,fetchType代表加载方式,eager是立即加载,lazy是延迟加载
* 一对多通常是延迟加载
*/
@Result(property = "accounts",column = "id",
many = @Many(select = "com.itheima.dao.IAccountDao.findAccountByUid",
fetchType = FetchType.LAZY))
})
List<User> findAll();
// 根据id查询用户(查询账户时,顺便查出用户)
@Select("select * from user where id = #{id} ")
@ResultMap(value = {"userMap"})
User findById(Integer userId);