MyBatis的注解开发


前言

使用注解开发的方式,可以减少编写映射文件的步骤,从而使得开发步骤更加简洁。本文将对mybatis框架的注解开发方式进行相关描述。


一、利用注解开发方式完成对数据库的基本操作

使用注解方式完成数据库的增、删、改、查操作。

1.mybatis的常用注解
在这里插入图片描述
2.注解开发步骤
1).创建数据表
2).创建数据表对应的实体
3).创建Dao层接口,并完成相关方法及注解的编写
4).编写核心文件,需要加载映射关系
5).编写测试类进行测试

1).创建数据表user
在这里插入图片描述
2).创建数据表对应的实体

package com.itheima.domain;

public class User {
    private int id;
    private String username;
    private String password;
    //省略get、set方法
}

3).创建Dao层接口,并完成相关方法及注解的编写

package com.itheima.mapper;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserMapper {

    @Select(" select * from user1")
    public List<User> findAll();

    @Insert("insert into user1 values(#{id},#{username},#{password})")
    public void add(User user);

    @Update("update user1 set username=#{username},password=#{password} where id=#{id}")
    public void update(User user);

    @Delete("delete from user1 where id=#{id}")
    public void delete(int i);

    @Select(" select * from user1 where id=#{id}")
    public User findById(int i);

}

4).编写核心文件,需要加载映射关系
与使用映射文件方式相同,不同的是不再加载映射文件,而是加载映射关系。

 <mappers>
    <!--   指定接口所在的包     -->
        <package name="com.itheima.mapper"/>
    </mappers>

5).编写测试类进行测试

public class MyBatisTest {

    private UserMapper mapper;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void test1() throws IOException {

        List<User> userList = mapper.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
    }

    @Test
    public void testAdd() throws IOException {
        User a = new User();
        a.setUsername("小李");
        a.setPassword("dddd");

         mapper.add(a);
        List<User> userList = mapper.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
    }

    @Test
    public void testUpdate() throws IOException {
        User a = new User();
        a.setId(5);
        a.setUsername("小高");
        a.setPassword("5523");

        mapper.update(a);
        List<User> userList = mapper.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
    }

    @Test
    public void testDelete() throws IOException {
      /*  User a = new User();
        a.setId(5);
        a.setUsername("小高");
        a.setPassword("5523");*/

        int id = 6;
        mapper.delete(id);
        List<User> userList = mapper.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
    }

    @Test
    public void testFindById() throws IOException {
       /* User a = new User();
        a.setId(5);
        a.setUsername("小高");
        a.setPassword("5523");*/

        int id = 1;
        User id1 = mapper.findById(id);
        System.out.println(id1);
        /*List<User> userList = mapper.findAll();
        for (User user : userList) {
            System.out.println(user);
        }*/
    }

}

二、多表操作

MyBatis的注解实现复杂映射开发:
在这里插入图片描述
在这里插入图片描述

1.一对一

user表中的一个对象对应多个order对象,
一个order对象对应一个user对象。
1.建立数据表
主表user:
在这里插入图片描述
从表orders:
在这里插入图片描述
2.建立实体类
user类:

package com.itheima.domain;

import java.util.List;

public class User {
    private int id;
    private String username;
    private  String password;
//省略get、set方法

Order类:

package com.itheima.domain;

import java.util.Date;

public class Order {
    private int id;
    private Date ordertime;
    private double total;
    private User user;

其中private User user 为orders的外键uid对应的实体对象。
3、创建Dao层接口,并完成相关方法及注解的编写

package com.itheima.mapper;

import com.itheima.domain.Order;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface OrderMapper {
   /* //方法一:一次查询,两张表一起
    @Select("select * ,o.id oid from orders o,user u where u.id = o.uid")
    @Results({
            @Result(column = "oid" ,property = "id"),
            @Result(column = "ordertime" ,property = "ordertime"),
            @Result(column = "total" ,property = "total"),
            @Result(column = "uid" ,property = "user.id"),
            @Result(column = "username" ,property = "user.username"),
            @Result(column = "password" ,property = "user.password"),
    })*/

    //方法二:分两次查询,第一次查orders,然后利用uid来查user(调用user接口的方法来查询)
    @Select("select *  from orders ")
    @Results({
            @Result(column = "id" ,property = "id"),
            @Result(column = "ordertime" ,property = "ordertime"),
            @Result(column = "total" ,property = "total"),
            @Result(
                    property = "user",//要封装的实体属性的名称,即Order中的private User user
                    column = "uid", //要根据哪个字段去查询user表的数据
                    javaType = User.class ,//要封装的实体类型,即结果的类型
                    //select属性,代表调用哪个接口的方法来获得数据
                     one=@One(select = "com.itheima.mapper.UserMapper.findById")
            )
    })
    public List<Order> findAll();

    @Select("select * from orders where uid=#{uid}")
    public List<Order> findByUid(int i);

}

4.编写测试方法

package com.itheima.tset;

import com.itheima.domain.Order;
import com.itheima.domain.User;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest1 {

    private OrderMapper mapper;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }

    @Test
    public void test1() throws IOException {

        List<Order> all = mapper.findAll();
        for (Order order : all) {
            System.out.println(order);
        }
    }
}

2.一对多

查询一个user对象,对应多个order对象
创建Dao层接口,并完成相关方法及注解的编写

@Select("select * from user")
    @Results({
            @Result( id = true ,column = "id",property = "id"),//代表主键
            @Result(column = "username",property = "username"),
            @Result(column = "password",property = "password"),
            @Result(
                    property = "orderList",//封装的实体属性的名称,即User中的private List<Order> orderList
                    column = "id",//要根据哪个字段去查询order表的数据
                    javaType = List.class,//要封装的实体类型,即结果的类型,结果为集合
                    //select属性,代表调用哪个接口的方法来获得数据
                    many = @Many(select = "com.itheima.mapper.OrderMapper.findByUid")
            )
    })
    public List<User> findUserAndOrderAll();

编写测试方法

package com.itheima.tset;

import com.itheima.domain.Order;
import com.itheima.domain.User;
import com.itheima.mapper.OrderMapper;
import com.itheima.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest2 {

    private UserMapper mapper;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void test1() throws IOException {

        List<User> userAndOrderAll = mapper.findUserAndOrderAll();
        for (User user : userAndOrderAll) {
            System.out.println(user);
        }
    }
}

3.多对多

1.建立数据表
数据表之间的多对多关系,需要借助中间表来实现。
已经有两个表,user和sys_role之间存在多对多关系,建立中间表sys_user_role,表中有两个外键:userId和orderId分别指向表user和sys_role.
表:sys_role
在这里插入图片描述
中间表:sys_user_role
在这里插入图片描述

2.建立实体类
Role类:

public class Role {
    private int id;
    private String roleName;
    private String roleDesc;

User类:

public class User {
    private int id;
    private String username;
    private  String password;
    private List<Role> roleList;

3.创建Dao层接口,并完成相关方法及注解的编写

 @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",//要封装的实体属性的名称,即User中的private List<Role> roleList
                    column = "id",//要根据哪个字段去查询role表的数据
                    javaType = List.class,//要封装的实体类型,即结果的类型,结果为集合
                    //select属性,代表调用哪个接口的方法来获得数据
                    many = @Many(select = "com.itheima.mapper.RoleMapper.findByUid")
            )
    })
    public List<User> findUserAndRoleAll();
public interface RoleMapper {

    @Select("select * from sys_user_role ur,sys_role r where ur.roleId = r.id and ur.userId = #{uid}")
    public List<Role> findByUid(int uid);
}

4.编写测试方法

package com.itheima.tset;

import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest3 {

    private UserMapper mapper;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void test1() throws IOException {

        List<User> userAndRoleAll = mapper.findUserAndRoleAll();
        for (User user : userAndRoleAll) {
            System.out.println(user);
        }
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值