ORM简介 && MyBatis和Hibernate的不同 && 动态代理简单实现Mybatis基本使用

ORM简介

对象关系映射。
ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。
ORM是通过使用描述对象和数据库之间映射的元数据,在我们想到描述的时候自然就想到了xml和特性(Attribute).目前的ORM框架中,Hibernate就是典型的使用xml文件作为描述实体对象的映射框架,而大名鼎鼎的Linq则是使用特性(Attribute)来描述的。

MyBatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis和Hibernate的不同:

MyBatis:半自动ORM框架、必须写SQL、事务处理、缓存都支持。
Hibernate:全自动ORM框架、可以不写SQL、事务处理、缓存都支持,二级缓存比mybatis更好。

案例使用动态代理实现简单的CRUD:

加依赖:

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.41</version>
    </dependency>
</dependencies>

全局配置文件

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>
 <!-- 导入外部资源 -->
 <properties resource="db.properties"/> 

  <!-- 自定义别名 -->
    <typeAliases>
        <typeAlias type="com.zsl.pojo.Emp" alias="emp"/>
    </typeAliases>

 <!-- 类型转换器 -->
   <typeHandlers>
        <typeHandler handler="com.zsl.typeHandler.ListtypeHandlers"/>
    </typeHandlers>

 <!-- 环境 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${userName}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>

  <!-- 注册映射文件 -->
  <mappers>
    <mapper resource="EmpMapper.xml"/>
  </mappers>

</configuration>

  

pojo

Emp

package com.zsl.pojo;

import java.util.List;

public class Emp {
    private Integer empno;
    private String ename;
    private String job;
    private List<String> pwd;
    public Integer getEmpno() {
        return empno;
    }
    public void setEmpno(Integer empno) {
        this.empno = empno;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }

    public List<String> getPwd() {
        return pwd;
    }
    public void setPwd(List<String> pwd) {
        this.pwd = pwd;
    }
    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Emp(Integer empno, String ename, String job, List<String> pwd) {
        super();
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", pwd=" + pwd + "]";
    }

}

映射文件

EmpMapper.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="com.zsl.dao.EmpMapper">
    <insert id="addEmp" parameterType="emp">
        insert into emp(ename,job,pwd)values(#{ename},#{job},#{pwd})
    </insert>
    <delete id="deleteEmpById" parameterType="int">
        delete from emp where empno=#{empno}
    </delete>
    <update id="updateEmprById" parameterType="emp">
        update emp set name = #{ename} where empno=#{empno}
    </update>
    <select id="getEmpById" parameterType="int" resultType="emp">
        select empno,ename,job,pwd from emp where empno=#{empno}
    </select>
</mapper>

通过SqlSessionFactory对象获取SQLSession对象

DbUtils

package com.zsl.utils;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class DbUtils {
    public static SqlSession getSession() throws IOException {
        // TODO Auto-generated method stub
        // 1.通过Resources对象加载配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-cfg.xml");
        // 2.获取SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        // 3.通过SqlSessionFactory对象获取SQLSession对象
        SqlSession session = factory.openSession();
        return session;
    }

    public static void commit(SqlSession session) {
        // TODO Auto-generated method stub
        session.commit();
    }

    public static void close(SqlSession session) {
        // TODO Auto-generated method stub
        session.close();
    }
}

Dao接口

package com.zsl.dao;

import java.io.IOException;

import com.zsl.pojo.Emp;

public interface EmpMapper {
    public Integer addEmp(Emp emp) throws IOException;
    public Integer deleteEmpById(Integer empno) throws IOException;
    public Integer updateEmprById(Emp emp) throws IOException;
    public Emp getEmpById(Integer empno) throws IOException;
}

Dao接口实现类

EmpMapperImpl

package com.zsl.dao.impl;

import java.io.IOException;

import com.zsl.dao.EmpMapper;
import com.zsl.pojo.Emp;
import com.zsl.utils.DbUtils;

public class EmpMapperImpl implements EmpMapper {

    @Override
    public Integer addEmp(Emp emp) throws IOException {
        // TODO Auto-generated method stub
        int insert = DbUtils.getSession().insert("com.zsl.dao.EmpMapper.addEmp",emp);
        return insert;
    }

    @Override
    public Integer deleteEmpById(Integer empno) throws IOException {
        // TODO Auto-generated method stub

        int delete = DbUtils.getSession().delete("com.zsl.dao.EmpMapper.deleteEmpById", empno);
        return delete;
    }

    @Override
    public Integer updateEmprById(Emp emp) throws IOException {
        // TODO Auto-generated method stub
        int update = DbUtils.getSession().update("com.zsl.dao.EmpMapper.updateEmprById", emp);
        return update;
    }

    @Override
    public Emp getEmpById(Integer empno) throws IOException {
        // TODO Auto-generated method stub
        Emp selectOne = DbUtils.getSession().selectOne("com.zsl.dao.EmpMapper.getEmpById", empno);
        return selectOne;
    }

}

测试

Test类里使用看动态代理,代理类是匿名内部类

public class Test {
    public static void main(String[] args) throws IOException {

        EmpMapper mapperImpl = new EmpMapperImpl();
        EmpMapper empMapper = (EmpMapper) Proxy.newProxyInstance(EmpMapper.class.getClassLoader(),  new Class[]{EmpMapper.class}, new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // TODO Auto-generated method stub
                String name = method.getName();
                Object empno = null;
                System.out.println(EmpMapper.class.getName()+"."+name);
                for (Object object : args) {
                    System.out.println("参数:"+object);
                    empno = object;
                }

//使用的不是目标方法,不是反射实现的目标方法。
//Object object =DbUtils.getSession().selectOne(EmpMapper.class.getName()+"."+name,empno);
                Object object = method.invoke(mapperImpl, args); //实际执行的是接口实现类里的方法,具体查看动态代理源码分析
                return object;
            }
        });

        System.out.println(empMapper.getEmpById(7964));

        }

}

原文地址:https://www.cnblogs.com/zhangsonglin/p/11172208.html

时间: 2024-08-30 16:05:20

ORM简介 && MyBatis和Hibernate的不同 && 动态代理简单实现Mybatis基本使用的相关文章

mybatis(一) mapper动态代理

因为dao开发,会每次创建实体类对象,会传入id等固定查询值,存在硬编码问题,所以采用mapper动态代理(不用创建实体类对象,只需要接口,由mapper自动生成) 与之前mybatis(一)步骤一样,但是需要将mapper.xml文件作出修改: namespace:必须是接口类的全路径 (<mapper namespace="">) id:必须是接口的方法名(<select id=""/>) parameterType:必须是接口方法里面的

mybatis源码学习: 动态代理的应用(慢慢改)

动态代理概述 在学spring的时候知道使用动态代理实现aop,入门的列子:需要计算所有方法的调用时间.可以每个方法开始和结束都获取当前时间咋办呢.类似这样: long current=system.currenttimemillis(); 调用原来的方法 long last=system.currenttimemillis(); 如果每个方法都人工加入实在有点不爽,动态代理出场了.动态代理利用字节码技在原来对应的类的子节码进行重写,添加对应的逻辑. 主流的动态代理实现技术主流如下:JDK 和C

mybatis快速入门(八)-spring-mybatis动态代理整合

将上一节的代码改造下就好了,不过这一章会加一个basedaomapper.废话不多说直接上代码了. 创建一个BaseDaoMapper.java package cn.my.sm.mapper; /** * 将公用方法提取出来 * @author Administrator * * @param <T> */ public interface BaseDaoMapper<T> { public T findById(int id); } 为了防止和上个UserDao有冲突,我们创建

java的代理和动态代理简单测试

什么叫代理与动态代理? 1.以买火车票多的生活实例说明. 因为天天调bug所以我没有时间去火车票,然后就给火车票代理商打电话订票,然后代理商就去火车站给我买票.就这么理解,需要我做的事情,代理商帮我办了,但是需要出手续费. 废话不说了,直接上java代码吧! java动态代理 //接口   (抽象买票的事情) public interface ICalc {     public int add(int i, int j);}//实现这个接口   (具体到我买票的事情) public class

java静态代理与动态代理简单分析

原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理,静态代理是在编译时就将接口.实现类.代理类一股脑儿全部手动完成,但如果我们需要很多的代理,每一个都这么手动的去创建实属浪费时间,而且会有大量的重复代码,此时我们就可以采用动态代理,动态代理可以在程序运行期间根据需要动态的创建代理类及其实例,来完成具体的功能. 其实方法直接调用就可以完成功能,为什么

Java动态代理简单应用

概念 代理模式是基本的设计模式之一,它是开发者为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象.这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色. Java动态代理比代理的思想更进一步,因为它可以动态地创建代理并动态地处理对代理方法的调用.在动态代理上所做的所有调用都会被重定向到单一的调用处理器(InvocationHandler)上,调用处理器的工作是揭示调用的类型并确定相应的策略. Java动态代理实现机制采用了反射的思想,有关于反射的基础知识,可以参见博客

cglib实现动态代理简单使用

Boss: package proxy.cglib; public class Boss{ public void findPerson() { System.out.println("我要找java架构师"); } } WebApp: package proxy.cglib; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.prox

Java通过JDK动态代理简单的实现一个AOP

首先说一下,因为自己还没有去研读spring的AOP的源码,只是大致知道其功能,便想着自己先手动实现一个先看看,觉得这样以后研读源码的时候会收获更多! 实现:做一个在添加注解的方法执行之前,可以先执行另一个方法.类似AOP(@Brfore),不明白的同学可以去百度下,这边只做一个简单的现实. 首先准备一个接口IEat,作为你要做的事情比如,eat(): public interface IEat { void eat(); } 然后两个类去实现这个接口,一个是我们的主要方法(原有不可变动的功能,

Mybatis和Hibernate框架的区别

Mybatis和Hibernate框架的区别1 简单简介 1.1 Hibernate 框架 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射. 是一个全自动的.完全面向对象的持久层框架. 1.2 Mybatis框架 Mybatis是一个开源对象关系映射框架,原名:ibatis,2010年由谷歌接管以后更名.是一个半自动化的持久层框架.2 两者区别 2.1 开发方面 在项目开发过程当中,就速度而言: hibernate开发中,s