MyBatis
前言-关于MyBatis
MyBatis的介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等繁杂的过程。
MyBatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。
MyBatis采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作
1、MyBatis入门
1、jdbc编程的基本操作回顾
1. 加载驱动
2. 获取连接
3. 定义sql语句
4. 预处理statement
5. 执行sql语句,获取结果集
6. 遍历结果集
7. 释放资源
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","ro ot", "root");
//定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
//获取预处理
statement preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的 参数值
preparedStatement.setString(1, "王五");
//向数据库发出 sql 执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
}
catch (Exception e) {
e.printStackTrace();
}
finally{
//释放资源
if(resultSet!=null){
try{resultSet.close();}catch (SQLException e) {e.printStackTrace();}
}
if(preparedStatement!=null){
try{preparedStatement.close();}catch (SQLException e) {e.printStackTrace();}
}
if(connection!=null){
try{connection.close();}catch (SQLException e) {e.printStackTrace();}
}
}
}
原始jdbc操作的问题:
1、数据库连接创建、释放频繁造成系统资源浪费,影响系统性能。
2、Sql 语句在代码中较为固定,造成代码不易维护,进行维护时需要修改源码。
3、使用 preparedStatement 向占位符传递参数时,参数可能不固定,有时需要写判断条件,费时费力。
4、对结果集的封装不够灵活,维护时极为不便。
2、引入MyBatis
1、创建maven工程并引入MyBatis所需要jar包的坐标
设置项目目录及项目名后,点击next,来到如下页面
到这里说明maven项目构建成功了
在pom.xml文件中写入如下配置
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
2、创建并配置MyBatis主配置文件
1、在Resource目录下创建 SqlMapConfig.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">
2、在 SqlMapConfig.xml文件中配置环境参数
<configuration >
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境 -->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"/>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb1?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
3、创建数据库实体类以及Dao接口
1、创建数据库实体类User,在这里要求成员变量名和数据库的列名一致
2、创建Dao层的接口IUserDao,在接口中声明一个方法,findAll();
package ldyy.dao;
import ldyy.dao.domain.User;
import java.util.List;
public interface IUserDao {
/**
* 查询所有操作
* @return User集合
*/
List<User> findAll();
}
注意 接口所在的包为main下的Java目录
4、创建映射文件IUserDao.xml及补全SqlMapConfig.xml文件
1、在Resource目录下创建于Java目录相同的目录结构,并在dao目录下创建IUserDao.xml文件
2、在IUserDao.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">
3、根据我们编写的接口配置xml文件
<mapper namespace="ldyy.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="ldyy.dao.domain.User">
select * from user;
</select>
</mapper>
4、补全SqlMapConfig.xml配置文件
<mappers>
<!--注解-->
<mapper class="ldyy/dao/IUserDao"/>
<!--xml-->
<mapper resource="ldyy/dao/IUserDao.xml"/>
</mappers>
在mappers标签中编写映射文件的地址
#### 5、编写测试类
public static void main(String[] args) throws Exception{
//1 读取配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
//3 使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4 使用SqlSession创建Dao接口的代理对象
IUserDao dao = session.getMapper(IUserDao.class);
//5 使用代理对象执行方法
List<User> users = dao.findAll();
//打印结果
for (User user : users) {
System.out.println(user);
}
//6 释放资源
session.close();
is.close();
}
打印结果
如果出现如下异常,请注释掉上文的注解的方式,因为我们还没书写注解。
3、MyBatis执行流程及原理分析
1、MyBatis执行流程与原jdbc操作对比
2、MyBatis执行流程分析
3、自定义MyBatis分析及源码
此部分参考 黑马57期MyBatis讲解
自定义MyBatis源码
链接:https://pan.baidu.com/s/13jOR79to-dvMb8JC2MOaQg
提取码:ylm5