写在前面:
继续记录自己的MyBatis学习之旅,若看不懂则建议先看前几篇博客,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!
3.11 注解开发
3.11.1 注解
MyBatis也可以用注解来开发,目的可以减少编写Mapper映射文件。常用注解有以下几种:
注解 | 说明 |
---|---|
@Insert | 实现新增 |
@Update | 实现更新 |
@Delete | 实现删除 |
@Select | 实现查询 |
@Result | 实现结果集封装 |
@Results | 与@Result并用,实现多个结果集 |
@One | 实现一对一结果封装 |
@Many | 实现一对多结果封装 |
3.11.2 项目准备
和#### 3.10.1.2 项目准备一样,只不过不用再配置UserMapper及OrderMapper.xml文件!
3.11.3 代码实现基本CURD
3.11.3.1 创建UserMapper接口
创建UserMapper接口类,里面写入CURD函数,并添加注解,如下:
@Select("select * from user")
List<User> findAll();
@Select("select * from user where id = #{id}")
User findById(int id);
@Insert("insert into user (id,name,password) values(#{id},#{name},#{password})")
int insert(User user);
@Update("update user set name = #{name},password = #{password} where id = #{id}")
int update(User user);
@Delete("delete from user where id = #{id}")
int delete(int id);
3.11.3.2 添加映射关系
在SqlMapperConfig.xml中添加接口注解的映射关系,如下:
<!-- 加载映射关系-->
<mappers>
<!-- 指定接口所在包-->
<package name="com.demo.mapper"/>
</mappers>
3.11.3.3 编写测试类
在测试类中编写测试代码,包括简单的增删改查操作,如下:
private UserMapper userMapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sessionFactory.openSession(true);
userMapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void testInsert()
{
User user = new User();
user.setId(7);
user.setName("王三");
user.setPassword("adada");
userMapper.insert(user);
}
@Test
public void testDelete()
{
userMapper.delete(6);
}
@Test
public void testUpdate()
{
User user = new User();
user.setId(7);
user.setName("王六");
user.setPassword("qwerqr");
userMapper.update(user);
}
@Test
public void testSelectAll()
{
List<User> userMapperAll = userMapper.findAll();
for (User user:userMapperAll) {
System.out.println(user);
}
}
@Test
public void testSelect()
{
User user = userMapper.findById(1);
System.out.println(user);
}
3.11.1.3.4 测试
当运行测试函数时数据库中可看到添加成功,如图
当运行删除函数时,结果如图
当运行修改函数时,结果如图
当运行查询单个函数时,结果如图
当运行查询所有函数时,结果如图
3.11.4 复杂映射开发
3.11.4.1 实现复杂映射关系开发
不用注解一般在映射文件中通过配置<resultMap>
来进行实现,用注解后可以使用以下注解来实现复杂关系的配置。
注解 | 说明 |
---|---|
@Results | 代替的是标签<ResultMap> ,该注解中可以使用单个@Result或@Result集合。使用格式:@Result({@Result(),@Result()})或 |
Result | 代替了<id> 标签和<result> 标签; @Result中属性介绍:column:数据库列名;property:实体类中的属性名;one:需要使用的@One注解(@Result(one = @One() ));many:需要使用的@Many注解(@Result (many = @Many) () ) |
3.11.4.2 代码操作实现一对一
3.11.4.2.1 接口操作
在OrderMapper接口中编写功能函数及注解,如下:
// 方法一
// @Select("select *,o.id oid from orders o,user u where o.uid = u.id")
// @Results(
// { @Result(column = "oid",property = "id"),
// @Result(column = "ordertime",property = "orderTime"),
// @Result(column = "total",property = "total"),
// @Result(column = "uid",property = "user.id"),
// @Result(column = "name",property = "user.name"),
// @Result(column = "password",property = "user.password"),
// @Result(column = "birthday",property = "user.birthday")}
// )
// 方法二
@Select("select * from orders")
@Results(
{
@Result(column = "oid",property = "id"),
@Result(column = "ordertime",property = "orderTime"),
@Result(column = "total",property = "total"),
@Result(
// 要封装的实体类型
javaType = User.class,
// 封装属性名
property = "user",
// 根据这个字段来进行查询user表的数据
column = "uid",
// Select属性,代表查询那个接口的方法获得数据
one = @One(select="com.demo.mapper.UserMapper.findById")
)
}
)
List<Order> findAll();
3.11.4.2.2测试
测试和CURD基本操作类似,结果如图
3.11.4.3 代码实现一对多
3.11.4.3.1 接口操作
在OrderMapper接口中编写根据Id查找函数,如下:
@Select("select * from orders where uid = #{uid}")
Order findByUid(int id);
在UserMapper接口中编写一对多查询函数,如下:
@Select("select * from user")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "password",property = "password"),
@Result(column = "birthday",property = "birthday"),
@Result(
property = "userOrders",
column = "id",
javaType = List.class,
many = @Many(select = "com.demo.mapper.OrderMapper.findByUid")
)
})
List<User> findAllUserOrders();
3.11.4.3.2 测试
测试和之前类似,结果如图
3.11.4.4 代码实现多对多
3.11.4.4.1 接口操作
创建RoleMapper接口,其中写入根据Id查找函数,如下:
@Select("select * from user_role ur,role r where ur.role_id=r.id and ur.user_id = #{id}")
List<Role> findByUid(int id);
在UserMapper接口加入多对多查询函数,如下:
@Select("select * from user")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "password",property = "password"),
@Result(
property = "roleList",
javaType = List.class,
column = "id",
many = @Many(select = "com.demo.mapper.RoleMapper.findByUid")
)
})
List<User> findAllUserAndRole();
3.11.4.4.2 测试
测试和之前类似,结果如图