zoukankan      html  css  js  c++  java
  • 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));
    		
    		
    		}
    
    }
    
    作为新手小菜鸟的我,只想记录,便于温故知新,如有错误或疏忽,请留言,审查后改正,谢谢各位大佬
  • 相关阅读:
    ThinkPHP中pathinfo模式与URL重写
    JS分割字符串并放入数组的函数
    js解决弹窗问题实现班级跳转DIV示例
    javascript客户端遍历控件与获取父容器对象
    Apache 虚拟目录和默认首页的设置
    linux Apache CGI 安装配置
    apache与和mysql重启命令
    带你从零学ReactNative开发跨平台App开发(三)
    带你从零学ReactNative开发跨平台App开发(一)
    C#/Net定时导出Excel并定时发送到邮箱
  • 原文地址:https://www.cnblogs.com/zhangsonglin/p/11172208.html
Copyright © 2011-2022 走看看