美文网首页
2020-03-21

2020-03-21

作者: 码天下 | 来源:发表于2020-03-21 10:16 被阅读0次

    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("----------------------------------");

    }

    相关文章

      网友评论

          本文标题:2020-03-21

          本文链接:https://www.haomeiwen.com/subject/rqfyyhtx.html