MyBatis 是一个优秀的持久层框架,可以使开发者以简单的方式执行 SQL 查询、插入、更新和删除操作。以下是 10 种超赞的 MyBatis 写法,可以帮助你更高效地使用 MyBatis:
1. 使用 XML 配置文件的动态 SQL
使用 MyBatis 动态 SQL 标签(如 <if>
, <choose>
, <when>
, <otherwise>
, <foreach>
)来构建复杂的 SQL 查询。
<select id="findUsers" resultType="User">
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
2. 使用注解配置 SQL
对于简单的 SQL 查询,可以使用注解配置,简化 XML 配置文件。
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
@Insert("INSERT INTO users(username, age) VALUES(#{username}, #{age})")
void insertUser(User user);
}
3. 使用 @Results
注解进行结果映射
在注解配置中,可以使用 @Results
注解将查询结果映射到对象字段。
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "age", column = "age")
})
User getUserById(int id);
}
4. 批量插入操作
使用 <foreach>
标签实现批量插入操作,提高数据库插入效率。
<insert id="batchInsertUsers">
INSERT INTO users (username, age)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.username}, #{user.age})
</foreach>
</insert>
5. 使用 SqlProvider
动态生成 SQL
使用 @SelectProvider
, @InsertProvider
, @UpdateProvider
, @DeleteProvider
注解动态生成 SQL 语句。
public interface UserMapper {
@SelectProvider(type = UserSqlProvider.class, method = "selectByUsername")
User getUserByUsername(String username);
}
public class UserSqlProvider {
public String selectByUsername(final String username) {
return new SQL(){{
SELECT("*");
FROM("users");
WHERE("username = #{username}");
}}.toString();
}
}
6. 使用 MyBatis 的内置缓存机制
配置 MyBatis 的二级缓存,提高查询性能。
<cache/>
在 mapper 配置文件中添加 <cache/>
标签启用二级缓存,并在 MyBatis 配置文件中配置缓存机制。
7. 使用 MyBatis 的分页插件
使用分页插件(如 MyBatis PageHelper)实现分页查询。
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.findAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
8. 多数据库环境的动态数据源切换
在多数据库环境下,可以使用动态数据源切换,实现不同数据库的访问。
@DataSource("dataSource1")
public interface UserMapper1 {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
}
@DataSource("dataSource2")
public interface UserMapper2 {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
}
9. 使用 TypeHandler 处理复杂数据类型
使用自定义的 TypeHandler
处理复杂数据类型,如 JSON 类型。
@MappedTypes(JsonType.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JsonTypeHandler extends BaseTypeHandler<JsonType> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JsonType parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.toJson());
}
@Override
public JsonType getNullableResult(ResultSet rs, String columnName) throws SQLException {
return JsonType.fromJson(rs.getString(columnName));
}
@Override
public JsonType getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return JsonType.fromJson(rs.getString(columnIndex));
}
@Override
public JsonType getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return JsonType.fromJson(cs.getString(columnIndex));
}
}
10. 使用 MyBatis Generator 自动生成代码
使用 MyBatis Generator 自动生成 MyBatis 的实体类、Mapper 接口和 XML 配置文件,提高开发效率。
<generatorConfiguration>
<context id="MyBatis3" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydatabase"
userId="root"
password="password"/>
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
<table tableName="users"/>
</context>
</generatorConfiguration>
通过以上这些写法和技巧,你可以更高效、更优雅地使用 MyBatis,实现复杂的持久层操作。