Mybatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。本文将详细介绍Mybatis的基础知识、环境搭建、核心概念和高级用法,帮助读者快速掌握Mybatis持久层框架入门。
Mybatis持久层框架入门详解 Mybatis基础知识介绍Mybatis是什么
Mybatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。它通过半自动的对象关系映射(ORM)简化了数据库操作,使得开发者可以更专注于SQL语句的编写和业务逻辑的实现,而不是数据访问细节。
Mybatis的主要特点
- 简单易用:Mybatis使用简单,配置方便,通过XML或注解方式进行配置。
- 灵活性强:支持自定义SQL,支持存储过程,可以灵活地进行数据库操作。
- 性能高:通过使用灵活的映射规则,可以将数据库的查询结果映射到Java对象,性能优于一些ORM框架。
- 轻量级:Mybatis没有太重的依赖,启动速度快,易于集成到各种项目中。
- 高可用性:支持多数据库,支持数据库迁移,具有良好的扩展性。
Mybatis的优势和应用场景
- 简化数据库访问:Mybatis简化了数据库访问的复杂性,使得数据库操作变得更加简单和直观。
- 减少开发时间:通过减少数据库访问的代码量,提高了开发效率。
- 支持多种数据库:Mybatis支持多种数据库,如MySQL、Oracle、SQL Server、DB2等。
- 易于维护:Mybatis的配置和SQL语句相对独立,使得数据库的操作和维护变得简单。
- 适用场景:Mybatis适用于需要高效、灵活地进行数据库操作的场景,尤其适合复杂查询和数据操作的项目。
开发环境准备
- Java环境:确保已经安装Java开发环境,如JDK 8及以上版本。
- IDE:推荐使用IntelliJ IDEA或Eclipse。
- 数据库:本教程以MySQL为例,安装并启动MySQL数据库。
- Maven:Mybatis项目通常使用Maven进行依赖管理,需要安装Maven。
创建Maven项目
- 创建一个新的Maven项目,选择Java SE项目。
- 修改
pom.xml
文件,添加Mybatis及相关依赖项。
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.0</version>
</dependency>
</dependencies>
- 在项目中创建
mybatis-config.xml
文件,配置Mybatis核心设置。
配置Mybatis核心配置文件
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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/UserMapper.xml"/>
</mappers>
</configuration>
数据库连接代码示例
通过SqlSessionFactory
和SqlSession
来连接数据库并执行SQL语句。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
Mybatis核心概念
SqlSessionFactory和SqlSession
SqlSessionFactory是生成SqlSession的工厂,它是线程不安全的,因此通常在应用中创建一个SqlSessionFactory的实例来生成SqlSession。SqlSession提供了一系列的数据库操作方法,如增删改查等。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
Mapper接口和XML映射文件
Mapper接口是Mybatis中用于定义数据库操作的方法,方法名和参数对应于XML映射文件中的SQL语句。XML映射文件中定义了SQL语句及其返回值类型。
public interface UserMapper {
List<User> selectAllUsers();
}
<mapper namespace="com.mybatis.UserMapper">
<select id="selectAllUsers" resultType="com.mybatis.User">
SELECT * FROM user
</select>
</mapper>
{}和${}的区别
{}是预编译参数,用于防止SQL注入,${}是直接拼接字符串,存在SQL注入风险。<select id="getUserById" resultType="com.mybatis.User">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getUserByIdWithSqlInjection" resultType="com.mybatis.User">
SELECT * FROM user WHERE id = ${id}
</select>
Mybatis的CRUD操作
增加记录
在Mybatis中,插入记录通常使用insert
标签来定义SQL语句,并在Mapper接口中定义相应的方法。
public interface UserMapper {
int insertUser(User user);
}
<insert id="insertUser">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
User user = new User();
user.setName("张三");
user.setAge(20);
int result = userMapper.insertUser(user);
System.out.println("插入记录数:" + result);
修改记录
更新记录使用update
标签来定义SQL语句,并在Mapper接口中定义相应的方法。
public interface UserMapper {
int updateUser(User user);
}
<update id="updateUser">
UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
</update>
User user = new User();
user.setId(1);
user.setName("李四");
user.setAge(22);
int result = userMapper.updateUser(user);
System.out.println("更新记录数:" + result);
删除记录
删除记录使用delete
标签来定义SQL语句,并在Mapper接口中定义相应的方法。
public interface UserMapper {
int deleteUser(int id);
}
<delete id="deleteUser">
DELETE FROM user WHERE id=#{id}
</delete>
int result = userMapper.deleteUser(1);
System.out.println("删除记录数:" + result);
查询记录
查询记录使用select
标签来定义SQL语句,并在Mapper接口中定义相应的方法。
public interface UserMapper {
User getUserById(int id);
List<User> getAllUsers();
}
<select id="getUserById" resultType="com.mybatis.User">
SELECT * FROM user WHERE id=#{id}
</select>
<select id="getAllUsers" resultType="com.mybatis.User">
SELECT * FROM user
</select>
User user = userMapper.getUserById(1);
System.out.println(user);
List<User> users = userMapper.getAllUsers();
System.out.println(users);
Mybatis动态SQL
Mybatis提供了多种动态SQL标签,如if
、choose
、where
、set
、foreach
等,可以根据条件生成不同的SQL语句。
if标签
if
标签可以用于条件判断,当条件满足时,SQL语句中的内容会被包含进去。
<select id="getUserByCondition" resultType="com.mybatis.User">
SELECT * FROM user WHERE 1=1
<if test="name != null">
AND name=#{name}
</if>
<if test="age != null">
AND age=#{age}
</if>
</select>
choose标签
choose
标签类似于Java中的switch
语句,当第一个when
条件满足时,该标签下的内容会被包含,其余则不会。
<select id="getUserByCondition" resultType="com.mybatis.User">
SELECT * FROM user WHERE 1=1
<choose>
<when test="name != null">
AND name=#{name}
</when>
<when test="age != null">
AND age=#{age}
</when>
<otherwise>
AND id=1
</otherwise>
</choose>
</select>
where标签
where
标签用于自动处理SQL语句中的WHERE
子句,当有多个条件时,会自动去掉多余的AND
。
<select id="getUserByCondition" resultType="com.mybatis.User">
SELECT * FROM user
<where>
<if test="name != null">
AND name=#{name}
</if>
<if test="age != null">
AND age=#{age}
</if>
</where>
</select>
set标签
set
标签用于自动处理SQL语句中的SET
子句,当有多个SET
时,会自动去掉多余的,
。
<update id="updateUser">
UPDATE user
<set>
<if test="name != null">
name=#{name},
</if>
<if test="age != null">
age=#{age}
</if>
</set>
WHERE id=#{id}
</update>
foreach标签
foreach
标签用于循环遍历一个集合,常用于生成IN
子句。
<select id="getUserByIds" resultType="com.mybatis.User">
SELECT * FROM user WHERE id IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
Mybatis的高级用法
分页查询
分页查询可以通过Mybatis的插件机制来实现,使用PageHelper插件可以简化分页查询的代码。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.3</version>
</dependency>
// PageHelper分页插件使用
PageHelper.startPage(1, 10); // 第1页,每页10条记录
List<User> users = userMapper.getAllUsers();
System.out.println(users);
结果集的延迟加载
延迟加载可以在需要时才加载数据,减少了不必要的数据库访问。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
// 延迟加载示例
User user = userMapper.getUserById(1);
System.out.println(user.getName()); // 马上加载name
System.out.println(user.getAddress()); // 需要时加载address
一级、二级缓存
缓存可以提高数据库查询性能,减少数据库访问次数。Mybatis支持一级缓存和二级缓存。
一级缓存
一级缓存是SqlSession级别的缓存,每个SqlSession都有独立的一级缓存,当SqlSession执行查询操作后,会将结果保存到一级缓存中,下次相同查询时直接从缓存中读取。
SqlSession sqlSession1 = sqlSessionFactory.openSession();
User user1 = sqlSession1.selectOne("getUserById", 1);
sqlSession1.commit();
sqlSession1.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
User user2 = sqlSession2.selectOne("getUserById", 1);
System.out.println(user1 == user2); // true
二级缓存
二级缓存是基于每个命名空间的缓存,当多个SqlSession操作同一个命名空间的Mapper时,可以共享二级缓存,提高查询效率。
<cache/>
SqlSession sqlSession1 = sqlSessionFactory.openSession();
User user1 = sqlSession1.selectOne("getUserById", 1);
sqlSession1.commit();
sqlSession1.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
User user2 = sqlSession2.selectOne("getUserById", 1);
System.out.println(user1 == user2); // false
``
通过以上介绍,我们可以看到Mybatis框架提供了丰富的功能和灵活性,能够满足复杂的数据操作需求。希望这篇入门详解能帮助大家更好地理解和使用Mybatis框架。
共同学习,写下你的评论
评论加载中...
作者其他优质文章