赞
踩
目录
这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper 映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
- @Insert:实现新增
- @Update:实现更新
- @Delete:实现删除
- @Select:实现查询
- @Result:实现结果集封装
- @Results:可以与@Result 一起使用,封装多个结果集
- @One:实现一对一结果集封装
- @Many:实现一对多结果集封装
- public interface UserMapper {
-
- @Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
- public void save(User user);
-
- @Update("update user set username=#{username},password=#{password} where id=#{id}")
- public void update(User user);
-
- @Delete("delete from user where id=#{id}")
- public void delete(int id);
-
- @Select("select * from user where id=#{id}")
- public User findById(int id);
-
- @Select("select * from user")
- public List<User> findAll();
-
- }
我们完成简单的user表的增删改查的操作:
- private UserMapper userMapper;
- @Before
- public void before() throws IOException {
- InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
- SqlSessionFactory sqlSessionFactory = new
- SqlSessionFactoryBuilder().build(resourceAsStream);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
- userMapper = sqlSession.getMapper(UserMapper.class);
- }
- @Test
- public void testAdd() {
- User user = new User();
- user.setUsername("测试数据");
- user.setPassword("123");
- user.setBirthday(new Date());
- userMapper.add(user);
- }
-
- @Test
- public void testUpdate() throws IOException {
- User user = new User();
- user.setId(16);
- user.setUsername("测试数据修改");
- user.setPassword("abc");
- user.setBirthday(new Date());
- userMapper.update(user);
- }
- @Test
- public void testDelete() throws IOException {
- userMapper.delete(16);
- }
-
- @Test
- public void testFindById() throws IOException {
- User user = userMapper.findById(1);
- System.out.println(user);
- }
-
- @Test
- public void testFindAll() throws IOException {
- List<User> all = userMapper.findAll();
- for(User user : all){
- System.out.println(user);
- }
- }
修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可
- <mappers>
- <!--扫描使用注解的类-->
- <mapper class="com.itheima.mapper.UserMapper"></mapper>
- </mappers>
或者指定扫描包含映射关系的接口所在的包也可以
- <mappers>
- <!--扫描使用注解的类所在的包-->
- <package name="com.itheima.mapper"></package>
- </mappers>
- 实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>来实现,
- 使用注解开发后,我们可以使用@Results注解,
- @Result注解,@One注解,@Many注解组合完成复杂关系的配置
1. 一对一查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的
需求:查询一个订单,与此同时查询出该订单所属的用户
2. 一对一查询的语句
对应的sql语句:
select * from orders;
select * from user where id=查询出订单的uid;
查询的结果如下:
3. 创建Order和User实体
4. 创建OrderMapper接口
- public interface OrderMapper {
- List<Order> findAll();
- }
5. 使用注解配置Mapper
6. 测试结果
- @Test
- public void testSelectOrderAndUser() {
- List<Order> all = orderMapper.findAll();
- for(Order order : all){
- System.out.println(order);
- }
- }
1. 一对多查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对多查询的
需求:查询一个用户,与此同时查询出该用户具有的订单
2. 一对多查询的语句
对应的sql语句:
select * from user;
select * from orders where uid=查询出用户的id;
查询的结果如下:
3. 修改User实体
4. 创建UserMapper接口
List<User> findAllUserAndOrder();
5. 使用注解配置Mapper
6. 测试结果
- List<User> all = userMapper.findAllUserAndOrder();
- for(User user : all){
- System.out.println(user.getUsername());
- List<Order> orderList = user.getOrderList();
- for(Order order : orderList){
- System.out.println(order);
- }
- System.out.println("-----------------------------");
- }
1. 多对多查询的模型
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用 多对多查询的
需求:查询用户同时查询出该用户的所有角色
2. 多对多查询的语句
对应的sql语句:
select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用户的id
查询的结果如下:
3. 创建Role实体,修改User实体
4. 添加UserMapper接口方法
List<User> findAllUserAndRole();
5. 使用注解配置Mapper
6. 测试结果
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- List<User> all = mapper.findAllUserAndRole();
- for(User user : all){
- System.out.println(user.getUsername());
- List<Role> roleList = user.getRoleList();
- for(Role role : roleList){
- System.out.println(role);
- }
- System.out.println("----------------------------------");
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。