#头条创作挑战赛#
基本的查询语句:
用于使用查询语句从数据库表中获取数据。
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,并使用它们进行数据库操作和事务管理。