写点什么

MyBatis 入门

用户头像
Simon郎
关注
发布于: 2020 年 07 月 02 日

MyBatis开山篇

1、MyBatis是什么?

MyBatis官方定义是这样描述的,MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML或注解来配置和映射原始类型、接口和 Java POJO。

上面文字描述太官方了,整体读下来可能仅仅了解到MyBatis是用于解决持久层方案的一款持久层框架,那么,在我们没有使用过MyBatis之前,我们使用各种各样的持久层技术来与数据库交互,这些技术和MyBatis有什么不同呢?

2、传统的持久层技术

  • JDBC技术

  • SpringJdbcTemplate

Spring中对jdbc进行简单的封装。

  • Apache的DButils

它和Spring的JdbcTemplate很像,也是对jdbc进行简单的封装

上面列举的都不是框架,JDBC是一种规范,而JdbcTemplate和Dbutils都只是工具类。

既然有那么多技术用于持久层,那么我们为什么还要学MyBatis呢,我们先使用JDBC技术实现对一个数据库表的操作,看看有什么特点

JDBC编码技术

执行流程

  • 加载数据库驱动

  • 获取数据库连接

  • 定义sql语句

  • 预处理

  • 遍历查询结果集

  • 关闭连接

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/test","root", "root");
//定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
//获取预处理 statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的 参数值
preparedStatement.setString(1, "Simon");
//向数据库发出 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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


大家应该很熟悉这段代码吧,使用原生的JDBC会出现什么样的问题呢

  • 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能。

  • Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。

  • 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能 多也可能少,修改 sql 还要修改代码,系统不易维护

  • 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护。

查询一条语句那么繁琐,我们当然希望可以将我们的主要精力放在sql上,那么MyBatis是否有能力帮我们解决呢?它的执行有什么特点呢?

3、MyBatis入门

事实上,MyBatis封装了jdbc操作的很多细节,它可以使开发者更多的关注sql语句本身,而无需关注注册驱动、创建链接等繁琐的过程,它使用ORM的思想实现对结果集的封装。

ORM全称是Object Relational Mapping,即对象关系映射,即把数据库表和实体类即实体类的属性对应起来,使得我们可以操作实体类就可以实现操作数据库表。

3.1MyBatis框架结构

  • SqlMapConfig.xml

MyBatis的全局配置文件,配置了MyBatis的运行环境等信息。

  • mapper.xml

mapper.xml文件,即sql映射文件,文件中配置了操作数据库的sql语句,需要在SqlMapperConfig.xml文件中加载

  • SqlSessionFactory

通过MyBatis环境等配置信息构造SqlSessionFactory会话工厂

  • SqlSession

由会话工厂创建sqlSession,操作数据库需要通过sqlSession进行

  • Executor

MyBatis底层自定义了Executor执行器接口操作的数据库,Executor接口有两个实现,一个是基本执行器,一个缓存执行器。

  • Mappered Statement

是一个底层封装对象,包装了MyBatis配置信息及sql映射信息等。

3.2MyBatis入门案例

  • 读取配置文件

  • 创建SqlSessionFactory工厂

  • 创建SqlSession

  • 创建Dao接口的代理对象

  • 执行dao中的方法

  • 释放资源

基于xml配置

  • SqlMapConfig配置文件

<?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>
<!--配置mybatis的环境-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&amp;serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!--告知mybatis的映射配置位置-->
<mappers>
<mapper resource="com/simon/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>

  • mapper.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="com.simon.dao.IUserDao">
<select id="findAll" resultType="com.simon.domain.User" >
select * from user
</select>
</mapper>

  • User实体类

package com.simon.domain;

import java.util.Date;

/**
* @Author: Simon Lang
* @Date: 2020/2/26 12:09
* @Version 1.0
*/
public class User {
private Integer id;
private String username;
private Date birthday;
private char sex;
private String address;

  • dao接口

public interface IUserDao {
public List<User> findAll();
}

  • 测试

//导入配置文件
InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
//创建sqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//使用构建者创建工厂对象sqlSessionFactory
SqlSessionFactory factory=builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//6.使用代理对象执行查询所有方法
List<User> users=userDao.findAll();
for (User user:users){
System.out.println(user);
}
session.close();
in.close();


基于注解

  • 修改SqlMapConfig.xml

<mappers>
<mapper class="com.simon.dao.IUserDao.xml"></mapper>
</mappers>

  • 移除IUserDao.xml配置文件,并在dao接口的方法上加入@(select * from user)

参考

https://mybatis.org/mybatis-3/zh/getting-started.html

https://www.cnblogs.com/benjieqiang/p/11183580.html



发布于: 2020 年 07 月 02 日阅读数: 75
用户头像

Simon郎

关注

自学;制学;博学 2019.10.09 加入

公众号:小郎码知答

评论

发布
暂无评论
MyBatis入门