目录
Mybatis框架简介
框架介绍
什么是框架,为什么使⽤框架,框架优点
?
框架(
framework
)是⼀个基本概念上的结构,⽤于去解决或者处理复杂的问题。
框架,即framework。其实就是某种应⽤的半成品,就是⼀组组件,供你选⽤完成你⾃⼰的系统。简单说就是使⽤别⼈搭好的舞台,你来做表演。 框架是在特定的领域内解决问题。
优点
:
1).
重⽤代码⼤⼤增加,软件⽣产效率和质量也得到了提⾼。
2).
使⽤框架开发,它提供统⼀的标准,⼤⼤降低了我们的后期维护。
java
开发中常⽤框架
:
1). springmvc spring mybatis(ibatis) -- SSM
2). SpringData SpringBoot SpringCloud
SSM框架在JavaEE开发中所处的位置:
原始JDBC操作查询
@Test
public void testQuery(){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/test_wensong","root", "root");
//定义sql语句 ? 表示占位符
String sql = " select * from user where username = ?";
//获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第⼀个参数为sql语句中参数的序号(从1开始),第⼆个参数为设置的参数值
preparedStatement.setString(1, "Tom");
//向数据库发出sql执⾏查询,查询出结果集
resultSet = preparedStatement.executeQuery();
List<User> userList = new ArrayList<User>();
//遍历查询结果集
while(resultSet.next()){
User user = new User();
user.setId(resultSet.getInteger("id"));
user.setUsername(resultSet.getString("username"))
user.setSex(resultSet.getString("sex"));
user.setAddress(resultSet.getString("address"));
userList.add(user);
}
} 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操作问题分析
原始
jdbc
开发存在的问题如下:
①
.
数据库连接创建、释放频繁造成系统资源浪费从⽽影响系统性能 。
②
. sql
语句在代码中硬编码,造成代码不易维护,实际应⽤
sql
变化的可能较⼤,
sql 变动需要改变 java
代码 。
③
. 查询操作时需要⼿动将结果集中的数据⼿动封装到实体中。插⼊操作时需要⼿动将实体的数据设置到
sql
语句的占位符位置 。
应对上述问题给出的解决⽅案:
①
.
使⽤数据库连接池初始化连接资源 。
②
.
将
sql
语句抽取到
xml
配置⽂件中 。
③
.
使⽤反射等底层技术,⾃动将实体与表进⾏属性与字段的⾃动映射 。
Mybatis框架介绍
mybatis
是⼀个优秀的基于
java
的持久层框架,它内部封装了
jdbc
,使开发者只需要关注
sql语句本身,⽽不需要花费精⼒去处理加载驱动、创建连接、创建
statement
等繁杂的过程 。
mybatis
通过
xml
或注解的⽅式将要执⾏的各种
statement
配置起来,并通过
java
对象和
statement
中sql 的动态参数进⾏映射⽣成最终执⾏的
sql
语句 。
最后
mybatis
框架执⾏
sql
并将结果映射为
java
对象并返回。采⽤
ORM思想解决了实体和数据库映射的问题,对
jdbc
进⾏了封装,屏蔽了
jdbc api
底层访问细节,使我们不⽤与
jdbc api 打交道,就可以完成对数据库的持久化操作 。
MyBatis
官⽹地址:
https://mybatis.org/mybatis-3/
Mybatis 架构
1). mybatis
配置⽂件
SqlMapConfig.xml
,此⽂件作为
mybatis
的全局配置⽂件,配置了
mybatis的运⾏环境等信息。mapper.xml
⽂件即
sql
映射⽂件,⽂件中配置了操作数据库的
sql语句。此⽂件需要在SqlMapConfig.xml
中加载。
2).
通过
mybatis
环境等配置信息构造
SqlSessionFactory
即会话⼯⼚
3).
由会话⼯⼚创建
sqlSession
即会话,操作数据库需要通过
sqlSession
进⾏。
4). mybatis
底层⾃定义了
Executor
执⾏器接⼝操作数据库,
Executor接⼝有两个实现,⼀个是基本执⾏器
BaseExecutor
、⼀个是缓存执⾏器
CachingExecutor
。
5). MappedStatement
也是
mybatis
⼀个底层封装对象,它包装了
mybatis
配置信息及
sql映射信息等。mapper.xml
⽂件中⼀个
sql
对应⼀个
MappedStatement
对象,
sql
的
id
即是
Mapped statement
的
id
。
6). MappedStatement
对
sql
执⾏输⼊参数进⾏定义,包括
HashMap
、基本类型、
pojo
,
Executor通过Mapped Statement
在执⾏
sql
前将输⼊的
java
对象映射⾄
sql
中,输⼊参数映射就是
jdbc编程中对 preparedStatement
设置参数。
7). MappedStatement
对
sql
执⾏输出结果进⾏定义,包括
HashMap
、基本类型、
pojo
,
Executor通过Mapped Statement
在执⾏
sql
后将输出结果映射⾄
java
对象中,输出结果映射过程相当于
jdbc编程中对结果的解析处理过程。
Mybatis快速入门
开发步骤
①
.
添加
MyBatis
的坐标
②
.
准备数据库环境
③
.
编写
User
实体类
④
.
编写核⼼⽂件
SqlMapConfig.xml
⑤
.
编写映射⽂件
UserMapper.xml
⑥
.
编写测试类
环境搭建
1 导⼊依赖
<!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--单元测试坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--lombok坐标-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<!--⽇志坐标-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2准备数据库环境
create database mybatis;
use mybatis;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '⽤户名称',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user` (`id`, `username`, `sex`, `address`)
values(NULL,'Tom','男','北京');
insert into `user` (`id`, `username`, `sex`, `address`)
values(NULL,'Jack','男','上海');
insert into `user` (`id`, `username`, `sex`, `address`)
values(NULL,'Rose','⼥','⻄安');
insert into `user` (`id`, `username`, `sex`, `address`)
values(NULL,'Poll','⼥','利⽐亚');
3编写
User
实体
@Data
public class User {
private Integer id;
private String username;
private String sex;
private String address; }
4
编写
MyBatis核心文件
⽂件名
: 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">
<configuration>
<!--配置数据库运⾏环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test_wensong"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--配置关联的SQL语句的映射⽂件-->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
5
编写
UserMapper
映射⽂件
⽂件名
: 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="userMapper">
<!--查询所有⽤户-->
<select id="findAll" resultType="com.wensong.pojo.User">
select * from user
</select>
</mapper>
6
查询所有用户
public class UserTest {
@Test
public void findAllTest() throws IOException {
//加载核⼼配置⽂件 SqlMapConfig.xml
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造SQLSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//构造SQLSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执⾏查询语句
List<User> userList = sqlSession.selectList("userMapper.findAll");
for (User user : userList) {
System.out.println("user = " + user);
}
//释放资源
sqlSession.close();
}
}
查询结果显示:
知识小结
1). 搭建环境, 导⼊依赖
mybatis , mysql数据库驱动, junit , lombok
2). 准备数据库环境
3). 编写实体类User
4). 编写核⼼配置⽂件
A. mybatis的运⾏环境 -----> <environments>
B. 加载映射配置⽂件 -------> <mappers>
5). 编写映射配置⽂件
SQL语句
6). 编写测试代码
A. 加载Mybatis的核⼼配置⽂件
B. 构造SqlSessionFactory
C. 构造SqlSession
D. 调⽤SqlSession中的selectList执⾏查询
E. 释放资源