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)分析
封装的数据有:
- 开始日期:startDate
- 结束日期:endDate
- 地址: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;}
自定义结果
注解 |
描述 |
对象和表的映射关系。 包含@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{ //get/set/toString/有参/无参 } |
Orders类:
public class Orders implements Serializable { //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”)
此篇到此为止
未完待续!!!请留意关注噢!!
请给努力中的自己点个赞哦!
每天进步一点点`~~~~~
来源:oschina
链接:https://my.oschina.net/ithuang/blog/3286564