MyBatis学习笔记之MyBatis注解配置详解
MyBatis是一款流行的持久层框架,在Spring框架中也广泛被使用。在MyBatis中,我们可以通过注解配置来替代XML配置,可以让配置文件更加简洁,同时便于维护和阅读。
基本注解
MyBatis中最常用的注解是@Select
、@Insert
、@Update
、@Delete
和@Mapper
。
@Select
@Select
注解用于配置查询语句,可以在注解中定义SQL语句,也可以在方法的参数中传递SQL语句。
示例1:使用注解定义SQL语句
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
示例2:使用方法参数传递SQL语句
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(@Param("id") int id, @Param("tableName") String tableName);
@Insert
@Insert
注解用于配置插入语句,可以在注解中定义SQL语句,也可以在方法的参数中传递SQL语句。
示例1:使用注解定义SQL语句
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
int addUser(User user);
示例2:使用方法参数传递SQL语句
@Insert("INSERT INTO ${tableName}(name, age) VALUES(#{name}, #{age})")
int addUser(@Param("user") User user, @Param("tableName") String tableName);
@Update
@Update
注解用于配置更新语句,可以在注解中定义SQL语句,也可以在方法的参数中传递SQL语句。
示例1:使用注解定义SQL语句
@Update("UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}")
int updateUser(User user);
示例2:使用方法参数传递SQL语句
@Update("${sql}")
int updateUser(@Param("sql") String sql);
@Delete
@Delete
注解用于配置删除语句,可以在注解中定义SQL语句,也可以在方法的参数中传递SQL语句。
示例1:使用注解定义SQL语句
@Delete("DELETE FROM users WHERE id=#{id}")
int deleteUser(int id);
示例2:使用方法参数传递SQL语句
@Delete("${sql}")
int deleteUser(@Param("sql") String sql);
@Mapper
@Mapper
注解用于指定Mapper接口,可以与XML配置文件同时使用,也可以用于代替XML配置文件。
例如:@Mapper(MyUserMapper.class)
可以指定Mapper接口为MyUserMapper。
参数处理
在MyBatis中,我们可以通过注解配置的方式来传递参数,有多种方式可以实现参数传递。以下是常用的参数处理方式。
基本类型参数
基本类型参数可以使用@Param
注解,并在注解中指定参数名称。
@Select("SELECT * FROM users WHERE name=#{name} and age=#{age}")
User getUser(@Param("name") String name, @Param("age") int age);
对象类型参数
对象类型参数可以使用@Param
注解,并在注解中指定对象名称。
@Insert("INSERT INTO users(name, age) VALUES(#{user.name}, #{user.age})")
int addUser(@Param("user") User user);
Map类型参数
Map类型参数可以使用@Param
注解,并在注解中指定map名称。
@Select("SELECT * FROM ${tableName} WHERE ${condition}")
List<User> getUsersByMap(@Param("map") Map<String,Object> map);
数组/集合类型参数
数组/集合类型参数可以使用@Param
注解,并在注解中指定index和value的值。其中index为序号,value为值。
@Insert({"<script>",
"INSERT INTO users(name, age) VALUES",
"<foreach collection='users' item='user' index='index' separator=','>",
"(#{user.name}, #{user.age})",
"</foreach>",
"</script>"})
int addUsersMap(@Param("users") List<User> users);
结果映射
MyBatis中将查询结果映射到Java对象中,可以使用@Results
注解,并在注解中指定映射规则。其中@Result注解表示一个属性,并在注解中包含该属性对应的数据库字段和Java对象字段。
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select("SELECT * FROM users")
List<User> getUsers();
动态SQL处理
MyBatis中提供了动态SQL处理,可以在注解中使用<if>
、<where>
、<foreach>
等元素来构建动态SQL语句。
<if>
元素
<if>
元素可以用于条件判断。
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select({"<script>",
"SELECT * FROM users",
"<where>",
"<if test='name!=null'>",
"AND name=#{name}",
"</if>",
"<if test='age!=0'>",
"AND age=#{age}",
"</if>",
"</where>",
"</script>"})
List<User> getUsersByCondition(@Param("name") String name, @Param("age") int age);
<where>
元素
<where>
元素可以用于构造WHERE子句。
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select({"<script>",
"SELECT * FROM users",
"<where>",
"<if test='name!=null'>",
"AND name=#{name}",
"</if>",
"<if test='age!=0'>",
"AND age=#{age}",
"</if>",
"</where>",
"</script>"})
List<User> getUsersByCondition(User user);
<foreach>
元素
<foreach>
元素可以用于构造IN子句。
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
@Select({"<script>",
"SELECT * FROM users",
"WHERE id IN",
"<foreach item='id' collection='ids' separator=',' open='(' close=')'>",
"#{id}",
"</foreach>",
"</script>"})
List<User> getUsersByIds(@Param("ids") List<Integer> ids);
示例说明
以下是一个基于注解配置的MyBatis的示例代码:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
@Select({"<script>",
"SELECT * FROM users",
"<where>",
"<if test='name!=null'>",
"AND name=#{name}",
"</if>",
"<if test='age!=0'>",
"AND age=#{age}",
"</if>",
"</where>",
"</script>"})
List<User> getUsersByCondition(User user);
@Insert("INSERT INTO users(name, age) VALUES(#{user.name}, #{user.age})")
int addUser(@Param("user") User user);
@Update("UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}")
int updateUser(User user);
@Delete("DELETE FROM users WHERE id=#{id}")
int deleteUser(int id);
@Select({"<script>",
"SELECT * FROM users",
"<where>",
"<if test='name!=null'>",
"AND name=#{name}",
"</if>",
"<if test='age!=0'>",
"AND age=#{age}",
"</if>",
"</where>",
"</script>"})
List<User> getUsersByCondition(@Param("name") String name, @Param("age") int age);
@Select({"<script>",
"SELECT * FROM users",
"WHERE id IN",
"<foreach item='id' collection='ids' separator=',' open='(' close=')'>",
"#{id}",
"</foreach>",
"</script>"})
List<User> getUsersByIds(@Param("ids") List<Integer> ids);
}
在以上示例中,我们定义了UserMapper接口,并使用注解配置了查询、插入、更新和删除等操作,并使用了动态SQL处理,可以根据需要动态构造查询条件和SQL语句。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis学习笔记之mybatis注解配置详解 - Python技术站