MyBatis的前身的iBatis,本质是一种半自动的ORM框架,除了POJO与映射关系之外,还需要编写SQL语句。
什么是ORM呢?
对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
摘自:https://blog.csdn.net/papima/java/article/details/78219000
简而言之,ORM就是将Java开发中的对象转成数据库中实体的中间件。
为什么需要ORM
如果不采用这些中间件,就需要我们手动来完成转换过程,也就是每个程序员入门时都被“安排”过的JDBC。先来看一段正常的JDBC代码:
// STEP 1: 导包,设置地址以及密码等常量
...
// STEP 2: 注册mysql的驱动
Class.forName(JDBC_DRIVER);
// STEP 3: 获得一个连接
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// STEP 4: 创建一个查询
String sql;
sql = "SELECT * FROM t_user where userName= ? ";
stmt = conn.prepareStatement(sql);
stmt.setString(1,"test");
// STEP 5: 执行sql语句
ResultSet rs = stmt.executeQuery();
// STEP 6: 从resultSet中获取数据并转化成bean(ORM框架要做的事情)
while (rs.next()) {
TUser user = new TUser();
user.setId(rs.getInt("id"));
user.setUserName(rs.getString("userName"));
user.setRealName(rs.getString("realName"));
user.setSex(rs.getByte("sex"));
user.setMobile(rs.getString("mobile"));
user.setEmail(rs.getString("email"));
user.setNote(rs.getString("note"));
users.add(user);
}
// STEP 7: 关闭连接
rs.close();
stmt.close();
conn.close();
} catch (SQLException se) {
// Handle errors for JDBC
se.printStackTrace();
} catch (Exception e) {
// Handle errors for Class.forName
e.printStackTrace();
} finally {
// finally block used to close resources
try {
if (stmt != null)
stmt.close();
} catch (SQLException se2) {
}// nothing we can do
try {
if (conn != null)
conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
仅仅是一个查询就需要七步,并且业务代码与技术代码耦合相当严重,自然会被MyBatis所取代。赶快来学起来,简化自己的开发吧!
MyBatis是JDBC的封装,使用上较为简洁,但实质还是在此。
MyBatis快速入门
1.在pom.xml中加入MyBatis的相关依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
2.添加MyBatis的相关配置文件
MyBatis有三种配置文件:
2.1 全局配置mybatis-config.xml,用来定义数据库连接以及加载mapper文件。以下是一些常用的配置
<?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>
<!-- 引入一个配置文件,当前文件可以通过${}来拿取值 -->
<properties resource="db.properties" />
<settings>
<!-- 设置自动驼峰转换,可以将表中字段映射成驼峰的POJO-->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。默认每种属性按需加载 -->
<setting name="aggressiveLazyLoading" value="true" />
</settings>
<!-- 别名定义,在Mapper文件中体现 -->
<typeAliases>
<package name="com.enjoylearning.mybatis.entity" />
</typeAliases>
<!--配置environment环境 -->
<environments default="development">
<!-- 可配置多个,每个SqlSessionFactory对应一个环境 -->
<environment id="development1">
<!-- 事务配置 type= JDBC、MANAGED
1.JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。
2.MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false -->
<transactionManager type="JDBC" />
<!-- <transactionManager type="MANAGED"> <property name="closeConnection"
value="false"/> </transactionManager> -->
<!-- 数据源类型:type = UNPOOLED、POOLED、JNDI
1.UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。 不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的
2.POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。 这是一种当前Web应用程序用来快速响应请求很流行的方法。
3.JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用 -->
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/xhm" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
<!-- 映射文件,mapper的配置文件 -->
<mappers>
<!--直接映射到相应的mapper文件 -->
<mapper resource="sqlmapper/TUserMapper.xml" />
<mapper resource="sqlmapper/TRoleMapper.xml" />
<mapper resource="sqlmapper/TJobHistoryMapper.xml" />
<mapper resource="sqlmapper/TPositionMapper.xml" />
<mapper resource="sqlmapper/THealthReportFemaleMapper.xml" />
<mapper resource="sqlmapper/THealthReportMaleMapper.xml" />
</mappers>
</configuration>
2.2 Mapper文件,具体的sql语句文件
<?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="com.enjoylearning.mybatis.mapper.TUserMapper">
<!-- 开启二级缓存,默认关闭 -->
<cache></cache>
<!-- 此处的resultType是返回的实体类,因为配置了别名的缘故,不需要写全限定名。 -->
<select id="selectByPrimaryKey" resultType="TUser" >
select
id, userName, realName, sex, mobile, email, note
from t_user
where id = #{id,jdbcType=INTEGER}
</select>
...
</mapper>
2.3 Mapper接口,与Mapper文件一一对应(通过namespace + id来指定),定义了对表的一系列操作,是日常操作的接口。
3.实现对数据库的访问
//--------------------第一阶段---------------------------
// 1.读取mybatis配置文件创SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2.读取mybatis配置文件创SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
inputStream.close();
//--------------------第二阶段---------------------------
// 3.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.获取对应mapper 每一次都是新的对象
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
//--------------------第三阶段---------------------------
// 5.执行查询语句并返回单条数据
TUser user = mapper.selectByPrimaryKey(1);
System.out.println(user);
MyBatis具体组件
通过上面的实例,可以看到MyBatis有这么几大组件:
SqlSessionFactoryBuilder:读取配置信息创建SqlSessionFactory,建造者模式,方法级别生命周期;
SqlSessionFactory:创建Sqlsession,工厂单例模式,存在于程序的整个生命周期;
SqlSession:代表一次数据库连接,一般通过调用Mapper访问数据库。但其实它也可以直接发送SQL执行,是一个外观模式;
SQL Mapper:由一个Java接口和XML文件组成,包含了要执行的SQL语句和结果集映射规则。