0
点赞
收藏
分享

微信扫一扫

SSM之Mybatis注解开发/MyBatis在IDEA中注解开发怎么搞?MyBatis注解怎么用?

写在前面
继续记录自己的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 测试

当运行测试函数时数据库中可看到添加成功,如图![[Pasted image 20220116172708.png]]
当运行删除函数时,结果如图在这里插入图片描述
当运行修改函数时,结果如图![[Pasted image 20220116173542.png]]
当运行查询单个函数时,结果如图![[Pasted image 20220116173946.png]]
当运行查询所有函数时,结果如图![[Pasted image 20220116174112.png]]

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基本操作类似,结果如图![[Pasted image 20220116221614.png]]

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 测试

测试和之前类似,结果如图![[Pasted image 20220117113724.png]]

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 测试

测试和之前类似,结果如图![[Pasted image 20220117131921.png]]

举报

相关推荐

0 条评论