针对“Mybatis学习总结之mybatis使用建议”的问题,我会结合自己的经验和学习总结,给出一些使用Mybatis时的建议和实用技巧。
1. 配置文件拆分
在Mybatis开发中,通常建议将配置文件拆分成多个小文件,方便管理和维护。拆分后我们可以选择将mapper、typeAlias等不同功能拆分成不同的配置文件,例如:
mybatis-config.xml(核心配置文件)
|
|-- mappers(存放mapper配置文件)
| |
| |-- UserMapper.xml
| |-- OrderMapper.xml
|
|-- typeAliases(存放对象别名配置文件)
| |
| |-- User.java
| |-- Order.java
拆分后,typeAliases和mappers存放在不同的文件夹内,方便浏览和管理,同时在核心配置文件进行引用。这样,我们就可以让配置文件更加清晰明了,也便于维护和理解。
2. 统一使用#{}和${}
在Mybatis中,我们通常使用#{}和${}来代替参数,例如:
<select id="getUserById" resultType="User">
select * from user where id = #{id}
</select>
其中,#{}和${}都可以用来传递参数,但是它们之间还是有一些区别的,其中:
- 使用#{},Mybatis会自动为参数添加参数占位符,同时会将参数转义。这样,就可以避免SQL注入等安全问题。
- 使用${},Mybatis不会为参数添加参数占位符,也不会将参数转义。这样,在一些特殊情况下,如果参数值中包含特殊字符,可能会导致SQL语句执行错误,并可能被攻击者利用。
因此,在实际开发中,为了避免出现不必要的安全问题,推荐使用#{}来传递参数。
示例1
假设我们需要从数据库中查询某个用户,并将查询到的结果映射到一个User对象中,同时我们需要统计查询的时间。那么,我们可以按照下面的代码来实现:
// 1. 定义User对象
public class User {
private int id;
private String name;
private String password;
// 省略getter/setter方法
}
// 2. 定义Mapper接口
public interface UserMapper {
/**
* 根据用户ID查询用户信息
* @param id 用户ID
* @return 用户信息
*/
@Select("select * from user where id = #{id}")
@Results(id = "userMap", value = {
@Result(column = "id", property = "id"),
@Result(column = "name", property = "name"),
@Result(column = "password", property = "password")
})
User getUserById(int id);
}
// 3. 调用Mapper方法
public class Main {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Main.class.getClassLoader().getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
long startTime = System.currentTimeMillis();
User user = userMapper.getUserById(1);
long endTime = System.currentTimeMillis();
System.out.println("查询耗时:" + (endTime - startTime) + "ms");
System.out.println(user);
}
}
在上述示例中,我们在Mapper接口的方法上使用了@Select注解,其中的SQL语句使用了#{}来传递参数。同时,我们还使用了@Results注解来进行结果集的映射,将查询结果映射到User对象中。
示例2
下面我们再来看一个Mybatis分页的示例。假设我们需要从数据库中查询所有用户信息,并按照分页的方式进行展示。那么,我们可以按照下面的代码来实现:
// 1. 定义User对象
public class User {
private int id;
private String name;
private String password;
// 省略getter/setter方法
}
// 2. 定义Mapper接口
public interface UserMapper {
/**
* 查询所有用户信息,并按照分页的方式进行展示
* @param offset 起始记录数
* @param limit 每页记录数
* @return 用户信息列表
*/
@Select("select * from user limit #{offset}, #{limit}")
List<User> getUsersByPage(@Param("offset") int offset, @Param("limit") int limit);
}
// 3. 调用Mapper方法
public class Main {
public static void main(String[] args) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Main.class.getClassLoader().getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = factory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int pageNum = 2;
int pageSize = 10;
int offset = (pageNum - 1) * pageSize;
List<User> userList = userMapper.getUsersByPage(offset, pageSize);
System.out.println(userList);
}
}
在上述示例中,我们在Mapper接口的方法上使用了@Select注解,其中的SQL语句使用了#{}来传递参数并限制查询的记录数,并将查询结果映射到List
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis学习总结之mybatis使用建议 - Python技术站