教育网站制作设计,社交电商软件开发,推广软文案例,o2o电子商务模式是指MyBatis从入门到精通#xff1a;一站式学习指南
作为一款优秀的半自动ORM框架#xff0c;MyBatis以其灵活的SQL控制和简洁的配置方式#xff0c;成为Java后端开发中持久层框架的首选。本文将从基础概念到高级特性#xff0c;全面讲解MyBatis的使用方法#xff0c;包含实用…MyBatis从入门到精通一站式学习指南
作为一款优秀的半自动ORM框架MyBatis以其灵活的SQL控制和简洁的配置方式成为Java后端开发中持久层框架的首选。本文将从基础概念到高级特性全面讲解MyBatis的使用方法包含实用代码示例和最佳实践。
一、MyBatis核心概念
1. 什么是MyBatis
MyBatis是一款半自动ORM对象关系映射框架本质是对JDBC的封装。与全自动ORM框架如Hibernate不同MyBatis需要开发者手动编写SQL语句但免除了JDBC中繁琐的连接管理、参数设置和结果集解析工作。
其核心优势在于
支持自定义SQL便于复杂查询和性能优化强大的结果映射能力自动完成数据库记录与Java对象的转换轻量灵活易于集成Spring等主流框架适用于高并发、大数据量的互联网项目
2. 核心组件
MyBatis的工作流程依赖于以下核心组件
SqlSessionFactory会话工厂由SqlSessionFactoryBuilder根据配置文件创建全局唯一SqlSession数据库会话对象用于执行SQL操作生命周期为方法级Mapper接口定义数据库操作方法的接口无需实现类MyBatis通过动态代理生成实现映射文件存储SQL语句和映射规则与Mapper接口对应
二、环境搭建Maven
1. 引入依赖
在pom.xml中添加MyBatis核心依赖和数据库驱动
dependencies!-- MyBatis核心包 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.7/version/dependency!-- MySQL驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.26/version/dependency!-- 单元测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency
/dependencies2. 核心配置文件
创建mybatis-config.xml放在resources目录下配置数据库连接和映射文件
?xml version1.0 encodingUTF-8?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- 环境配置 --environments defaultmysqlenvironment idmysqltransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis_db?serverTimezoneUTC/property nameusername valueroot/property namepassword valueroot//dataSource/environment/environments!-- 注册映射文件 --mappersmapper resourcemapper/UserMapper.xml//mappers
/configuration三、基本CRUD操作
1. 定义实体类
创建与数据库表对应的POJO类
public class User {private Integer id;private String username;private String sex;private String address;// 省略getter、setter和toString方法
}2. Mapper接口与映射文件
1Mapper接口
public interface UserMapper {// 查询所有用户ListUser findAll();// 根据ID查询User findById(Integer id);// 新增用户void add(User user);// 更新用户void update(User user);// 删除用户void delete(Integer id);
}2映射文件UserMapper.xml
?xml version1.0 encodingUTF-8?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.mapper.UserMapper!-- 查询所有 --select idfindAll resultTypecom.example.pojo.Userselect * from user/select!-- 根据ID查询 --select idfindById parameterTypeint resultTypecom.example.pojo.Userselect * from user where id #{id}/select!-- 新增 --insert idadd parameterTypecom.example.pojo.Userinsert into user(username, sex, address) values(#{username}, #{sex}, #{address})/insert!-- 更新 --update idupdate parameterTypecom.example.pojo.Userupdate user set username #{username}, sex #{sex}, address #{address} where id #{id}/update!-- 删除 --delete iddelete parameterTypeintdelete from user where id #{id}/delete
/mapper3. 测试代码
public class UserMapperTest {private SqlSession session;private UserMapper userMapper;Beforepublic void init() throws IOException {// 读取配置文件InputStream is Resources.getResourceAsStream(mybatis-config.xml);// 创建SqlSessionFactorySqlSessionFactory factory new SqlSessionFactoryBuilder().build(is);// 获取SqlSessionsession factory.openSession();// 获取Mapper代理对象userMapper session.getMapper(UserMapper.class);}Testpublic void testFindAll() {ListUser users userMapper.findAll();users.forEach(System.out::println);}Testpublic void testAdd() {User user new User();user.setUsername(张三);user.setSex(男);user.setAddress(北京);userMapper.add(user);session.commit(); // 手动提交事务}Afterpublic void destroy() {session.close();}
}注意MyBatis的事务默认手动提交执行增删改操作后需调用session.commit()。四、动态SQL
动态SQL是MyBatis的强大特性可根据条件动态生成SQL片段避免手动拼接SQL的繁琐和错误。
1. if标签条件判断
select idfindByCondition parameterTypecom.example.pojo.User resultTypecom.example.pojo.Userselect * from userwhereif testusername ! null and username ! and username like #{username}/ifif testsex ! null and sex ! and sex #{sex}/if/where
/selectwhere标签会自动处理多余的AND替代传统的where 11写法
2. foreach标签遍历集合
用于批量操作如批量删除
delete iddeleteBatch parameterTypeintdelete from user where id inforeach collectionarray open( close) separator, itemid#{id}/foreach
/deletecollection集合类型数组用arrayList用listitem遍历的元素名open/closeSQL片段的开始/结束符separator元素间的分隔符
3. choose标签多条件分支
类似Java的switch-case
select idfindByLevel parameterTypeUser resultTypeUserselect * from userwherechoosewhen testlevel 1and age lt; 18/whenwhen testlevel 2and age between 18 and 30/whenotherwiseand age gt; 30/otherwise/choose/where
/select五、缓存机制
MyBatis提供两级缓存用于减少数据库交互提高查询效率。
1. 一级缓存
作用域SqlSession会话级特性默认开启同一SqlSession内的相同查询会复用缓存失效场景执行增删改操作、调用clearCache()或commit()、关闭SqlSession
Test
public void testL1Cache() {// 第一次查询从数据库获取User user1 userMapper.findById(1);// 第二次查询从一级缓存获取User user2 userMapper.findById(1);System.out.println(user1 user2); // true
}2. 二级缓存
作用域SqlSessionFactory应用级特性需手动开启同一工厂创建的SqlSession共享缓存要求缓存的POJO需实现Serializable接口
开启步骤
配置全局开关mybatis-config.xml
settingssetting namecacheEnabled valuetrue/
/settings在映射文件中声明缓存
mapper namespacecom.example.mapper.UserMappercache size1024/ !-- 开启二级缓存 --!-- SQL语句... --
/mapper实体类实现序列化
public class User implements Serializable {// 字段和方法...
}六、关联查询
MyBatis支持一对一、一对多等关联查询通过association和collection标签实现。
1. 一对一查询如学生-班级
resultMap idstudentMap typecom.example.pojo.Studentid propertyid columnsid/result propertyname columnsname/!-- 关联班级对象 --association propertyclazz columncid javaTypecom.example.pojo.Clazzid propertyid columncid/result propertyname columncname//association
/resultMapselect idfindStudentWithClazz resultMapstudentMapselect s.id sid, s.name sname, c.id cid, c.name cnamefrom student s left join clazz c on s.cid c.id
/select2. 一对多查询如班级-学生
resultMap idclazzMap typecom.example.pojo.Clazzid propertyid columncid/result propertyname columncname/!-- 关联学生集合 --collection propertystudents columncid ofTypecom.example.pojo.Studentid propertyid columnsid/result propertyname columnsname//collection
/resultMapselect idfindClazzWithStudents resultMapclazzMapselect c.id cid, c.name cname, s.id sid, s.name snamefrom clazz c left join student s on c.id s.cid
/select七、MyBatis Generator自动生成代码
MyBatis GeneratorMBG是官方代码生成器可根据数据库表自动生成POJO、Mapper接口和映射文件减少重复工作。
1. 配置MBG插件pom.xml
buildpluginsplugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.3.7/versionconfigurationconfigurationFilesrc/main/resources/generatorConfig.xml/configurationFileoverwritetrue/overwrite/configuration/plugin/plugins
/build2. 编写配置文件generatorConfig.xml
?xml version1.0 encodingUTF-8?
!DOCTYPE generatorConfigurationPUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//ENhttp://mybatis.org/dtd/mybatis-generator-config_1_0.dtd
generatorConfiguration!-- 数据库驱动路径 --classPathEntry locationF:/maven/repository/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar/context idmysql targetRuntimeMyBatis3!-- 去除注释 --commentGeneratorproperty namesuppressAllComments valuetrue//commentGenerator!-- 数据库连接 --jdbcConnection driverClasscom.mysql.cj.jdbc.DriverconnectionURLjdbc:mysql://localhost:3306/mybatis_dbuserIdrootpasswordroot/!-- 生成POJO --javaModelGenerator targetPackagecom.example.pojo targetProjectsrc/main/java/!-- 生成映射文件 --sqlMapGenerator targetPackagemapper targetProjectsrc/main/resources/!-- 生成Mapper接口 --javaClientGenerator typeXMLMAPPERtargetPackagecom.example.mappertargetProjectsrc/main/java/!-- 指定表 --table tableNameuser//context
/generatorConfiguration3. 运行生成命令
在Maven插件中执行mybatis-generator:generate自动生成以下文件
User.javaPOJO类UserMapper.javaMapper接口UserMapper.xml映射文件UserExample.java复杂查询条件构建类
八、分页插件PageHelper
PageHelper是MyBatis常用的分页插件可简化分页查询实现。
1. 引入依赖
dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion5.3.0/version
/dependency2. 配置插件mybatis-config.xml
pluginsplugin interceptorcom.github.pagehelper.PageInterceptorproperty namehelperDialect valuemysql//plugin
/plugins3. 使用示例
Test
public void testPage() {// 设置分页参数页码从1开始每页3条PageHelper.startPage(1, 3);// 执行查询ListUser users userMapper.findAll();// 封装分页结果PageInfoUser pageInfo new PageInfo(users);System.out.println(总条数 pageInfo.getTotal());System.out.println(总页数 pageInfo.getPages());System.out.println(当前页数据 pageInfo.getList());
}总结
MyBatis以其灵活性和高效性在Java持久层框架中占据重要地位。本文从环境搭建到高级特性涵盖了MyBatis的核心用法包括CRUD操作、动态SQL、缓存机制、关联查询等。掌握这些内容后可轻松应对日常开发中的数据库操作需求。
建议在实际项目中根据场景选择XML配置或注解开发XML更适合复杂SQL注解更简洁并合理使用缓存和分页插件优化性能。