Mybatis注解学习
1、MyBatis的常用注解
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
2、注解的属性说明和使用格式
@Results
代替的是标签<resultMap>该注解中可以使用单个@Result注解,也可以使用@Result集合。使用格式:@Results({@Result(),@Result()})或@Results(@Result()
@Result
代替了<id>标签和<result>标签
@Result中属性介绍:
column:数据库的列名
property:需要装配的属性名
one:需要使用的@One 注解(@Result(one=@One)()))
many:需要使用的@Many 注解(@Result(many=@many)()))
@One
代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One注解属性介绍:
select: 指定用来多表查询的 sqlmapper
使用格式:@Result(column=" ",property="",one=@One(select=""))
@Many
代替了<collection>标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。
使用格式:@Result(property="",column="",many=@Many(select=""))
3、简单CRUD注解实现(pojo与上一篇Mybatis xml实现相同)
/**
* 增加用户
* @param user
*/
@Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
public void save(User user);
/**
* 修改用户
* @param user
*/
@Update("update user set username=#{username},password=#{password} where id=#{id}")
public void update(User user);
/**
* 根据用户id删除用户
* @param id
*/
@Delete("delete from user where id=#{id}")
public void delete(@Param("id") int id);
/**
* 根据用户id查询用户
* @param id
* @return
*/
@Select("select * from user where id=#{id}")
public User findById(int id);
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
public List<User> findAll();
4、复杂查询(注解的复杂查询就是将sql语句分段,将第一段的结果的部分属性当下一次查询的条件)
(1)、一对一查询
/**
* 查询所有订单及其对应的用户信息
* @return
*/
@Select("select * from orders")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(
property = "user",
column = "uid",
one = @One(select = "com.bienan.mapper.UserMapper.findById")//一对一查询
)
})
public List<Order> OrderAndUser();
(2)、一对多查询
/**
* 查询用户及其对应的订单 一对多
* @return
*/
@Select("select * from user")
@Results({
@Result(column = "username",property ="username" ),
@Result(column = "password",property = "password"),
@Result(
property ="orderList", //需要装配的属性名
column = "id",//数据库的列名,也是要传递的参数
many=@Many(select = "com.bienan.mapper.OrderMapper.findOrderByUid")//引用OrderMapper.findOrderByUid
)
})
public List<User> findUserAndOrderAll();
(3)、多对多查询(多对多查询要关联三张表)
@Select("select * from user")
public List<User> findAll();
/**
* 查询用户角色信息 多对多
* @return
*/
@Select("select * from user")
@Results({
@Result(id = true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(
property = "roleList",//需要装配的属性名
column = "id",//数据库的列名,也是要传递的参数
many = @Many(select = "com.bienan.mapper.RoleMapper.findRoleByUid")//引用RoleMapper.findRoleByUid
)
})
public List<User> findUserAndRoleAll();
5、修改MyBatis的核心配置文件(使用注解替代了映射文件,所以我们只需要加载使用了注解的Mapper接口即可)
<mappers>
<!--扫描使用注解的类-->
<mapper class="com.itheima.mapper.UserMapper"></mapper>
</mappers>
改为
<mappers>
<!--扫描使用注解的类所在的包-->
<package name="com.itheima.mapper"></package>
</mappers>
6、测试文件
public class MybatisUserTest {
private UserMapper userMapper;
private OrderMapper orderMapper;
@Before
public void init() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true); //true为自动提交事务
userMapper = sqlSession.getMapper(UserMapper.class);
orderMapper=sqlSession.getMapper(OrderMapper.class);
}
@Test
public void queryOrder() {
List<User> userAndOrderAll = userMapper.findUserAndOrderAll();
for (User user : userAndOrderAll) {
System.out.println(user);
}
}
@Test
public void queryOrderAndUser(){
List<Order> orders = orderMapper.OrderAndUser();
for (Order order : orders) {
System.out.println(order);
}
}
}