zoukankan      html  css  js  c++  java
  • mybatis 一对一 一对多 多对多

     一对一

                 account                                                                          users

                        

    1 . account 继承users

    accountMapper.xml 中配置 resultMap ,映射user中的属性

    <resultMap id="accounts" type="account">
        <id property="a_id" column="aid"></id>
        <result property="aname" column="aname"></result>
        <result property="money" column="money"></result>
        <result property="uid" column="uid"></result>
        <!--映射user-->
       
    <result property="uid" column="id"></result>
        <result property="username" column="name"></result>
        <result property="age" column="age"></result>
        <result property="birthday" column="birthday"></result>
    </resultMap>
    <!--查询所有-->
    <select id="FindAll" resultMap="accounts">
       select * from account a,users u where a.aid = u.id
    </select>

    2 . account 中包含user属性

    用association 关联一个对象

    association 关联对象的映射, 只能关联一个对象

                property: 映射属性名

                javaType:   加载对象的java数据类型

    <resultMap id="accounts" type="account">
        <id property="a_id" column="aid"></id>
        <result property="aname" column="aname"></result>
        <result property="money" column="money"></result>
        <result property="uid" column="uid"></result>
        <!--映射user-->
       
    <association property="user" javaType="user">
            <id property="uid" column="id"></id>
            <result property="username" column="name"></result>
            <result property="age" column="age"></result>
            <result property="birthday" column="birthday"></result>
        </association>
    </resultMap>

    <!--查询所有-->
    <select id="FindAll" resultMap="accounts">
       select from account a,users u where a.aid = u.id
    </select>

    3 . 使用user引用user中的属性名

    <resultMap id="accounts" type="account">
    <id property="a_id" column="aid"></id>
    <result property="aname" column="aname"></result>
    <result property="money" column="money"></result>
    <result property="uid" column="uid"></result>
        <!---user对象的映射: 使用user来引用user中的属性名-->
       
    <result property="user.uid" column="id"></result>
        <result property="user.username" column="name"></result>
        <result property="user.age" column="age"></result>
        <result property="user.birthday" column="birthday"></result>
    </resultMap>

    <!--查询所有-->
    <select id="FindAll" resultMap="accounts">
       select from account a,users u where a.aid = u.id
    </select>

    一对多

    user表和account表

    一个用户有多个账户:在用户中定义一个账户集合

    private List<Account> accountList = new ArrayList<Account>();

     

    collection:关联多个对象

                accountList: 映射的属性名

                ofType:关联的类型

    <mapper namespace="com.wqy.mapper.UserMapper">
        <resultMap id="users" type="user">
            <id column="id" property="uid"></id>
            <result column="name" property="username"></result>
            <result column="age" property="age"></result>
            <result column="birthday" property="birthday"></result>
            <!--映射account-->
           
    <collection property="accountList" ofType="account">
                <id property="a_id" column="aid"></id>
                <result property="aname" column="aname"></result>
                <result property="money" column="money"></result>
                <result property="uid" column="uid"></result>
            </collection>
        </resultMap>
        <!--查询所有-->
       
    <select id="findAll" resultMap="users">
            select * from users u ,account a where u.id = a.uid
        </select>

    多对多

    用户表:users                                                                   角色表role                                    中间表 users_role

                                        

    即两个一对多

    在用户对象中添加属性:

    private List<Role> roleList = new ArrayList<Role>();

     

    在角色对象中添加属性:

    private List<User> userList = new ArrayList<User>();

     

    注解

    @Insert:实现新增
    @Update:实现更新
    @Delete:实现删除
    @Select:实现查询
    @Result:实现结果集封装
    @Results:可以与@Result 一起使用,封装多个结果集
    @One:实现一对一结果集封装
    @Many:实现一对多结果集封装
    @SelectProvider: 实现动态 SQL映射

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

    /**

         * 查询全部

         * @return

         * @Results:映射结果集:多列数据

         * @Result:映射单列的数据

         *          id:是否为主键:true:为主键          false:不是主键

         *    如果列名与属性名不一致,必须配置

         *    如果列名与属性名一致,则可以不配置

         */

    
    
    @Results({
            @Result(id = true,property = "uid",column = "id"),
            @Result(property = "username",column = "name")
    })
    @Select("select * from users")
    List<User> findAll();
    
    

    @Results  注解

    代替的是标签<resultMap>

    该注解中可以使用单个@Result 注解,也可以使用@Result 集合

    @Results({@Result(),@Result()})或@Results(@Result())

    @Resutl 注解

    代替了 <id> 标签和<result> 标签

    @Result  中  属性介绍:

    column 数据库的列名

    Property 需要装配的属性名

    one 需要使用的@One 注解(@Result(one=@One)()))

    many 需要使用的@Many 注解(@Result(many=@many)()))

    @One  注解(一对一 )

    代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

    @One  注解属性介绍:

    select 指定用来多表查询的 sqlmapper

    fetchType 会覆盖全局的配置参数 lazyLoadingEnabled 。。

    使用格式:

    @Result(column=" ",property="",one=@One(select=""))

    Account中有User属性
    private User user;

     

    public interface AccountMapper {

    @Results({
    @Result(id=true,property = "a_id",column = "aid"),
    @Result(property = "user",column = "uid",one=@One(select = "com.wqy.mapper.UserMapper.findUserByid",fetchType = FetchType.LAZY))
    })
    @Select("select * from account ")
    List<Account> FindAll();
    }

    uid为account表中的外键字段,根据uid去查用户

    public interface UserMapper {


    @Results({
    @Result(id = true,property = "uid",column = "id"),
    @Result(property = "username",column = "name"),
    })
    @Select("select * from users where id = #{id}")
    User findUserByid(Integer id);
    }

    @Many  注解(多对一)

    User 中的属性

    private List<Account> accountList = new ArrayList<Account>();

    代替了<Collection> 标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。

    注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;

    使用格式:

    public interface UserMapper {

    @Results({
    @Result(id = true,property = "uid",column = "id"),
    @Result(property = "username",column = "name"),
    @Result(property = "accountList",column = "uid",javaType = List.class,
    many = @Many(select = "com.wqy.mapper.AccountMapper.FindAllByUid"))
    })
    @Select("select * from users ")
    List<User> findAll();
    }

    public interface AccountMapper {

    @Results({
    @Result(id=true,property = "a_id",column = "aid")
    })
    @Select("select * from account ")
    List<Account> FindAllByUid(Integer id);
    }

     @SelectKey

    /**
     * selectKey:查询主键值
     *  属性:keyColumn:表中的列名
     *   keyProperty:pojo的属性名
     *   before: 在添加之前查询,还是在之后查询,true:在之前查询,false:在之后查询
     *  resultType:返回值类型
     *  statement:  sql语句
     */

    @Results({
            @Result(id = true,property = "uid",column = "id"),
            @Result(property = "username",column = "name")
    })
    @SelectKey(keyProperty = "uid",keyColumn = "id",before = false,
            resultType = Integer.class,statement = {"select last_insert_id()"})
    @Insert("insert into users values (null,name,age,birthday)")
    void save(User user);

    /**

         * 查询全部

         * @return

         * @Results:映射结果集:多列数据

         * @Result:映射单列的数据

         *          id:是否为主键:true:为主键 false:不是主键

         *  如果列名与属性名不一致,必须配置

         *  如果列名与属性名一致,则可以不配置

         *  @Result:如果映射的一对一

         *      javaType:属性对应的类型是什么

         *      property:属性名

         *      column:表的列名

         *      one: 对应一条记录

         *      @One(select = "com.itheima.dao.UserDao.findByUid"):去查询一个对象返回

         *          属性:fetchType:默认为立即加载

         *               可以配置为:FetchType.LAZY: 延迟加载,只有在使用的时候才会加载该对象

         */


    动态SQL:

    public class UserProvider {
    public String findByConditionSql(String name, Integer age) {
    StringBuilder sb = new StringBuilder();
    sb.append("select * from users where 1=1 ");
    if (name != null && name != "") {
    sb.append(" and name = "%"#{param1}"%" ");
    }
    if (age != null) {
    sb.append(" and age > #{param2}");
    }

    return sb.toString();
    }
    }

    //    @Select("select * from users where name like "%"#{param1}"%" and age > #{param2}" )
       
    @SelectProvider(type = UserProvider.class,method = "findByConditionSql")
        List<User> findBycondition(String name,Integer age);














  • 相关阅读:
    JDBC的URL
    使用CablleStatement调用存储过程
    PreparedStatement执行sql語句
    使用Statement执行DML和DQL语句
    使用Statement对象执行静态sql语句
    JDBC接口核心的API
    MapReduce源代码分析之JobSubmitter(一)
    React Native Android入门实战及深入源代码分析系列(2)——React Native源代码编译
    Oracle学习笔记(5)——查询
    springMVC4(5)RestTemplate控制层单元測试
  • 原文地址:https://www.cnblogs.com/Cyan-W/p/9867585.html
Copyright © 2011-2022 走看看