最近查阅资料学习了两个比较实用的ORM框架,好东西与大家一起分享了。
O/RM的设计:
这是一张描述描述数据库访问的通用组件模型,通过ORM中的数据库访问组件来实现数据库的访问,通过定义统一接口访问数据库,让所有的数据库访问类都默认继承实现这个接口。(ORM的由来,ORM的设计思想由一张图表现的再清楚不过了)
ORM的核心模块:
以上这张图十分形象的给我们展示分层的重要思想,重点是描述了ORM的地位。
优缺点:
任何事物都不可能绝对的完美的,对于ORM也是一样的,上图就描述了它的优缺点。
有了宏观的把我,再来看看例子:Hibernate、Mybatis。这两个框架都是眼下最为流行的O/RM框架:
Hibernate:
对数据库结构提供了较完成的封装,她实现了POJO和数据库之间的映射,以及sql的自动生成和执行。程序员往往只需要定义好POJO到数据库表的映射关系,即可通过Hibernate提供的方法完成持久化操作,程序员甚至不需要对sql的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的sql并调用JDBC接口加以执行。
Mybatis:
着力点在于POJO与sql之间的影身关系,然后通过映射配置文件,将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则做了很好的实现。(文章中的图相当的好,是我借阅的网上的资料)。