MyBatis是一个ORM Object Relational Mapping 框架 对象-关系映射 框架 ,ORM框架主要是根据类和数据库表之间的映射关系,进行对象和数据之间的转换,ORM负责将程序中的对象存到数据库,并将数据库中的数据转换为对象,Java上的ORM框架很多,除了MyBatais之外,还存在着Hibernate,TopLink等
MyBatis框架的主要作用是用于简化数据库方面的开发,MyBatis如何简化的数据库开发的呢?
Java提供了JDBC类库来封装不同类型的数据库的操作来对数据库进行操作,但是还是有点麻烦的,于是提供了JdbcTemplate,对JDBC进一步进行封装,简化了数据库编程
使用JdbcTemplate进行数据库的编程,只需要编写业务相关的代码,比如业务相关的SQL语句,其他性质的代码,比如创建,关闭连接,都封装在了JdbcTemplate上了
MyBatis类似,依赖于JDBC驱动,在项目中使用MyBatis,除了需要引入MyBatis框架本身的外,还引入了JDBC驱动,将这两个引入了项目,就可以进行编程了,使用MyBatis来访问数据库中的用户信息
// 1. 定义UserDO
public class UserDo { private long id; private String name; private String telephone; // 省略setter/getter方法 } // 2. 定义访问接口 public interface UserMapper { public UserDo selectById(long id); } // 3. 定义映射关系:UserMapper.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=”cn.xzg.cd.a87.repo.mapper.UserMapper”> <select id=”selectById” resultType=”cn.xzg.cd.a87.repo.UserDo”> select * from user where id=#{id} </select> </mapper> // 4. 全局配置文件: mybatis.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> <environments default=”dev”> <environment id=”dev”> <transactionManager type=”JDBC”></transactionManager> <dataSource type=”POOLED”> <property name=”driver” value=”com.mysql.jdbc.Driver” /> <property name=”url” value=”jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8″ /> <property name=”username” value=”root” /> <property name=”password” value=”…” /> </dataSource> </environment> </environments> <mappers> <mapper resource=”mapper/UserMapper.xml”/> </mappers> </configuration> |
在上面的XML配置文件中,我们定义了接口和SQL语句之间的关系,没有显式的定义类UserDao和数据库表 user字段之间的关系,这就体现了我们的设计中,约定优于配置的原则,类字段和数据库表字段之间使用了默认的映射关系,类字段和数据库表中的字段要一一映射
访问的方式就可以如下面的样子了
public class MyBatisDemo {
public static void main(String[] args) throws IOException { Reader reader = Resources.getResourceAsReader(“mybatis.xml”); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); UserDo userDo = userMapper.selectById(8); //… } } |
在代码中可以看出,相对于JdbcTemplate的使用,使用MyBatis的方式更加的灵活,相比于JdbcTemplate来说,使用起来,和具体的代码相分离,更加的灵活,清洗,方便维护’
那么,这就涉及到了一个问题,如何在三者之间进行取舍
这三者分别是JdbcTemplate,MyBatis,Hibernate,首先是JdbcTemplate,相比较于MyBatis,更加轻量级,只是对断开和连接数据库进行了封装,但是缺点很明显,就是和SQL代码耦合在一起,不具备ORM的功能,将业务代码和数据库强耦合
Hibernate和MyBaits相比,Hibernate更加重量级,使用了更加高级的映射功能,根据业务需求自动生成SQL语句,不需要像是MyBatis那样自己编写SQL,不过,虽然简化了开发,但是自动生成的SQL语句没有进行针对的优化,这样,丧失了程序员自己编写SQL的灵活性
实际上,不管是哪种实现方式,从数据库中取出数据并且转换成对象,涉及的代码逻辑都一样,不过,有的功能强大,大部分都交给框架实现,有的框架将功能的实现交给了程序员
总结下来,框架的易用性和性能成对立的关系,追求了易用性,那么性能会差一点,追求了性能,那么易用性就差一点,使用越简单,灵活性越差
JdbcTemplate提供的功能最简单,易用性差,编程性能上来说,最好了.MyBaits介于了两者之间,在易用性,性能,灵活性三个方面做到了均衡,支持自己编写了SQL,对于Hibernate,提供的功能最佳完善,但是性能并不好
本章重点:
上面说的JdbcTemplate,MyBatis,Hibernate都是对JDBC的二次封装,就是为了简化数据
JdbcTemplate并不算的上是ORM的框架,因为需要自己编写SQL语句,但是相比较于Hibernate这种全自动ORM框架,MyBatis算是一种半自动化的ORM框架
课后思考:
有什么框架能切实的提高开发效率,减少不必要的体力劳动
JackSon