数据仓库——拉链表(java/hive实现)

一、Java实现拉链表

技术选型:MyBatis

1)mysql建表

create database mydemo;
use mydemo;
create table orders(
orderid int primary key not null auto_increment,
orderno varchar(20),
orderstatus int,
begintime date,
overtime date
);

2)使用Maven的quickstart工程,添加两个依赖

	<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

3)新建资源文件夹,添加xml配置

①mybatis.cfg.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias type="cn.kgc.dwlearn.mylink.entity.Orders" alias="order"></typeAlias>
    </typeAliases>
    <environments default="jun">
        <environment id="jun">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.247.188:3306/mydemo"/>
                <property name="username" value="root"/>
                <property name="password" value="javakb10"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/orders.xml"></mapper>
    </mappers>
</configuration>

②orders.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.dwlearn.mylink.dao.OrdersDAO">
    <insert id="addOrder" parameterType="order">
        insert into orders(orderno,orderstatus,begintime,overtime)
            values(#{orderno},#{orderstatus},#{begintime},'9999-12-31')
    </insert>
    <update id="updateOrder" parameterType="order">
        update orders set overtime=#{overtime} where orderid=#{orderid}
    </update>
    <select id="findByOrderno" parameterType="java.lang.String" resultType="order">
        select * from orders where orderno=#{orderno} and overtime='9999-12-31'
    </select>
</mapper>

4)创建实体类Orders

package cn.kgc.dwlearn.mylink.entity;

import java.util.Date;

public class Orders {
    
    
    private int orderid;
    private String orderno;
    private int orderstatus;
    private Date begintime;
    private Date overtime;

    public Orders() {
    
    
    }

    public Orders(int orderid, String orderno, int orderstatus, Date begintime, Date overtime) {
    
    
        this.orderid = orderid;
        this.orderno = orderno;
        this.orderstatus = orderstatus;
        this.begintime = begintime;
        this.overtime = overtime;
    }

    public void setOrderid(int orderid) {
    
    
        this.orderid = orderid;
    }

    public void setOrderno(String orderno) {
    
    
        this.orderno = orderno;
    }

    public void setOrderstatus(int orderstatus) {
    
    
        this.orderstatus = orderstatus;
    }

    public void setBegintime(Date begintime) {
    
    
        this.begintime = begintime;
    }

    public void setOvertime(Date overtime) {
    
    
        this.overtime = overtime;
    }

    public int getOrderid() {
    
    
        return orderid;
    }

    public String getOrderno() {
    
    
        return orderno;
    }

    public int getOrderstatus() {
    
    
        return orderstatus;
    }

    public Date getBegintime() {
    
    
        return begintime;
    }

    public Date getOvertime() {
    
    
        return overtime;
    }
}

5)OrdersDAO接口

package cn.kgc.dwlearn.mylink.dao;

import cn.kgc.dwlearn.mylink.entity.Orders;

public interface OrdersDAO {
    
    
    public void addOrder(Orders orders);
    public void updateOrder(Orders orders);
    public Orders findByOrderno(String orderno);
}

6)测试类

package cn.kgc.dwlearn.mylink.demo;

import cn.kgc.dwlearn.mylink.dao.OrdersDAO;
import cn.kgc.dwlearn.mylink.entity.Orders;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.Reader;
import java.util.Date;

public class MyDemo {
    
    
    public static void main(String[] args) throws Exception{
    
    
        Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        OrdersDAO odao = session.getMapper(OrdersDAO.class);

        //先去数据库查询是否有订单123456
        //创建一个新订单
        Orders ord = new Orders(1,"123456",1,new Date(),null);
        Orders order = odao.findByOrderno(ord.getOrderno());
        if (order != null){
    
    
            order.setOvertime(new Date());
            odao.updateOrder(order);
        }
        odao.addOrder(ord);
        session.commit();
        session.close();
    }
}

我们先执行一次程序,orders表会多一条数据
在这里插入图片描述
再插入另一条记录
在这里插入图片描述
此时,我们再插入一条orderno为123456,orderstatus为2的数据,更新订单状态
在这里插入图片描述
原理就是在插入数据时,会判定该orderno是否存在,如果不存在则插入数据;如果存在,会更新上一条数据的结束时间overtime,并插入该orderno新的订单状态的数据


二、Hive实现拉链表

待更新…

猜你喜欢

转载自blog.csdn.net/weixin_48482704/article/details/114953982