天天看点

Java技术干货|MyBatis执行SQL、对象映射、动态SQL、事务功能详解

作者:运维木子李

#头条创作挑战赛#

Java技术干货|MyBatis执行SQL、对象映射、动态SQL、事务功能详解

基本的查询语句:

用于使用查询语句从数据库表中获取数据。

List<User> users = sqlSession.selectList("UserMapper.getAllUsers");           

参数化查询语句:

用于使用带参数的查询语句从数据库表中获取数据。

List<User> users = sqlSession.selectList("UserMapper.getUsersByAge", 25);           

插入语句:

用于向数据库表中插入数据。

int rowsAffected = sqlSession.insert("UserMapper.insertUser", user);           

批量插入语句:

用于在一个批处理中向数据库表中插入多行数据。

int rowsAffected = sqlSession.insert("UserMapper.insertUsers", userList);           

更新语句:

用于更新数据库表中的数据。

int rowsAffected = sqlSession.update("UserMapper.updateUser", user);           

删除语句:

用于从数据库表中删除数据。

int rowsAffected = sqlSession.delete("UserMapper.deleteUser", userId);           

动态SQL:

用于根据条件构建动态SQL查询。

List<User> users = sqlSession.selectList("UserMapper.getUsersByCriteria", criteria);           

结果映射:

用于将查询结果映射到Java对象或DTO。

@Results({
  @Result(property = "id", column = "user_id"),
  @Result(property = "name", column = "user_name")
})
List<User> users = sqlSession.selectList("UserMapper.getAllUsers");           

关联映射:

用于映射实体之间的一对一或一对多关系。

@Results({
  @Result(property = "id", column = "user_id"),
  @Result(property = "orders", column = "user_id", 
      javaType = List.class, many = @Many(select = "OrderMapper.getOrdersByUserId"))
})
List<User> users = sqlSession.selectList("UserMapper.getUsersWithOrders");           

集合映射:

用于映射一对多或多对多关系中的对象集合。

@Results({
  @Result(property = "id", column = "user_id"),
  @Result(property = "roles", column = "user_id", 
      javaType = List.class, many = @Many(select = "RoleMapper.getRolesByUserId"))
})
List<User> users = sqlSession.selectList("UserMapper.getUsersWithRoles");           

延迟加载:

仅在需要时才加载关联对象或集合。

@Results({
  @Result(property = "id", column = "user_id"),
  @Result(property = "orders", column = "user_id", 
      javaType = List.class, many = @Many(select = "OrderMapper.getOrdersByUserId"))
})
@Options(fetchSize = 500, useCache = true, flushCache = false)
List<User> users = sqlSession.selectList("UserMapper.getUsersWithOrders");           

类型处理器:

用于在Java对象和数据库列类型之间进行转换。

@Results({
  @Result(property = "id", column = "user_id"),
  @Result(property = "status", column = "user_status", 
      javaType = UserStatus.class, typeHandler = UserStatusTypeHandler.class)
})
List<User> users = sqlSession.selectList("UserMapper.getAllUsers");           

自定义结果映射:

用于为复杂查询定义自定义结果映射。

@ResultMap("UserResultMap")
List<User> users = sqlSession.selectList("UserMapper.getAllUsers");           

调用存储过程:

用于从Java代码中调用存储过程。

sqlSession.selectOne("UserMapper.getUserCount", new HashMap<String, Object>() {{
    put("count", 0);
    put("result", null);
}});           

缓存:

用于启用查询结果的缓存以提高性能。

@CacheNamespace
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    @Options(useCache = true)
    User getUserById(int id);
}           

分页:

根据页面大小和偏移量检索查询结果的子集。

@Select("SELECT * FROM users")
@Options(fetchSize = 10, offset = 0)
List<User> getUsersWithPagination();           

动态SQL XML:

使用XML配置编写动态SQL查询。

<select id="getUsersByCriteria" resultMap="UserResultMap">
  SELECT * FROM users
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>           

枚举类型处理:

用于将数据库列与Java枚举类型进行映射。

public enum UserStatus {
    ACTIVE,
    INACTIVE
}

@Results({
  @Result(property = "id", column = "user_id"),
  @Result(property = "status", column = "user_status", 
      javaType = UserStatus.class)
})
List<User> users = sqlSession.selectList("UserMapper.getAllUsers");           

批量更新:

用于在一个批处理中执行多个更新或插入操作。

sqlSession.update("UserMapper.updateUserBatch", userList);           

自定义SQL语句:

用于在代码中定义和执行自定义的SQL语句。

@Update("UPDATE users SET name = #{name} WHERE id = #{id}")
int updateUser(@Param("id") int id, @Param("name") String name);           

结果集排序:

用于指定结果集中列的顺序。

@Results({
  @Result(property = "id", column = "user_id", id = true),
  @Result(property = "name", column = "user_name")
})
List<User> users = sqlSession.selectList("UserMapper.getAllUsers");           

防止SQL注入:

通过使用参数化查询来防止SQL注入攻击。

@Select("SELECT * FROM users WHERE name = #{name}")
User getUserByName(@Param("name") String name);           

连接池:

用于管理一组数据库连接以提高性能。

DataSource dataSource = new PooledDataSource(driver, url, username, password);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream, environment, properties);           

事务管理:

使用MyBatis内置支持来管理数据库事务。

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  userMapper.insertUser(user);
  userMapper.updateUser(user);

  sqlSession.commit();
} catch (Exception e) {
  sqlSession.rollback();
} finally {
  sqlSession.close();
}           

与Spring集成:

将MyBatis与Spring框架无缝集成和简化配置。

@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
  
  @Autowired
  private DataSource dataSource;

  @Bean
  public SqlSessionFactory sqlSessionFactory() throws Exception {
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setTypeAliasesPackage("com.example.model");
    return sessionFactoryBean.getObject();
  }

  @Bean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
  
  @Bean
  public PlatformTransactionManager transactionManager() {
    return new DataSourceTransactionManager(dataSource);
  }
}           

这个示例中,我们使用@Configuration注解将这个类标记为Spring的配置类,使用@MapperScan注解指定MyBatis Mapper接口的扫描路径。

在sqlSessionFactory()方法中,我们创建了一个SqlSessionFactoryBean实例,并设置了数据源和实体类的包路径。

最后使用getObject()方法获取SqlSessionFactory实例。

在sqlSessionTemplate()方法中,我们创建了一个SqlSessionTemplate实例,并将SqlSessionFactory作为参数传入。

在transactionManager()方法中,我们创建了一个PlatformTransactionManager实例,用于管理数据库事务。这里使用了DataSourceTransactionManager作为事务管理器,将数据源作为参数传入。

这样,MyBatis就与Spring集成完成了,可以在其他Spring组件中注入SqlSessionTemplate或Mapper,并使用它们进行数据库操作和事务管理。