MyBatis 注解和Provider注解(动态构建SQL)使用
发布日期:2025-04-14 09:18:34 浏览次数:11 分类:精选文章

本文共 10716 字,大约阅读时间需要 35 分钟。

MyBatis注解配置与动态SQL开发实践

MyBatis是一个强大的 ORM框架,其配置信息可以基于XML文件完成,尤其是在MyBatis 3.x版本中,基于注解的配置方式逐渐成为主流。以下将详细阐述基于注解的MyBatis配置及其在实际项目中的应用。

1. 注解配置简介

在MyBatis中,注解配置是一种简化Mapper接口映射的方式。通过在接口方法上使用MyBatis的注解,可以直接定义SQL语句,或通过ResultMap映射结果集。需要注意的是,注解配置不仅可以与XML配置共存,还可以灵活地根据项目需求进行选择。

1.1 XML配置与注解配置的关系

mybatis-config.xml文件中,<mappers>元素可以通过以下方式添加注解配置:

或者:

需要注意的是,接口中的一个方法只能选择使用注解或XML映射,不可以同时使用两者。

2. 注解CRUD实例

基于注解的CRUD操作可以显著简化代码编写。以下是一个典型的UserMapper接口示例:

@MappedBean
public interface UserMapper {
@Select("select id, username, reg_date from t_user where id = #{id}")
@Results(id = "userResultMap", value = {
@Result(column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "reg_date", property = "regDate")
})
User getUser(Long id);
@Select("select * from t_user")
List
listAll();
@Select("select * from t_user where id >= #{id} order by ${orderby}")
List
listByParam(@Param("id") Long id, @Param("orderby") String orderby);
@Insert("insert into t_user(username, pazzword, salary, reg_date) value (#{username}, #{pazzword}, #{salary}, #{regDate})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Update("update t_user set username = #{username}, reg_date = #{regDate} where id = #{id}")
int update(User user);
@Delete("delete from t_user where id = #{id}")
int delete(@Param("id") Long id);
}
2.1 测试类示例

以下是一个基本的测试类,用于验证注解配置的正确性:

public class App {
@Test
public void testGet() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUser(3L);
System.out.println(user);
session.close();
}
@Test
public void testListAll() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List
list = userMapper.listAll();
list.forEach(user -> {
System.out.println(user);
});
session.close();
}
@Test
public void testListByParam() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
Map
paramCon = new HashMap<>();
paramCon.put("GTL_id", "3");
paramCon.put("LIKES_username", "@");
List
list = userMapper.listByParam(User.class, paramCon);
list.forEach(user -> {
System.out.println(user);
});
session.close();
}
@Test
public void testInsert() throws Exception {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setUsername("asda");
user.setPazzword("123456");
user.setSalary(new BigDecimal("99.99"));
user.setRegDate(new Date());
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.insert(user);
session.commit();
System.out.println(user.getId());
session.close();
}
@Test
public void testUpdate() throws Exception {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setId(6L);
user.setUsername("asda@");
user.setRegDate(new Date());
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.update(user);
session.commit();
session.close();
}
@Test
public void testDelete() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.delete(User.class, 7L);
session.commit();
session.close();
}
}

3. Provider注解与动态SQL

Provider注解是一种灵活的SQL构建方式,适用于动态SQL场景。通过自定义Provider类,可以根据需求构建复杂的SQL语句。

3.1 Provider类结构

以下是一个典型的Provider类示例:

public class BaseDaoSqlProvider {
public String insert(Object bean) {
Class
clazz = bean.getClass();
System.out.println("insert=" + clazz.getName());
String tableName = "t_" + clazz.getSimpleName();
SQL sql = new SQL();
sql.INSERT_INTO(tableName);
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String propertyName = field.getName();
String columnName = propertyName;
if ("regDate".equals(propertyName)) {
columnName = "reg_date";
}
try {
if (field.get(bean) != null && !"".equals(field.get(bean))) {
sql.VALUES(columnName, "#{" + propertyName + "}");
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return sql.toString();
}
public String update(Object bean) {
Class
clazz = bean.getClass();
System.out.println("update=" + clazz.getName());
String tableName = "t_" + clazz.getSimpleName();
SQL sql = new SQL();
sql.UPDATE(tableName);
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String propertyName = field.getName();
String columnName = propertyName;
if ("regDate".equals(propertyName)) {
columnName = "reg_date";
}
if ("id".equals(propertyName)) {
sql.WHERE(columnName + " = #{" + propertyName + "}");
} else {
sql.SET(columnName + " = #{" + propertyName + "}");
}
}
return sql.toString();
}
public String delete(Class
clazz) {
String tableName = "t_" + clazz.getSimpleName();
SQL sql = new SQL();
sql.DELETE_FROM(tableName);
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String propertyName = field.getName();
String columnName = propertyName;
if ("id".equals(propertyName)) {
sql.WHERE(columnName + " = #{" + propertyName + "}");
}
}
return sql.toString();
}
public String get(Class
clazz) {
String tableName = "t_" + clazz.getSimpleName();
SQL sql = new SQL();
sql.SELECT("*").FROM(tableName);
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String propertyName = field.getName();
String columnName = propertyName;
if ("id".equals(propertyName)) {
sql.WHERE(columnName + " = #{" + propertyName + "}");
}
}
return sql.toString();
}
public String listAll(Class
clazz) {
String tableName = "t_" + clazz.getSimpleName();
SQL sql = new SQL();
sql.SELECT("*").FROM(tableName);
return sql.toString();
}
public String listByParam(Class
clazz, Map
paramCon) {
String tableName = "t_" + clazz.getSimpleName();
SQL sql = new SQL();
sql.SELECT("*").FROM(tableName);
for (Map.Entry
entry : paramCon.entrySet()) {
String param = getParamCon(entry.getKey(), entry.getValue());
if (param != null) {
sql.WHERE(param);
}
}
return sql.toString();
}
private String getParamCon(String key, String value) {
String[] s = key.split("_");
if ("LIKES".equals(s[0])) {
return s[1] + " like '%" + value + "%'";
}
if ("EQS".equals(s[0])) {
return s[1] + " = '" + value + "'";
}
if ("EQL".equals(s[0])) {
return s[1] + " = " + value;
}
if ("LTL".equals(s[0])) {
return s[1] + " <= " + value;
}
if ("GTL".equals(s[0])) {
return s[1] + " >= " + value;
}
return null;
}
}
3.2 UserMapper接口继承BaseDao

以下是一个继承BaseDao接口的UserMapper接口示例:

public interface UserMapper extends BaseDao
{
}
3.3 测试类

以下是一个基于Provider注解的测试类示例:

public class App {
@Test
public void testGet() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.get(User.class, 3L);
System.out.println(user);
session.close();
}
@Test
public void testListAll() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List
list = userMapper.listAll(User.class);
list.forEach(user -> {
System.out.println(user);
});
session.close();
}
@Test
public void testListByParam() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
Map
paramCon = new HashMap<>();
paramCon.put("GTL_id", "3");
paramCon.put("LIKES_username", "@");
List
list = userMapper.listByParam(User.class, paramCon);
list.forEach(user -> {
System.out.println(user);
});
session.close();
}
@Test
public void testInsert() throws Exception {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setUsername("asda");
user.setPazzword("123456");
user.setSalary(new BigDecimal("99.99"));
user.setRegDate(new Date());
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.insert(user);
session.commit();
System.out.println(user.getId());
session.close();
}
@Test
public void testUpdate() throws Exception {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setId(11L);
user.setUsername("asda@121");
user.setSalary(new BigDecimal("98.99"));
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.update(user);
session.commit();
session.close();
}
@Test
public void testDelete() throws Exception {
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.delete(User.class, 12L);
session.commit();
session.close();
}
}

4. 总结

通过以上配置和示例,可以看到基于注解的MyBatis配置在实际项目中具有极高的灵活性和可读性。无论是CRUD操作还是动态SQL构建,都可以通过注解和Provider类实现,显著提升开发效率。

上一篇:mybatis
下一篇:mybatis+springboot+MySQL批量插入 1w 条数据

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月28日 11时46分14秒