ORM框架中Mbatis独占一席,因此在web开发中了解Mybatis很重要,所以在这里总结下Mybatis的使用
首先得理解何为ORM(Object Relational Mapping)即对象关系映射,从名字中就了解到了重点:
- 对象:包含 Java对象和数据库对象
- 关系:java对象和数据库对象的关系
- 映射:通过映射的方式来确定java对象和数据库对象直接的关系(属于数学中的一对一映射)
了解了以上概念则了解了ORM框架所要实现的目的,Java存在多态,ORM也存在多态,Mybatis只是其中的一种实现方法,它的优点为:
- 映射关系可以为动态
- 原生SQL语句,便于对SQL的优化,提高产品性能
- SQL语句与Java类的分离,便于维护
- 灵活、轻量的半自动ORM框架
为了从基础了解Mybatis,首先从Java项目中Mybatis的使用开始,这里为maven java工程
IDE:IntelIj idea
POM:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
</dependencies>
log4j.properties:
log4j.rootLogger = dubug , console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern =[%p]-[%c] %m%n
以上为基本配置,分别为maven提供的jar包依赖、log4j日志系统
- SqlSessionFactoryBuilder:SqlSessionFactory的建造者,用于构造SqlSessionFactory(SqlSession的工厂接口)
- SqlSessionFactory:用于构造SqlSession
- SqlSession:用于直接发送SQL执行并返回结果语句或者获取Mapper接口来执行SQL语句并返回结果
- SQL Mapper:由一个Java接口和XML文件组成,用于发送SQL并返回结果
- SqlSessionFactory的创建:(完成自身信息维护)
- SqlSessionFactory是由SqlSessionFactoryBuilder创建:而SqlSessionFactoryBuilder内部维护了一个configuration对象,该对象保存Mybatis的配置信息,SqlSessionFactoryBuilder使用configuration对象来创建SqlSessionFactory接口
- SqlSessionFactory有2个实现类:DefaultSqlSessionFactory(使用中)和SqlSessionManager(尚未使用),通过DefaultSqlSessionFactory创建SqlSessionFactory实例
- 因此这里需要一个configuration对象,该对象是通过XML配置方式或者Java编码方式创建
- SqlSession的创建:
- 通过SqlSessionFactory实例创建SqlSession,这里SqlSession是一个接口,有2个实现类:DefaultSqlSession(使用中)和SqlSessionManager(尚未使用),通过DefaultSqlSession创建SqlSession实例
- 这里有默认实现,因此不需要任何额外操作
- SQL Mapper(映射器)的创建:(完成ORM中的R和M)
- 映射器由2部分组成:Java接口、XML文件(或者采用注解的方式将XML对应内容写在Java接口中,由于注解功能有限不推荐此方式)
- 映射器的2部分均由用户创建,因此这里需要创建Java接口和XML配置文件
- 结果集的封装(完成ORM中的O)
- 在对于select语句即数据库有返回的时候需要对结果集进行封装,将数据库对象转为Java对象
- 这个Java对象在这里有个专门的名称:POJO(Plain Ordinary Java Object)简单Java对象
- 这个对象需要用户创建:因此这里需要一个Java类
- 至此:一个对数据库的操作流程大致完成
- configuration对象的配置:通过XML完成
- 映射器的配置:通过Java接口和XML完成
- 结果集的封装:通过Java类完成
这里将完成一个简单的示例:
数据库对象:
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`source` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
1.configuration配置:MybatisConfig.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="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="IStudentDao.xml"/>
</mappers>
</configuration>
2.映射器的配置:
1).Java接口
package sean.student.dao;
import sean.student.domain.StudentDomain;
import sean.student.entity.Student;
import java.util.List;
public interface IStudentDao {
List<Student> getStudentPageList(StudentDomain studentDomain);
}
2).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="sean.student.dao.IStudentDao">
<select id="getStudentPageList" parameterType="sean.student.domain.StudentDomain" resultType="sean.student.entity.Student">
select id,name,source from student
</select>
</mapper>
3.结果集封装:POJO对象
package sean.student.entity;
public class Student {
private String name;
private String id;
private Integer source;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Integer getSource() {
return source;
}
public void setName(String name) {
this.name = name;
}
public void setId(String id) {
this.id = id;
}
public void setSource(Integer source) {
this.source = source;
}
}
二次封装:
package sean.student.domain;
import sean.student.entity.Student;
public class StudentDomain {
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
测试类:
package sean.student.dao;
import junit.framework.TestCase;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import sean.student.domain.StudentDomain;
import sean.student.entity.Student;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class IStudentDaoTest extends TestCase {
public void test() throws IOException {
String resource= "mybatisConfig.xml";
InputStream in= Resources.getResourceAsStream(resource);
SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession=factory.openSession();
IStudentDao iStudentDao=sqlSession.getMapper(IStudentDao.class);
List<Student> studentList=iStudentDao.getStudentPageList(new StudentDomain());
for (int i = 0; i < studentList.size(); i++) {
System.out.printf(studentList.get(i).getName()+"\n");
}
}
}
控制台:
[DEBUG]-[org.apache.ibatis.datasource.pooled.PooledDataSource] Created connection 1361289747.
[DEBUG]-[org.apache.ibatis.transaction.jdbc.JdbcTransaction] Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@5123a213]
[DEBUG]-[sean.student.dao.IStudentDao.getStudentPageList] ==> Preparing: select id,name,source from student
[DEBUG]-[sean.student.dao.IStudentDao.getStudentPageList] ==> Parameters:
[DEBUG]-[sean.student.dao.IStudentDao.getStudentPageList] <== Total: 3
Tom
John
Alice
至此:一个Mybatis的简单流程完成
下一节将对以上文件进行介绍,以及各文件存放位置的推荐