有关MyBatis(轻量级数据持久化框架)
1.有关MyBatis
MyBatis 是一个开源、轻量级的数据持久化框架,是 JDBC 和 Hibernate 的替代方案。MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身。
MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。其封装性低于 Hibernate,但性能优秀、小巧、简单易学、应用广泛。
ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。
2.MyBatis的优缺点
2.1 优点
- MyBatis 是免费且开源的。
- 与 JDBC 相比,减少了 50% 以上的代码量。
- MyBatis 是最简单的持久化框架,小巧并且简单易学。
- MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
- 提供 XML 标签,支持编写动态 SQL 语句。
- 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
- 支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。
2.2 缺点
- 编写 SQL 语句工作量较大,对开发人员编写 SQL 语句的功底有一定要求。
- SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
3.MyBatis的使用场景
MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。适用于性能要求高,且需求变化较多的项目,如互联网项目。
4.使用步骤
4.1把配置文件加载到pom文件夹中
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
4.2创建数据库表文件和对应的实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Pet {
private int id;
private String name;
private String species;
private int age;
}
4.3 配置全局mybatis文件
<?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>
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
//************注意*******
<typeAliases>
<package name="org.mybatis.entity"/>
</typeAliases>
//**********************
<!-- 配置mybatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- MySQL数据库驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<!-- 连接数据库的URL -->
<property name="url"
value="jdbc:mysql://localhost:3306/pet_management1?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="226774" />
</dataSource>
</environment>
</environments>
<!-- 将mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="org/mybatis/mapper/PetMapper.xml" />
</mappers>
</configuration>
4.4 创建表对应的操作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="org.mybatis.mapper.PetMapper">
<select id="select" resultType="Pet">
select * from pets
</select>
</mapper>
4.5 测试查询语句
public static void main(String[] args) throws IOException {
@Cleanup
InputStream in = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession ss = ssf.openSession();
List<Pet> list = ss.selectList("org.mybatis.mapper.PetMapper.select");
for (Pet pet : list){
System.out.println(pet);
}
}
5.创建工具类使用MyBatis
5.1创建SqlSessionUtil工具类
注:前面几步同上面一样
private static SqlSessionFactory sqlSessionFactory;
private SqlSessionUtil(){
}
static {
try {
@Cleanup
InputStream is = Resources.getResourceAsStream("mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSession openSession(){
return openSession(true);
}
public static SqlSession openSession(Boolean flag){
return sqlSessionFactory.openSession(flag);
}
5.2 测试查询语句
public static void main(String[] args) {
@Cleanup
SqlSession session = SqlSessionUtil.openSession();
List<Pet> list = session.selectList("org.mybatis.mapper.PetMapper.select");
for (Pet pet : list){
System.out.println(pet);
}
}
6.创建Mapper接口使用MyBatis
注意:
1.创建目录结构时,保证Java包中的目录与resources包中的目录结构一致,否则会因为路径问题找不到SQL语句
2.接口中的方法名要与xml中的id一致
6.1 创建与xxxMapper.xml文件同名的Mapper接口
public interface PetMapper {
public List<Pet> select();
}
6.2 通过工具类调用连接,通过接口测试查询语句
public static void main(String[] args) {
@Cleanup
SqlSession sqlSession = SqlSessionUtil.openSession();
PetMapper mapper = sqlSession.getMapper(PetMapper.class);
List<Pet> list = mapper.select();
list.forEach(system.out::println)
}
}
7.使用MyBatis时应注意的问题
问题类型 | 注意事项 |
---|---|
数据库驱动版本 | MySQL 5.x与8.x驱动类不同,引入依赖时版本需匹配 |
数据库URL格式 | 需转义特殊字符(如& →& ) |
XML命名空间 | namespace 必须与Mapper接口全类名一致 |
SqlSession生命周期 | 未关闭会导致连接泄漏 |
事务提交 | 默认非自动提交,需手动提交或设置openSession(true) |
高频错误 | 高频错误 |
ClassNotFoundException | 驱动类名错误或依赖缺失,检查驱动类名(如MySQL 8.x类名)及依赖配置 |
Result Maps not found | 未配置resultType 或resultMap ,为查询语句添加resultType="User" 或引用<resultMap> |
TooManyResultsException | 使用selectOne() 但返回多行数据,改用selectList() 或修正SQL条件 |