带你快速进阶一直那么火的_Mybatis技术(三)

China☆狼群 提交于 2020-04-22 06:03:55

Mybatis(三)

一.MyBatis-POJO

1.简述及和JavaBean区别

例如:User类中有birthday生日,查询条件中却有“开始时间”和“结束时间”

 

为了业务,为了封装新数据,创建一个新JavaBean对象:POJO对象

JavaBean:封装数据 / 可以替service分担一些业务代码

POJO:简单JavaBean,仅用作封装数据

 

举例说明:

(1)需求说明

查询 生日在“2019-02-01” 至 “2020-02-01”,并且地址“潘多拉”

SELECT * FROM USER WHERE birthday BETWEEN '2019-02-01' AND '2020-02-01' AND address='潘多拉';

 

(2)分析

封装的数据有:

  1. 开始日期:startDate
  2. 结束日期:endDate
  3. 地址:address

 

创建一个新的JavaBean-POJO:包含User对象

 

(3)代码实现

UserVo: (POJO)

public class UserVo implements Serializable {
    //包含之前JavaBean的对象
    private User user;
    private String startDate;
    private String endDate;

    //get/set/有参/无参/toString

}

测试类:

/**
 * 查询 生日在“2019-02-01” 至 “2020-02-01”,并且地址“潘多拉”
 SELECT * FROM USER WHERE birthday BETWEEN '2019-02-01' AND '2020-02-01' AND address='潘多拉';
 */
@Test
public void run2(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao对象
    User user = new User();
    user.setAddress("潘多拉");
    UserVo userVo = new UserVo(user, "2019-02-01", "2020-02-01");
    List<User> ulist = dao.selectUlistByPojo(userVo);
    System.out.println(ulist);
    //3、关闭会话
    MyBatisUtils.close();
}

 

UserDao:

@Select("SELECT * FROM USER WHERE birthday BETWEEN #{startDate} AND #{endDate} AND address=#{user.address};")
List<User> selectUlistByPojo(UserVo userVo);

 

小结:

POJO定义时,必须包含之前JavaBean的对象

 

 

二. MyBatis-字段自定义填充【重点】

准备代码:

Person:

public class Person implements Serializable{
        private Integer uid;
        private String username;
        private String uname;
        private Date birthday;
        private String sex;
        private String address;

}

 

自定义结果

注解

描述

@Results

对象和表的映射关系。  包含@Result

@Result

一个对象属性和一个表的字段的映射关系。

测试类:

/**
 * 自定义填充字段
 * username和uname成员变量, 都填充MySQL数据库 user表 username数据
 */
@Test
public void run3(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao对象
    List<Person> plist = dao.selectPlist();
    System.out.println(plist);
    //3、关闭会话
    MyBatisUtils.close();
}

UserDao:

/**
 * 通过 result注解,设置username同时为uname和username作填充
 * @return
 */
@Select("select * from user")
@Results({
        @Result(property = "uname",column = "username"),
        @Result(property = "username",column = "username")
})
List<Person> selectPlist();

 

小结:

Property: JavaBean哪个成员变量

Column:MySQL表中的哪个字段

 

如果填充了字段,默认填充就会失效

 

 

三.​​​​​​​ MyBatis-一对多

(1)​​​​​​​环境搭建

1、创建数据库

 

2、导入jar包和核心配置文件

3、创建package包

4、定义JavaBean

User类:

public class User implements Serializable{
    private Integer uid;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    //get/set/toString/有参/无参

}

 

Orders类:

public class Orders implements Serializable {
    private Integer oid;
    private Integer user_id;//外键
    private String number;
    private Date createtime;
    private String note;

    //get/set/toString/有参/无参

}

 

5、修改JavaBean,体现JavaBean之间的关系

User类:

public class User implements Serializable{
    private Integer uid;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //一个用户有多个订单 --- 不要加入到toString,有参构造
    private List<Orders> olist = new ArrayList<Orders>();

    public List<Orders> getOlist() {
        return olist;
    }

    public void setOlist(List<Orders> olist) {
        this.olist = olist;
    }

 

Orders类

public class Orders implements Serializable {
    private Integer oid;
    private Integer user_id;//外键
    private String number;
    private Date createtime;
    private String note;

    //一个订单属于某一个用户----不要加入toString和有参构造
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

 

5、定义Dao & 注册Dao

 

 

 

(2)环境搭建-小结【重点】

小结:

JavaBean定义时,先根据建表语句字段,确定成员变量。

所有JavaBean定义完毕时,再体现JavaBean关系:

A类中,  一个A包含多个B:  

 private List<B> blist = new ArrayList<B>();

A类中,  一个A包含一个B:   

private B b;

注意:这些关系成员变量,不能体现在toString和有参构造中

 

 

 

(3)​​​​​​​案例:根据ID查询某用户的信息和其订单信息

1.流程图

 

2.代码实现-初步

测试类:

/**
 * 根据ID查询该用户信息,及该用户所有订单信息
 */
@Test
public void run1(){
    //1、获取Dao对象
    OrdersDao dao = MyBatisUtils.getMapper(OrdersDao.class);
    //2、根据UID查询该用户信息
    User user = dao.selectUserByUid(1);
    System.out.println(user);
    System.out.println("-----------------------------------");
    //3、根据UID查询该用户所有订单信息
    List<Orders> olist =  dao.selectOlistByUid(1);
    for (Orders orders : olist) {
        System.out.println(orders);
    }
    //4、关闭会话
    MyBatisUtils.close();
}

 

OrdersDao:

/**
 * 根据UID查询某个用户信息
 * @param i  uid
 * @return   查询到的用户信息
 */
@Select("select * from user where uid=#{uid}")
User selectUserByUid(@Param("uid")int i);

/**
 * 通过UID查询某个用户的所有的订单信息
 * @param i  uid
 * @return   查询到所有的订单信息
 */
@Select("select * from orders where user_id=#{user_id}")
List<Orders> selectOlistByUid(@Param("user_id") int i);

 

3.代码实现

测试类:

/**
 * 根据ID查询该用户信息,及该用户所有订单信息
 */
@Test
public void run1(){
    //1、获取Dao对象
    OrdersDao dao = MyBatisUtils.getMapper(OrdersDao.class);
    //2、根据UID查询该用户信息
    User user = dao.selectUserByUid(1);
    System.out.println(user);
    System.out.println(user.getOlist());
    System.out.println("-----------------------------------");
    //3、根据UID查询该用户所有订单信息
    List<Orders> olist =  dao.selectOlistByUid(1);
    for (Orders orders : olist) {
        System.out.println(orders);
        System.out.println(orders.getUser());
    }
    //4、关闭会话
    MyBatisUtils.close();
}

 

OrdersDao:

/**
 * 根据UID查询某个用户信息
 * @param i  uid
 * @return   查询到的用户信息
 *
 * 使用Result注解,为olist填充数据:
 *     使用Many注解,单独为olist的填充开启一个子查询,子查询需要参数,使用column为子查询填充参数
 *     子查询结束,会把多条数据填充给olist
 *
 *
 */
@Select("select * from user where uid=#{uid}")
@Results({
        @Result(property = "olist",column = "uid",many=@Many(select="com.czxy.orders.dao.OrdersDao.selectOlistByUid")),
        @Result(property = "uid",column = "uid")
})
User selectUserByUid(@Param("uid")int i);

/**
 * 通过UID查询某个用户的所有的订单信息
 * @param i  uid
 * @return   查询到所有的订单信息
 */
@Select("select * from orders where user_id=#{user_id}")
List<Orders> selectOlistByUid(@Param("user_id") int i);

 

一对多小结

MyBatis中可以写一条连接语句进行多表查询

MyBatis中可以使用子查询进行一对多 多表查询

 

 

​​​​​​​总结

注解

说明

@Results

对象和表的映射关系。

常用写法:

@Results(value={})

@Results(id=””,value={})

@Result

一个对象属性和一个表的字段的映射关系。

写在@Results的value数组中

常用写法:

@Result(property=””,column=””)

@One

为单独实体对象设置数据填充。

例如:填充订单中的user对象

常用写法:

@One(select=””)

@Many

为集合设置数据填充。

例如:填充用户中的olist集合

常用写法:

@Many(select=””)

@ResultMap

使用已有的“对象和表映射”

例如:

@Results(id=”s1”,value={})

 

@ResultMap(“s1”)

ResultMap的使用:

@Select("select * from user where uid=#{uid}")
@Results(id="r1",
        value={
        @Result(property = "olist",column = "uid",many=@Many(select="com.czxy.orders.dao.OrdersDao.selectOlistByUid")),
        @Result(property = "uid",column = "uid")
})
User selectUserByUid(@Param("uid")int i);

 

@Select("select * from user")
@ResultMap("r1")
List<User> selectUlist();

 

小结:

POJO和JavaBean:

POJO:简单JavaBean,仅用作数据封装

JavaBean:数据封装 /  替service分担业务代码

 

POJO:至少要包含之前JavaBean对象

 

一对多:

JavaBean创建顺序:

先分别根据建表语句定义JavaBean

再修改JavaBean,确定关系:

A类中,A包含多个B:private List<B> blist = new ArrayList<B>();

A类中,A包含一个B:private B b;

注意:关系字段,不要加入toString()

 

@Results(id=”x1”,value={

@Result(property=””,column=””)

})

property:待填充JavaBean属性

column:MySQL的列名

 

@Result

@Many   开启子查询

@One    开启子查询

@ResultMap(“x1”)

 

 

 

此篇到此为止

未完待续!!!请留意关注噢!!

请给努力中的自己点个赞哦!

每天进步一点点`~~~~~

​​​​​​​

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!