前言
什么是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 configurationPUBLIC "-//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 mapperPUBLIC "-//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 configurationPUBLIC "-//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;@Beforepublic void testBefore(){sqlSession= SQLSessionFactoryUtil.getSessionSql();}@Testpublic void testUser(){UserDao mapper = sqlSession.getMapper(UserDao.class);for (User user : mapper.selectUsers()) {System.out.println(user.getUserId()+","+user.getUserName());}}
}
总结
以上是一个基本的Mybatis查询表中所有信息的实践案例,其他的增删改操作步骤,都是类似的,学习最基础的一个查询所有的操作,可以帮助我们快速入门mybatis的学习。