官方发言:
元数据 描述数据的数据,对数据及信息资源的描述性信息
(1)描述哪些数据在数据仓库中;
(2)定义要进入数据仓库中的数据和从数据仓库中产生的数据;
(3)记录根据业务事件发生而随之进行的数据抽取工作时间安排;
(4)记录并检测系统数据一致性的要求和执行情况;
(5)衡量数据质量。
理解:
元数据就相当于抛掉原始的一个对象对应一张表的尴尬局面,使用元数据,将所有的参数数据放入同一张表中,
新建另一张元数据驱动表,存放所有的对象,通过对象属性对应数据表的别名拿取对象所对应数据
分析:
首先表分为了元数据驱动表(对象表)和数据表,
元数据驱动表 放入的都是对象属性字段和对应数据表的别名
数据表 存储所有的数据我们要进行CRUD的时候呢,分为几步:
-
1.拿到对象的所属类,因为我是用类名作为对象的类型,所以我要获取类的类名
2.拿到类名后我要去查询驱动表中类对应的属性和属性对应数据表中的字段
3.拿到属性和字段后,返回的Map集合,但是接口返回值要用list接住
注意这里为什么返回Map呢,因为返回list的话,拿取的只单单是数据的id,所以返回Map
4.将拿到的list集合再次放入map中传入数据表中的sql语句中,进行CRUD操作
- 配置数据库:
- 数据表:
- 元数据驱动表
实体代码撸一波:
所有的接口:
List<ElementBean> queryElementBean(); List<ObjectDBBean> objectMapper(Map<?, ?> map); List<Map<Object,Object>> elementMapper(Map<?, ?> map); int addMapper(Map<?, ?> map); int deleteMapper(Map<?, ?> map); int updateMapper(Map<?, ?> map);
查询:
//java代码实现步骤, public void objectMapper(){ //获取session SqlSession session = factory.openSession(true); //获取映射接口 IElementMapper iElementMapper = session.getMapper(IElementMapper.class); //创建学生对象 StudentBean studentBean = new StudentBean(); //创建map将对象类型放入map中 Map<Object, Object> map = new HashMap<Object,Object>(); map.put("type","StudentBean"); //查询出对象字段对应的别名 List<ObjectDBBean> list = iElementMapper.objectMapper(map); logger.warn("elementBean " + list); //将查询出来的别名集合放入到map中 map.put("list", list); //再次调用SQL语句,通过别名和type查到对应的数据, List<Map<String,String>> element = iElementMapper.elementMapper(map); logger.warn("element" + element); //通过json来处理,这里的json就很骚了,是将返回的参数作为json格式返回给指定的类,进行转换 for (Map<String, String> map2 : element) { StudentBean stu = TypeUtils.cast(map2, StudentBean.class, ParserConfig.getGlobalInstance()); System.out.println(stu); } }
<!-- 查询 --> <!-- 获取对象的属性和字段,这里是CRUD都会用到的一个公共的方法 --> <select id="objectMapper" parameterType="java.util.Map" resultType="ObjectDBBean"> select * from objectdb <where> <if test="type != null"> type=#{type} </if> </where> </select> <select id="elementMapper" parameterType="java.util.Map" resultType="java.util.Map"> select <foreach collection="list" item="list" separator=","> ${list.source} as ${list.name} <!-- 获取查询出来对象表的别名 --> <!-- as 取别名 --> </foreach> from element <where> alias_type=#{type} </where> </select>
添加:
//添加java public void addMapper(){ //获取session SqlSession session = factory.openSession(true); //拿取mapper接口 IElementMapper iElementMapper = session.getMapper(IElementMapper.class); //定义一个map,作为传入xml文件的参数 Map<Object, Object> map = new HashMap<Object,Object>(); //假装有数据 ComputerBean computer = new ComputerBean(); computer.setComputer_id("c3"); computer.setComputer_display("18寸"); computer.setComputer_main("华为"); computer.setComputer_keyboard("牧马人"); /*StudentBean stu = new StudentBean(); stu.setStudent_id("s3"); stu.setStudent_name("你猜"); stu.setStudent_title("木有");*/ //添加对象的类名,后期可以做一个处理,直接传入对象,做个工具类,单独获取 map.put("type","ComputerBean"); //获取传入对象的所有字段 List<ObjectDBBean> list = iElementMapper.objectMapper(map); map.put("list", list); logger.warn("elementBean " + list); map.put("stu", computer); int count = iElementMapper.addMapper(map); }
<!-- 增加 --> <insert id="addMapper" parameterType="java.util.Map"> <foreach collection="list" item="list" separator="," open="insert into element(alias_type," close=")values" > ${list.source} <!--通过list 集合循环出要添加的字段,因为是foreach,所以字段是一致的不用担心 --> </foreach> <foreach collection="list" item="list" separator="," open="(#{type}," close=")" > #{stu.${list.name}} <!-- stu为传入的一对象,这就要用到 # 获取数据, list.name是循环得到的对应对象的字段名 --> </foreach> </insert> <!-- 这里就有一个很骚的操作,open 是foreach开始循环之间要添加的语句,close是结束时添加的语句 -->
删除:
public void deleteMapper(){ //获取Session SqlSession session = factory.openSession(true); //获取mapper接口 IElementMapper iElementMapper = session.getMapper(IElementMapper.class); //定义一个map,作为传入xml文件的参数 Map<Object, Object> map = new HashMap<Object,Object>(); //添加一个假数据,放入map中 StudentBean stu = new StudentBean(); stu.setStudent_id("s3"); map.put("stu", stu); //添加对象的类名,后期可以做一个处理,直接传入对象,做个工具类,单独获取 map.put("type","StudentBean"); //先查出对象对应的字段,并拿取对应的别名 List<ObjectDBBean> list = iElementMapper.objectMapper(map); logger.warn(list); //放入map中 map.put("list", list); //进行删除 int count = iElementMapper.deleteMapper(map); }
<!-- 删除 --> <delete id="deleteMapper" parameterType="java.util.Map"> delete from element <foreach collection="list" item="list" separator=","> <where> <if test="list.source == 'alias_id'"> ${list.source} = #{stu.${list.name}} <!-- 因为我的id放在了 数据表中alia_id 的字段,所以我可以直接进行判断 --> </if> </where> </foreach> </delete>
修改:
//修改 public void updateMapper(){ //获取Session SqlSession session = factory.openSession(true); //获取mapper接口 IElementMapper iElementMapper = session.getMapper(IElementMapper.class); //定义一个map,作为传入xml文件的参数 Map<Object, Object> map = new HashMap<Object,Object>(); //添加一个假数据,放入map中 StudentBean stu = new StudentBean(); stu.setStudent_id("s3"); stu.setNewStudent_id("s4"); stu.setStudent_name("搞事情"); stu.setStudent_title("不搞"); map.put("stu", stu); //添加对象的类名,后期可以做一个处理,直接传入对象,做个工具类,单独获取 map.put("type","StudentBean"); //先查出对象对应的字段,并拿取对应的别名 List<ObjectDBBean> list = iElementMapper.objectMapper(map); logger.warn(list); //放入map中 map.put("list", list); //进行修改 int count = iElementMapper.updateMapper(map); }
<!-- 修改 --> <update id="updateMapper" parameterType="java.util.Map"> update element set <foreach collection="list" item="list" separator=","> ${list.source} = #{stu.${list.name}} <!-- 循环对象表中需要添加字段的别名, 放入stu对象中的属性 --> </foreach> <foreach collection="list" item="list" separator=","> <where> <if test="list.source == 'alias_id'"> ${list.source} = #{stu.${list.name}} </if> </where> </foreach> </update>