本文共 10716 字,大约阅读时间需要 35 分钟。
MyBatis是一个强大的 ORM框架,其配置信息可以基于XML文件完成,尤其是在MyBatis 3.x版本中,基于注解的配置方式逐渐成为主流。以下将详细阐述基于注解的MyBatis配置及其在实际项目中的应用。
在MyBatis中,注解配置是一种简化Mapper接口映射的方式。通过在接口方法上使用MyBatis的注解,可以直接定义SQL语句,或通过ResultMap映射结果集。需要注意的是,注解配置不仅可以与XML配置共存,还可以灵活地根据项目需求进行选择。
在mybatis-config.xml
文件中,<mappers>
元素可以通过以下方式添加注解配置:
或者:
需要注意的是,接口中的一个方法只能选择使用注解或XML映射,不可以同时使用两者。
基于注解的CRUD操作可以显著简化代码编写。以下是一个典型的UserMapper接口示例:
@MappedBeanpublic 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") ListlistAll(); @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);}
以下是一个基本的测试类,用于验证注解配置的正确性:
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); Listlist = 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(); }}
Provider注解是一种灵活的SQL构建方式,适用于动态SQL场景。通过自定义Provider类,可以根据需求构建复杂的SQL语句。
以下是一个典型的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, MapparamCon) { 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; }}
以下是一个继承BaseDao接口的UserMapper接口示例:
public interface UserMapper extends BaseDao{}
以下是一个基于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); Listlist = 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(); }}
通过以上配置和示例,可以看到基于注解的MyBatis配置在实际项目中具有极高的灵活性和可读性。无论是CRUD操作还是动态SQL构建,都可以通过注解和Provider类实现,显著提升开发效率。
转载地址:http://jfffk.baihongyu.com/