ORM体验之旅

来源:互联网 发布:淘宝美工简历怎么写 编辑:程序博客网 时间:2024/05/18 03:28

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

O/RM的设计:


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


ORM的核心模块:



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


优缺点:


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


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

Hibernate

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

Mybatis:

着力点在于POJOsql之间的影身关系,然后通过映射配置文件,将sql所需的参数,以及返回的结果字段映射到指定的POJO,相对于HibernateO/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:

@Testpublic 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、创建SQLSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3、创建SQLSessioinSqlSession 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:

@Testpublic 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则做了很好的实现。(文章中的图相当的好,是我借阅的网上的资料)。


0 0
原创粉丝点击