ORM体验之旅

最近查阅资料学习了两个比较实用的ORM框架,好东西与大家一起分享了。

O/RM的设计:

ORM体验之旅_第1张图片

这是一张描述描述数据库访问的通用组件模型,通过ORM中的数据库访问组件来实现数据库的访问,通过定义统一接口访问数据库,让所有的数据库访问类都默认继承实现这个接口。(ORM的由来,ORM的设计思想由一张图表现的再清楚不过了)


ORM的核心模块:

ORM体验之旅_第2张图片


以上这张图十分形象的给我们展示分层的重要思想,重点是描述了ORM的地位。


优缺点:

ORM体验之旅_第3张图片

任何事物都不可能绝对的完美的,对于ORM也是一样的,上图就描述了它的优缺点。


有了宏观的把我,再来看看例子:Hibernate、Mybatis。这两个框架都是眼下最为流行的O/RM框架:

Hibernate

对数据库结构提供了较完成的封装,她实现了POJO和数据库之间的映射,以及sql的自动生成和执行。程序员往往只需要定义好POJO到数据库表的映射关系,即可通过Hibernate提供的方法完成持久化操作,程序员甚至不需要对sql的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的sql并调用JDBC接口加以执行。

Mybatis:

着力点在于POJOsql之间的影身关系,然后通过映射配置文件,将sql所需的参数,以及返回的结果字段映射到指定的POJO,相对于Hibernate O/R”而言,是一种“sql Mapping”的ORM实现。


Mybatis核心代码:

uer.xml:

<mapper namespace="itat.zttc.shop.model.User">
	<insert id="add" parameterType="User">
		insert into t_user (username,password,nickname,type) value 
			(#{username},#{password},#{nickname},#{type})
	</insert>
</mapper>
从这里足以可以看出和Hibernate的不同之处了,同样都是在封装,但是Mybatis封装的确是sql语句。而Hibernate封装的确是POJO与实体间的映射关系。

usermapper.java:

public interface UserMapper {
	/**
	 * @param user
	 */
	@Insert("insert into t_user (username,password,nickname,type) value (#{username},#{password},#{nickname},#{type})")
	public void add(User user);
}
这里采用了注解的方式。


  • 方式一:test1.java:

	@Test
	public void testAdd() {
		SqlSession session = null;
		try {
			session = MyBatisUtil.createSession();
			User u = new User();
			u.setNickname("猪八戒");
			u.setPassword("222");
			u.setType(1);
			u.setUsername("bajie");
			session.getMapper(UserMapper.class).add(u);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.rollback();
		} finally {
			MyBatisUtil.closeSession(session);
		}
	}
	

  • 方式二:test2.java:

private static void testAdd() {
		try {
			//1、创建配置文件(mybatis-config.xml)的输入流
			InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
			//2、创建SQLSessionFactory
			SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
			//3、创建SQLSessioin
			SqlSession session = factory.openSession();
			//4、调用mapper文件插入数据(调用之前需要将mapper文件加入到mybatis-config.xml中)
			User u = new User();
			u.setNickname("孙悟空");
			u.setPassword("123");
			u.setType(0);
			u.setUsername("wukong");
			session.insert("itat.zttc.shop.model.User.add", u);
			session.commit();
			session.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

  • 方式三:test3.java:

	@Test
	public void testAdd() {
		SqlSession session = null;
		try {
			session = MyBatisUtil.createSession();
			User u = new User();
			u.setNickname("孙悟空");
			u.setPassword("123");
			u.setType(1);
			u.setUsername("wukong");
			session.insert(User.class.getName()+".add", u);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.rollback();
		} finally {
			MyBatisUtil.closeSession(session);
		}
	}

上面的三种方式都是在获取配置文件中封装的sql语句,细心的人可以感受一下这三种方式所体现的抽象思想的不同程度,也可以感受一下抽象给我带来的乐趣。


总结:

要想拉进与面向对象间的距离,我想两个框架是我们不可以忽略的吧。这两个框架以不同的方式,从相同的角度,给我们提供了业务逻辑层与数据库操作层的解耦的很好的实现方式。ORM是一种很好的思想,而Hibernate和Mybatis则做了很好的实现。(文章中的图相当的好,是我借阅的网上的资料)。


你可能感兴趣的:(ORM体验之旅)