前言
什么是mybatis?
MyBatis是一款优秀的持久层框架,用于简化Java应用程序与数据库之间的交互
什么是框架,为什么需要框架技术?
- 框架技术
- 是一个应用程序的半成品
- 提供可重用的公共结构
- 按一定规则组织的一组组件
- 框架优势:
- 不用再考虑公共问题
- 专心在业务实现上
- 结构统一,易于学习、维护
- 新手也可写出好程序
- 框架缺点(对于新手):
- 对于没有基础的新手老说,学习框架意味着更多的学习成本
简而言之,使用框架技术,可以帮助我们快速的构建一个项目的基本结构,使得我们不必重复书写一些繁琐的代码,释放程序员的精力,从而使得程序员可以更加关注业务代码的实现
什么是持久层框架?
持久化是程序数据在瞬时状态和持久状态间转换的过程
简单讲,就是将我们内存中运行的数据保存在数据库中,即使我们停止程序的运行,数据仍然存在在数据库中,而不会消失。
MyBatis的起源和特点
一、MyBatis的起源与发展
- MyBatis最初是Apache的一个开源项目iBatis,2010年该项目由Apache Software Foundation迁移到了Google Code,并改名为MyBatis。
- 2013年11月,MyBatis项目迁移到Github,至今仍在持续更新和发展。
- 当前,MyBatis的最新版本是3.5.x系列,如3.5.13等,这些版本在功能和性能上不断优化,以满足开发者的需求。
二、MyBatis的特点
- 简化JDBC开发:MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建Statement等繁杂的过程,开发者只需要关注SQL语句本身。
- 支持定制化SQL:MyBatis支持定制化SQL、存储过程以及高级映射,可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(对象关系映射)实现。
- 灵活性与易用性:MyBatis提供了XML或注解两种方式来配置和映射原生信息,使得开发者可以根据项目需求灵活选择。同时,MyBatis的架构清晰,易于学习和使用。
- 性能优秀:MyBatis采用了一级缓存和二级缓存机制,可以有效地减少与数据库的交互次数,提高数据库操作的性能。
- 易于集成和扩展:MyBatis与Spring等主流Java框架无缝集成,可以通过简单的配置完成整合。同时,MyBatis提供了插件机制,可以自定义插件来扩展其功能。
三、MyBatis的工作原理
MyBatis的工作流程大致可以分为以下几个步骤:
- 加载配置并初始化:MyBatis在启动时会加载配置文件(如mybatis-config.xml),将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),并存储在内存中。
- 接收调用请求:当开发者通过MyBatis提供的API调用数据库操作时,会传入SQL的ID和参数对象。
- 处理操作请求:MyBatis会根据SQL的ID查找对应的MappedStatement对象,并根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL语句和参数。然后,MyBatis会获取数据库连接,执行SQL语句,并处理执行结果。
- 返回处理结果:MyBatis将执行结果按照MappedStatement对象中的结果映射配置进行转换处理,并最终将处理结果返回给开发者。
四、MyBatis的应用场景
MyBatis广泛应用于各种Java应用程序中,特别是在需要频繁进行数据库操作的场景下。例如,在电商系统、金融系统、CRM系统等中,MyBatis都发挥着重要的作用。通过MyBatis,开发者可以更加高效、便捷地进行数据库操作,提高开发效率和系统性能。
综上所述,MyBatis是一款功能强大、灵活易用的持久层框架,它简化了Java应用程序与数据库之间的交互过程,提高了开发效率和系统性能。
Mybatis简介
- MyBatis前身是iBatis,本是Apache的一个开源的项目
- 官方网站
- mybatis(国内可能访问不到)
- ORM框架
- 实体类和SQL语句之间建立映射关系
- 特点
- 基于SQL语法,简单易学
- 能了解底层封装过程
- SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
- 方便程序代码调试
- MyBatis 是支持普通SQL查询,动态sql和高级结果映射的优秀持久层框架。
- MyBatis 几乎封装了所有必须但是又重复、繁琐的JDBC 代码
- MyBatis 使用简单的 XML 方式进行主要的配置和SQL映射配置,从而将接口的方法映射到sql,将 Java 的POJOs(Plan Old Java Objects,普通的 Java象)映射成数据库中的记录。
MyBatis入门实践-查询用户信息
我将通过一个基础的mybatis查询mysql数据表的操作,演示mybatis开发的整体流程
Mybatis执行流程分析:
书写mybatis的基本步骤:
1. 导包
2.实体类 (注意:属性名最好和字段命名一致,这样就可以不用手动映射了)
3.主配置文件
4.读取主配置文件和获取SqlSession对象的工具类
SqlSessionFactoryUtil
SqlSession=factory.openSession();
5.创建接口
6.创建mapper ,namespace就是接口的完整路径
7.编写相应的标签,id是与其绑定的接口的方法名,resultType是返回值类型,如果是集合,可以设置为它的泛型(实体类类型)
8.将mapper的完整路径注册在mybatis.xml主配置文件的<envoriments>的下面
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper></mappers>
9.编写测试类
Dao dao=new Sqlsession.getMapper(Dao.class);
dao.调用定义的方法
完整项目结构如下:
我创建的是JavaWeb项目(有webapp目录),实际上在这个项目中,只需要创建一个普通的maven项目即可
第一步:打开idea,创建一个maven项目,导入相关依赖包
pom.xml:
导入如下四个依赖:
其中:
mysql-connector-java 和mybatis是实现mybatis必须导入的依赖。
junit和lombok是为了进行单元测试和使用lombok注解简化开发而导入的依赖。
<!--junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--jdbc连接数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
第二步:创建数据库表和对应的实体类
例如:
用户表t_user
user_pic存放着用户的头像的照片全名,在这个项目中实际上可以没有这个字段
User实体类
实体类的属性命名如果和字段名一致,后面书写sql语句时就不需要手动进行映射,如果不一致,需要进行映射。
package entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer userId;
private String userName;
private String password;
private String userPic;
}
第三步:创建myabtis的主配置文件
mybatis.xml
配置连接数据库的相关参数
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/csx_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
第四步:创建读取主配置文件和获取SqlSession对象的工具类
SQLSessionFactoryUtil
目的是为了创建一个SqlSessionFactory会话工厂,并且返回SqlSession会话。
package util;
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 java.io.IOException;
import java.io.Reader;
public class SQLSessionFactoryUtil {
private static SqlSessionFactory factory;
private SQLSessionFactoryUtil(){}
static {
Reader reader=null;
try{
reader= Resources.getResourceAsReader("mybatis.xml");
factory=new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSession getSessionSql(){
return factory.openSession();
}
}
第五步:创建DAO层的接口
UserDao
package dao;
import entity.User;
import java.util.List;
public interface UserDao {
public List<User> selectUsers();
}
第六步:创建mapper.xml配置文件绑定接口和sql的映射关系,定义SQL语句
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为映射的根节点,用来管理DAO接口
namespace指定DAO接口的完整类名,表示mapper配置文件管理哪个DAO接口(包.接口名)
mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象
-->
<mapper namespace="dao.UserDao">
<select id="selectUsers" resultType="entity.User">
select user_id as userId,user_name as userName from t_user
</select>
<!--
id = "接口中的方法名"
parameterType = "接口中传入方法的参数类型"
resultType = "返回实体类对象:包.类名" 处理结果集 自动封装
注意:sql语句后不要出现";"号
查询:select标签
增加:insert标签
修改:update标签
删除:delete标签
-->
</mapper>
第七步:将mapper的完整路径注册在mybatis.xml主配置文件下
mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/csx_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
第八步:编写测试类,测试sql
UserTest
如果有多个测试,可以将SqlSession放在@Before注解下的方法中进行初始化操作
import dao.UserDao;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;
import util.SQLSessionFactoryUtil;
public class UserTest {
private SqlSession sqlSession;
@Before
public void testBefore(){
sqlSession= SQLSessionFactoryUtil.getSessionSql();
}
@Test
public void testUser(){
UserDao mapper = sqlSession.getMapper(UserDao.class);
for (User user : mapper.selectUsers()) {
System.out.println(user.getUserId()+","+user.getUserName());
}
}
}
总结
以上是一个基本的Mybatis查询表中所有信息的实践案例,其他的增删改操作步骤,都是类似的,学习最基础的一个查询所有的操作,可以帮助我们快速入门mybatis的学习。