mybatis映射

关联映射

简单的关联映射

在user_mapper.xml

    <select id="getUser" parameterType="int" resultType="User">
            select * from user where user_id=#{id}
    </select>

    <select id="getUserInfo" parameterType="int" resultMap="userInfo">
        select * from user_info where user_id=#{userId}
    </select>

    <resultMap type="UserInfo" id="userInfo">
        <association property="user" javaType="User" column="user_id" select="getUser"/>
    </resultMap>

UserMapper接口

    @MyBatisRepository
    public interface UserMapper {
    public UserInfo getUserInfo(int userId);
    public User getUser(int id);
    }

多表关联查询

mapper.xml中


    <select id="getUserInfo2" parameterType="int" resultMap="UserInfo2">
        select u.*,i.* from user_info i join user u on i.user_id=u.user_id 
        where i.user_id=#{userId}
    </select>

    <resultMap type="UserInfo" id="UserInfo2">
        <id column="user_info_id" property="userInfoId"/>
        <result column="age" property="age" />
        <result column="sax" property="sax" />
        <association property="user" javaType="User"  >
            <id column="user_id" property="userId"/>
            <result column="email" property="email" />
            <result column="password" property="password" />
            <result column="nickname" property="nickname" />
        </association>
    </resultMap>

UserMapper接口中:

    @MyBatisRepository
    public interface UserMapper {
        public UserInfo getUserInfo(int userId);
        public UserInfo getUserInfo2(int userId);
        public User getUser(int id);
    }

在mybatis配置文件中增加下面的配置

    <settings>
        <!-- 数据库的字段为user_id 映射到类中字段为 userId-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 开始自动映射,默认是不映射嵌套的结果集,这样写也会映射嵌套的结果集-->
        <setting name="autoMappingBehavior" value="FULL"/> 
    </settings>
    <!--别名配置,可以省略包名 -->
    <typeAliases>
        <package name="entity"/>
    </typeAliases>

mapUnderscoreToCamelCase 这个属性的意思是把java实体类中的属性名和数据库的的表面的一个对应关系,比如:User类中的userId对应到数据库中的user表中的字段为user_id,这个是一个默认的驼峰法映射关系

autoMappingBehavior 这个属性的意思是开启自动映射,默认是不会映射嵌套的结果集,官方说明如下:指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。默认是PARTIAL.

在mapper.xml中可以这样写

    <resultMap type="UserInfo" id="UserInfo2">
        <association property="user" javaType="User" />
    </resultMap>

当不去配置autoMappingBehavior,可以手动写

    <resultMap type="UserInfo" id="UserInfo2" autoMapping="true">
        <association property="user" javaType="User" autoMapping="true" />
    </resultMap>

别名的配置,自动加包名

    <typeAliases>
        <package name="entity"/>
    </typeAliases>

主键映射

UserMapper接口

    @MyBatisRepository
    public interface UserMapper {
        public void saveUser(User user);
        public void saveUserInfo(UserInfo info);
    }

user_mapper.xml

    <insert id="saveUser" parameterType="User" useGeneratedKeys="true" keyProperty="userId">
        insert into user (email,password,nickname)values
            (#{email},#{password},#{nickname})
    </insert>

    <insert id="saveUserInfo" parameterType="UserInfo">
        insert into user_info(user_info_id,user_id,age,sex) values
        (#{userInfoId},#{user.userId},#{age},#{sex})
    </insert>

USerMapper的saveUser 这个方法会把生成的userId给传入的User对象中的userId进行赋值,从而业务层的代码能顺利执行

在业务层中的代码如下:

    User user = new User();
    user.setEmail("223@qq.com");
    user.setPassword("123");
    user.setNickname("weck");
    UserInfo info = new UserInfo();
    info.setUser(user);
    info.setAge(16);
    info.setSex("男");
    userMapper.saveUser(user);
    userMapper.saveUserInfo(info);
    return "ok";

这里的user对象中的userId属性在执行saveUser后就会自动赋值进去,从而UserInfo能顺利插入表中,UserInfo表的user_id字段为插入的user生成的主键

Oracle数据库不能够主键自动递增,使用如下配置

    <insert id="saveUser" parameterType="User">
        <selectKey keyProperty="userId" order="BEFORE" resultType="int">
            select user_seq.nextval from dual
        </selectKey>
        insert into user (user_id,email,password,nickname)values
        (#{userId},#{email},#{password},#{nickname})
    </insert>

一对多映射

user_mapper.xml,获取用户包含所有的blog,通过id查询

    <select id="getBlogsbyUserId" parameterType="int" resultType="Blog">
        select * from blog where user_id=#{userId}
    </select>

    <select id="getUseWithBlogById" parameterType="int" resultMap="userWithBlog">
            select * from user where user_id=#{userId}
    </select>

    <resultMap type="User" id="userWithBlog">
        <collection ofType="Blog" property="blogs" 
                    javaType="java.util.ArrayList" column="user_id" 
                    select="getBlogsbyUserId"/>
    </resultMap>

也可以使用多表查询

在业务层

    User u = userMapper.getUseWithBlogById(2);

在JavaBean中

    public void setBlogs(List<Blog> blogs) {
        this.blogs = blogs;
        for(Blog b : blogs){
            b.setUser(this);
        }
    }

拿到的每一个Blog对象中的user对象不再为空,这是一种解决方式

鉴别器

根据数据表中的某个字段返回相应的对象

Vehicle 交通工具类

Car和Boat是Vehicle的子类 ,根据vehicleType返回相应的对象

Vehicle类

    public class Vehicle {
        private int id;
        private String vin; // 交通登记号码
        private Date year;
        private String color;
        private String vendor;
        private int vehicleType;
        ...
    }

Car类

    public class Car extends Vehicle {

        private int doorCount;

        public Car() {
        }

        public int getDoorCount() {
            return doorCount;
        }

        public void setDoorCount(int doorCount) {
            this.doorCount = doorCount;
        }

        @Override
        public String toString() {
            return "Car [doorCount=" + doorCount + "]";
        }

    }

Boat类

    public class Boat extends Vehicle{
        private String quant;  //船桨  

        public Boat() {  
        }  

        @Override
        public String toString() {
            return "Boat [quant=" + quant + "]";
        }

        public String getQuant() {  
            return quant;  
        }  

        public void setQuant(String quant) {  
            this.quant = quant;  
        }  
    }

vehicle_mapper .xml

<mapper namespace="mapper.VehicleMapper">

        <select id="selectVehicle" parameterType="int" resultMap="vehicleResult">
            select * from vehicle where id =#{id};
        </select>

        <resultMap type="Vehicle" id="vehicleResult">
            <discriminator javaType="int" column="vehicle_type">
                <case value="1" resultType="Car"/>
                <case value="2" resultType="Boat"/>
            </discriminator> 
        </resultMap>

    </mapper>

VehicleMapper

@MyBatisRepository
    public interface VehicleMapper {
        public Vehicle selectVehicle(int id);
    }

业务层

Vehicle v = vehicleMapper.selectVehicle(2);

如果vehicle_type是1就返回一个Car对象,2就返回Boat对象,其他返回父类对象Vehicle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值