2020-03-21

1.Mybatis多表查询

1.1 一对一查询

1.1.1 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

1.1.2一对一查询的语句

对应的sql语句:select *  from orders o,user u where o.uid=u.id;

查询的结果如下:

1.1.3 创建Order和User实体

publicclassOrder{

privateintid;

privateDateordertime;

privatedoubletotal;

//代表当前订单从属于哪一个客户

privateUseruser;

}

publicclassUser{


privateintid;

privateStringusername;

privateStringpassword;

privateDatebirthday;

}

1.1.4 创建OrderMapper接口

publicinterfaceOrderMapper{

List<Order>findAll();

}

1.1.5 配置OrderMapper.xml

<mappernamespace="com.itheima.mapper.OrderMapper">

<resultMapid="orderMap"type="com.itheima.domain.Order">

<resultcolumn="uid"property="user.id"></result>

<resultcolumn="username"property="user.username"></result>

<resultcolumn="password"property="user.password"></result>

<resultcolumn="birthday"property="user.birthday"></result>

</resultMap>

<selectid="findAll"resultMap="orderMap">

       select * from orders o,user u where o.uid=u.id

</select>

</mapper>

其中<resultMap>还可以配置如下:

<resultMapid="orderMap"type="com.itheima.domain.Order">

<resultproperty="id"column="id"></result>

<resultproperty="ordertime"column="ordertime"></result>

<resultproperty="total"column="total"></result>

<associationproperty="user"javaType="com.itheima.domain.User">

<resultcolumn="uid"property="id"></result>

<resultcolumn="username"property="username"></result>

<resultcolumn="password"property="password"></result>

<resultcolumn="birthday"property="birthday"></result>

</association>

</resultMap>

1.1.6 测试结果

OrderMappermapper=sqlSession.getMapper(OrderMapper.class);

List<Order>all=mapper.findAll();

for(Orderorder:all){

System.out.println(order);

}

1.2 一对多查询

1.2.1 一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单


1.2.2 一对多查询的语句

对应的sql语句:select *,o.id oid from user u left join orders o on u.id=o.uid;

查询的结果如下:

1.2.3 修改User实体

publicclassOrder{

privateintid;

privateDateordertime;

privatedoubletotal;

//代表当前订单从属于哪一个客户

privateUseruser;

}

publicclassUser{


privateintid;

privateStringusername;

privateStringpassword;

privateDatebirthday;

//代表当前用户具备哪些订单

privateList<Order>orderList;

}

1.2.4 创建UserMapper接口

publicinterfaceUserMapper{

List<User>findAll();

}

1.2.5 配置UserMapper.xml

<mappernamespace="com.itheima.mapper.UserMapper">

<resultMapid="userMap"type="com.itheima.domain.User">

<resultcolumn="id"property="id"></result>

<resultcolumn="username"property="username"></result>

<resultcolumn="password"property="password"></result>

<resultcolumn="birthday"property="birthday"></result>

<collectionproperty="orderList"ofType="com.itheima.domain.Order">

<resultcolumn="oid"property="id"></result>

<resultcolumn="ordertime"property="ordertime"></result>

<resultcolumn="total"property="total"></result>

</collection>

</resultMap>

<selectid="findAll"resultMap="userMap">

       select *,o.id oid from user u left join orders o on u.id=o.uid

</select>

</mapper>

1.2.6 测试结果

UserMappermapper=sqlSession.getMapper(UserMapper.class);

List<User>all=mapper.findAll();

for(Useruser:all){

System.out.println(user.getUsername());

List<Order>orderList=user.getOrderList();

for(Orderorder:orderList){

System.out.println(order);

   }

System.out.println("----------------------------------");

}

1.3 多对多查询

1.3.1 多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

1.3.2 多对多查询的语句

对应的sql语句:select u.,r.,r.id rid from user u left join user_role ur on u.id=ur.user_id

inner join role r on ur.role_id=r.id;

查询的结果如下:

1.3.3 创建Role实体,修改User实体

publicclassUser{

privateintid;

privateStringusername;

privateStringpassword;

privateDatebirthday;

//代表当前用户具备哪些订单

privateList<Order>orderList;

//代表当前用户具备哪些角色

privateList<Role>roleList;

}

publicclassRole{

privateintid;

privateStringrolename;

}

1.3.4  添加UserMapper接口方法

List<User>findAllUserAndRole();

1.3.5 配置UserMapper.xml

<resultMapid="userRoleMap"type="com.itheima.domain.User">

<resultcolumn="id"property="id"></result>

<resultcolumn="username"property="username"></result>

<resultcolumn="password"property="password"></result>

<resultcolumn="birthday"property="birthday"></result>

<collectionproperty="roleList"ofType="com.itheima.domain.Role">

<resultcolumn="rid"property="id"></result>

<resultcolumn="rolename"property="rolename"></result>

</collection>

</resultMap>

<selectid="findAllUserAndRole"resultMap="userRoleMap">

   select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_id

   inner join role r on ur.role_id=r.id

</select>

1.3.6 测试结果

UserMappermapper=sqlSession.getMapper(UserMapper.class);

List<User>all=mapper.findAllUserAndRole();

for(Useruser:all){

System.out.println(user.getUsername());

List<Role>roleList=user.getRoleList();

for(Rolerole:roleList){

System.out.println(role);

   }

System.out.println("----------------------------------");

}

1.4 知识小结

MyBatis多表配置方式:

一对一配置:使用<resultMap>做配置

一对多配置:使用<resultMap>+<collection>做配置

多对多配置:使用<resultMap>+<collection>做配置

2.Mybatis的注解开发

2.1 MyBatis的常用注解

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper

映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。

@Insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result 一起使用,封装多个结果集

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

2.2 MyBatis的增删改查

我们完成简单的user表的增删改查的操作

privateUserMapperuserMapper;

@Before

publicvoidbefore()throwsIOException{

InputStreamresourceAsStream=Resources.getResourceAsStream("SqlMapConfig.xml");

SqlSessionFactorysqlSessionFactory=new

SqlSessionFactoryBuilder().build(resourceAsStream);

SqlSessionsqlSession=sqlSessionFactory.openSession(true);

userMapper=sqlSession.getMapper(UserMapper.class);

}

@Test

publicvoidtestAdd() {

Useruser=newUser();

user.setUsername("测试数据");

user.setPassword("123");

user.setBirthday(newDate());

userMapper.add(user);

}

@Test

publicvoidtestUpdate()throwsIOException{

Useruser=newUser();

user.setId(16);

user.setUsername("测试数据修改");

user.setPassword("abc");

user.setBirthday(newDate());

userMapper.update(user);

}

@Test

publicvoidtestDelete()throwsIOException{

userMapper.delete(16);

}

@Test

publicvoidtestFindById()throwsIOException{

Useruser=userMapper.findById(1);

System.out.println(user);

}

@Test

publicvoidtestFindAll()throwsIOException{

List<User>all=userMapper.findAll();

for(Useruser:all){

System.out.println(user);

   }

}

修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可

<mappers>

<!--扫描使用注解的类-->

<mapperclass="com.itheima.mapper.UserMapper"></mapper>

</mappers>

或者指定扫描包含映射关系的接口所在的包也可以

<mappers>

<!--扫描使用注解的类所在的包-->

<packagename="com.itheima.mapper"></package>

</mappers>

2.3 MyBatis的注解实现复杂映射开发

实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

2.4 一对一查询

2.4.1 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

2.4.2 一对一查询的语句

对应的sql语句:

select * from orders;

select * from user where id=查询出订单的uid;

查询的结果如下:

2.4.3 创建Order和User实体

publicclassOrder{

privateintid;

privateDateordertime;

privatedoubletotal;

//代表当前订单从属于哪一个客户

privateUseruser;

}

publicclassUser{


privateintid;

privateStringusername;

privateStringpassword;

privateDatebirthday;

}

2.4.4 创建OrderMapper接口

publicinterfaceOrderMapper{

List<Order>findAll();

}

2.4.5 使用注解配置Mapper

publicinterfaceOrderMapper{

@Select("select * from orders")

@Results({

@Result(id=true,property="id",column="id"),

@Result(property="ordertime",column="ordertime"),

@Result(property="total",column="total"),

@Result(property="user",column="uid",

javaType=User.class,

one=@One(select="com.itheima.mapper.UserMapper.findById"))

   })

List<Order>findAll();

}

publicinterfaceUserMapper{

@Select("select * from user where id=#{id}")

UserfindById(intid);


}

2.4.6 测试结果

@Test

publicvoidtestSelectOrderAndUser() {

List<Order>all=orderMapper.findAll();

for(Orderorder:all){

System.out.println(order);

   }

}

2.5 一对多查询

2.5.1 一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

2.5.2 一对多查询的语句

对应的sql语句:

select * from user;

select * from orders where uid=查询出用户的id;

查询的结果如下:

2.5.3 修改User实体

publicclassOrder{

privateintid;

privateDateordertime;

privatedoubletotal;

//代表当前订单从属于哪一个客户

privateUseruser;

}

publicclassUser{


privateintid;

privateStringusername;

privateStringpassword;

privateDatebirthday;

//代表当前用户具备哪些订单

privateList<Order>orderList;

}

2.5.4 创建UserMapper接口

List<User>findAllUserAndOrder();

2.5.5 使用注解配置Mapper

publicinterfaceUserMapper{

@Select("select * from user")

@Results({

@Result(id=true,property="id",column="id"),

@Result(property="username",column="username"),

@Result(property="password",column="password"),

@Result(property="birthday",column="birthday"),

@Result(property="orderList",column="id",

javaType=List.class,

many=@Many(select="com.itheima.mapper.OrderMapper.findByUid"))

   })

List<User>findAllUserAndOrder();

}

publicinterfaceOrderMapper{

@Select("select * from orders where uid=#{uid}")

List<Order>findByUid(intuid);

}

2.5.6 测试结果

List<User>all=userMapper.findAllUserAndOrder();

for(Useruser:all){

System.out.println(user.getUsername());

List<Order>orderList=user.getOrderList();

for(Orderorder:orderList){

System.out.println(order);

   }

System.out.println("-----------------------------");

}

2.6 多对多查询

2.6.1 多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

2.6.2 多对多查询的语句

对应的sql语句:

select * from user;

select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用户的id

查询的结果如下:

2.6.3 创建Role实体,修改User实体

publicclassUser{

privateintid;

privateStringusername;

privateStringpassword;

privateDatebirthday;

//代表当前用户具备哪些订单

privateList<Order>orderList;

//代表当前用户具备哪些角色

privateList<Role>roleList;

}

publicclassRole{

privateintid;

privateStringrolename;

}

2.6.4 添加UserMapper接口方法

List<User>findAllUserAndRole();

2.6.5 使用注解配置Mapper

publicinterfaceUserMapper{

@Select("select * from user")

@Results({

@Result(id=true,property="id",column="id"),

@Result(property="username",column="username"),

@Result(property="password",column="password"),

@Result(property="birthday",column="birthday"),

@Result(property="roleList",column="id",

javaType=List.class,

many=@Many(select="com.itheima.mapper.RoleMapper.findByUid"))

})

List<User>findAllUserAndRole();}

publicinterfaceRoleMapper{

@Select("select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=#{uid}")

List<Role>findByUid(intuid);

}

2.6.6 测试结果

UserMappermapper=sqlSession.getMapper(UserMapper.class);

List<User>all=mapper.findAllUserAndRole();

for(Useruser:all){

System.out.println(user.getUsername());

List<Role>roleList=user.getRoleList();

for(Rolerole:roleList){

System.out.println(role);

   }

System.out.println("----------------------------------");

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,443评论 0 13
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,371评论 1 14
  • 一、引言 通过动态SQL我们可以进行复杂SQL的编写,但之前的例子都是单表查询,在实际开发中,当然不可能都是单表,...
    零点145阅读 266评论 0 0
  • wyun_guest需要添加的地方 1: oauth_clients需要添加一条记录image.png INSER...
    EddieZhang阅读 660评论 0 0
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11