Mybatis介绍
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis免除了几乎所有的JDBC代码和手动设置参数以及获取查询结果集的过程。MyBatis可以使用XML或注解进行配置和映射,具有非常强的灵活性和可定制性。
Mybatis基本使用
环境搭建
Mybatis的使用需要在Java开发环境中使用Maven或Gradle添加相应的依赖和配置。以下是Maven中的配置方式:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
配置Mybatis
Mybatis的配置文件是mybatis-config.xml
,定义了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/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
编写Mapper
Mapper是用于与数据库交互的对象,可以使用注解或XML方式定义,示例如下:
public interface UserMapper {
@Select("select * from user where id = #{id}")
User getUserById(int id);
@Select("select * from user")
List<User> getAllUsers();
@Insert("insert into user(name, age) values(#{user.name}, #{user.age})")
void addUser(@Param("user") User user);
@Update("update user set name = #{user.name}, age = #{user.age} where id = #{user.id}")
void updateUser(@Param("user") User user);
@Delete("delete from user where id = #{id}")
void deleteUser(int id);
}
使用SqlSession
SqlSession是Mybatis操作数据库的核心,可以使用Mapper或自己写SQL语句进行CRUD操作,示例如下:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession session = factory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUserById(1); // 根据id查询用户
List<User> userList = userMapper.getAllUsers(); // 查询所有用户
User newUser = new User();
newUser.setName("Tom");
newUser.setAge(20);
userMapper.addUser(newUser); // 添加用户
user.setName("Jerry");
user.setAge(22);
userMapper.updateUser(user); // 更新用户
userMapper.deleteUser(1); // 删除用户
session.commit(); // 提交事务
session.close(); // 关闭SqlSession
Mybatis高级使用
插件
Mybatis支持插件(Interceptor),插件可以拦截Executor(执行器)、StatementHandler(语句处理器)、ParameterHandler(参数处理器)和ResultSetHandler(结果集处理器)的方法调用。
插件的代码需要实现Interceptor接口,示例如下:
@Intercepts({
@Signature(type = Executor.class, method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// Do something before
Object returnObject = invocation.proceed(); // 拦截目标方法
// Do something after
return returnObject;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// set properties
}
}
Mybatis可以通过<plugins>
标签配置插件,示例如下:
<plugins>
<plugin interceptor="com.example.plugins.MyPlugin">
<!-- properties -->
</plugin>
</plugins>
缓存
Mybatis拥有一级缓存和二级缓存。
一级缓存是SqlSession级别的缓存,可以减少对数据库的访问。只有在同一个SqlSession中,同一个查询SQL和相同的参数才会使用同一个缓存数据。一级缓存默认开启,可以通过shutdownCache()
方法关闭。
二级缓存是Mapper级别的缓存,能够在不同的SqlSession之间共享Mapper的查询结果。需要在Mapper的XML文件中设置<cache>
标签,配置缓存策略。
<cache eviction="LRU" flushInterval="10000" size="512" readOnly="true"/>
动态SQL
Mybatis支持使用动态SQL生成灵活的查询语句,可以通过<if>
、<choose>
、<when>
、<otherwise>
、<foreach>
等标签来实现。例如:
<select id="getUserByName" resultType="User">
select * from user
<where>
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</where>
</select>
以上就是Mybatis的介绍、基本使用和高级使用的完整攻略。
示例一:使用注解方式查询用户信息
以下示例演示了如何使用注解方式查询用户信息:
public interface UserMapper {
@Select("select * from user where id = #{id}")
User getUserById(int id);
}
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession session = factory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUserById(1); // 根据id查询用户
session.commit(); // 提交事务
session.close(); // 关闭SqlSession
示例二:使用XML方式查询用户信息
以下示例演示了如何使用XML方式查询用户信息:
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultMap="user">
select * from user where id = #{id}
</select>
<resultMap id="user" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
</mapper>
public interface UserMapper {
User getUserById(int id);
}
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession session = factory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUserById(1); // 根据id查询用户
session.commit(); // 提交事务
session.close(); // 关闭SqlSession
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis的介绍、基本使用、高级使用 - Python技术站