本文共 6547 字,大约阅读时间需要 21 分钟。
主要内容:
- What is MyBatis?
- Why MyBatis?
- Installing and configuring MyBatis
- Sample domain model
MyBatis是一个开源持久化框架,用于简化持久层的实现。Mybatis可以减少很多JDBC相关的模板样式代码,还提供了方便使用的数据库API。
MyBatis发展自iBATIS,但是MyBatis 3对iBATIS进行了彻底的重构,从而可以使用注解(annotations)和映射器(Mappers)。
简洁的设计和易用性使得MaBatis在J2EE开发中很快流行起来。在Java应用中,持久层的工作包括:将SQL语句从数据库中查询出的数据填充进Java对象中、使用SQL语句将Java对象中的数据保存进数据库。
MyBatis提供了下列特性来简化SQL查询:(1)抽象底层的JDBC代码;(2)自动将SQL查询的结果集保存进对应的Java对象;(3)从Java对象中提取数据并存入数据库中对应的表。
企业级应用开发领域有很多持久化开发框架,MyBatis能够脱颖而出的原因在于:
关于JDBC代码的冗长,可以参考一文中用过的例子。
直接使用JDBC的API,会有很多重复代码:创建连接、创建statement、设置输入参数,最后还需要关闭资源。MyBatis将这些通用功能抽象出来单独完成,以便开发者可以专注于真正重要的事情,包括书写SQL语句、构建Java对象等。
除了这些,MyBatis可以自动完成两个工作:把Java对象中的属性设置进SQL字符串的查询参数、利用SQL查询结果集的数据构造Java对象。实现方法如下:
INSERT INTO STUDENTS(STUD_ID, NAME, EMAIL, DOB) VALUES (#{studId}, #{name}, #{email}, #{dob})
public interface StudentMapper { Student findStudentById(Integer id); void insertStudent(Student student);}
SqlSession session = getSqlSessionFactory().openSession();StudentMapper mapper = session.getMapper(StudentMapper.class);// select Student by IdStudent student = mapper.selectStudentById(1);// To insert a Student recordmapper.insertStudent(student);
可以看出,如果使用MyBatis框架,开发者不需要自己管理资源和处理异常,因为MyBatis会替你完成这些工作。除此之外,MyBatis还提供了其他特性,也可以简化持久层的实现:
MyBatis的学习曲线很低,如果开发者之前熟悉Java和SQL开发,则只需要稍作学习就可以在项目中使用MyBatis。
有时候,我们需要使用不规范的遗留数据库。在维护老服务时经常遇到这种情况,使用类似Hibernate的ORM框架会非常麻烦,因为这类框架试图将Java对象映射到数据库中的表格里。
MyBatis可以自动将查询结果映射到Java对象中,这个特性使得MyBatis非常适合使用遗留数据库。
完全的ORM框架,例如Hibernate鼓励开发者直接使用实体对象,而由框架自动产生SQL语句。正因如此,导致开发者不能使用特定数据库的优化特性。Hibernate也允许开发者写SQL语句,但这又违背了“持久层应该与数据库独立”的承诺。
MyBatis让开发者自己写SQL语句,因此可以利用特定数据库的优化特性,例如支持使用数据库存储过程。
MyBatis本身支持在SqlSession层面缓存SELECT查询结果。除此之外,MyBatis也支持使用其他第三方缓存,例如EHCache、OSCache和Hazelcast。
大型企业级应用必须具备良好的性能。在性能分析时,一般使用调用链路分析法:业务操作、缓存操作和持久层。持久层的性能经常会成为应用的性能瓶颈。
注意:在软件开发中没有万能的工具。每个应用场景都有不同的需求,我们应该根据具体的应用场景选择要使用的语言和框架。上文中讲了很多MyBatis的优势,不过,也有一些情况下并不适合使用MyBatis。如果应用是基于对象模型驱动并想动态生成SQL语句;另外,如果开发者希望在应用中使用透明的事务处理机制(持久化父对象的同时也持久化与之关联的子对象),这两种情况下都比较适合使用Hibernate。
在数据库中创建students表,并插入例子数据;
create table students(stud_id int(11) not null auto_increment,name varchar(50) not null,email varchar(50) not null,dob date default null,primary key (stud_id)) engine=InnoDB auto_increment=1 default charset=latin1;insert into students(stud_id, name, email, dob)values(1, 'Student1', 'student1@gmail.com', '1983-06-25');insert into students(stud_id, name, email, dob)values(2, 'Student2', 'student2@gmail.com', '1983-06-25');
创建一个maven项目,配置jar依赖项,pom文件的内容如下:
4.0.0 com.javadu leanMybatis 1.0-SNAPSHOT io.spring.platform platform-bom 2.0.1.RELEASE pom import org.springframework spring-framework-bom 4.2.4.RELEASE pom import org.mybatis mybatis 3.3.0 mysql mysql-connector-java 5.1.38 runtime org.slf4j slf4j-api 1.7.13 org.slf4j slf4j-log4j12 1.7.13 log4j log4j 1.2.17 junit junit 4.12 test
然后,在resources目录下创建log4j.properties文件,填入如下内容:
log4j.rootLogger = DEBUG, stdoutlog4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = %d[%-5p] %c - %m%n
创建mybatis-config.xml和StudentMapper.xml配置文件,mybatis-config.xml作为MyBatis的主配置文件,用于定义数据库连接、类型别名等等;StudentMapper.xml配置文件包含操作students表的SQL语句。
首先,mybatis-config.xml文件的内容列举如下:
然后,StudentMapper.xml文件的内容列举如下:
INSERT INTO students(stud_id, name, email, dob) VALUES (#{studId}, #{name}, #{email}, #{dob})
转载地址:http://fnilx.baihongyu.com/