MyBatis3——多表操作的xml配置和注解开发

MyBatis多表操作

  1. 一对一配置 : 使用< resultMap >配置
  2. 一对多配置 : 使用< resultMap > + < collection >做配置
  3. 多对多配置 : 使用< resultMap > + < collection >做配置

一对一配置 :

OrderMapping.xml 中的配置 :

<mapper namespace="mybatis.mapper.OrderMapper">
    <resultMap id="orderMap" type="order">

        <id column="oid" property="id"/>







        <association property="user" javaType="user">
            <id column="uid" property="id"/>
            <result column="username" property="username"/>
            <result column="password" property="password"/>
        association>
    resultMap>

    <select id="findAll" resultMap="orderMap">
        SELECT *,o.id oid FROM orders o,user1 u WHERE o.`uid`=u.`id`
    select>

测试的代码 :

  @Test
    public void test3() throws IOException {
     
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = build.openSession();
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        List<Order> all = mapper.findAll();
        for(Order uk:all){
     
            System.out.println(uk);
        }

    }

一对多的配置 :

UserMapping.xml 中的配置 :

<mapper namespace="mybatis.mapper.UserMapper">
    <resultMap id="userMap" type="user">
        <id column="uid" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>

        <collection property="orderList" ofType="order">
            <id column="oid" property="id"/>
            <result column="ordertime" property="ordertime"/>
            <result column="total" property="total"/>
        collection>
    resultMap>

    <select id="findAll" resultMap="userMap">
        select *,o.id oid from user u,orders o where u.id=o.uid
    select>
mapper>

测试使用的代码 :

 @Test
    public void test2() throws IOException {
     
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = build.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);


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

    }

多对多的配置 :

UserMapping.xml 中的配置 :

<mapper namespace="mybatis.mapper.UserMapper">
    <resultMap id="userRoleMap" type="user">

        <id column="userId" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>

        <collection property="roleList" ofType="role">
            <id column="roleId" property="id"/>
            <result column="roleName" property="roleName"/>
            <result column="roleDesc" property="roleDesc"/>
        collection>
    resultMap>
    <select id="findRole" resultMap="userRoleMap">
        SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userid AND ur.roleid=r.id
    select>
mapper>

测试使用的代码 :

 @Test
    public void test1() throws IOException {
     
        //获得核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得session工厂对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得session会话对象
        SqlSession sqlSession = build.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);


        List<User> all = mapper.findRole();
        for(User uk:all){
     
            System.out.println(uk);
        }

    }

MyBatis的注解开发

  1. MyBatis的常用注解开发
    • @insert : 实现新增
    • @Update : 实现更新
    • @Delete : 实现删除
    • @Select : 实现查询
    • @Result : 实现结果集封装
    • @Results : 可以与@Result一起使用,封装多个结果集
    • @One : 实现一对一结果集封装
    • @Many : 实现一对多结果集封装

UserMapper接口中的注解使用

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

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

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

sqlMapConfig.xml 中的配置 :


    <mappers>
        <package name="mybatis.mapper">package>
    mappers>
    
  1. 实现复杂查询 : @Result 和 @Results

一对一查询 :

Order实体的成员变量:

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

OrderMapper.java 一个接口类:

public interface 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 = "username",property = "user.username"),
//            @Result(column = "password",property = "user.password")
//    })
//    public List findAll();

    @Select("select * from orders")
    @Results({
     
            @Result(column = "oid",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(
                    property = "user",//要封装的属性名称
                    column = "uid",//根据那个字段去查询user表的数据
                    javaType = User.class, //要封装的实体类型
                    one = @One(select = "mybatis.mapper.UserMapper.select")
            )
    })
    public List<Order> findAll();
}

测试类:

public class MyBatisTest2 {
     
    private OrderMapper mapper;
    @Before
    public void before() throws IOException {
     
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }
    @Test
    public void test(){
     
        List<Order> all = mapper.findAll();
        System.out.println(all);
    }
}

一对多查询 :

User实体成员变量:

public class User {
     
    private int id;
    private String username;
    private String password;

    //描述当前用户具有的订单
    private List<Order> orderList;
}

UserMapper.java 接口:

    @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",
                    column = "id",
                    javaType = List.class,
                    many = @Many(select = "mybatis.mapper.OrderMapper.findByUid")
            )
})
    public List<User> findRall();

OrderMapper.java接口:

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

测试类 :

public class MyBatisTest2 {
     
    private OrderMapper mapper;
    @Before
    public void before() throws IOException {
     
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }
    @Test
    public void test(){
     
        List<Order> all = mapper.findAll();
        System.out.println(all);
    }
}

多对多查询:

User实体中的数据成员 :

public class User {
     
    private int id;
    private String username;
    private String password;

//    //描述当前用户具有的订单
//    private List orderList;
    private List<Role> rolelist;
}

新建一个RoleMapper接口类 :

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> findByRId(int uid);
}

UserMapper接口中的实现 :

    @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",
                    javaType = List.class,
                    many =@Many(select = "mybatis.mapper.RoleMapper.findByRId")
            )
    })
    public List<User> findURall();

测试类 :

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

   }
   
    @Test
    public void test(){
     
        List<User> rall = mapper.findURall();
        for (User uk:rall){
     
            System.out.println(uk);
        }
    }
}

你可能感兴趣的:(MyBatis,mybatis,java)