MyBatis 之 Annotation
作者:andy
- 2022-10-27 北京
本文字数:1815 字
阅读完需:约 6 分钟
一、使用 Annotation 实现 CRUD
MyBatis 提供了 Annotation 注解的方式实现固定 SQL 的 CRUD 操作。但是需要注意的是,Java 程序使用 Annotation 有着许多的局限,注解无法实现动态 SQL 功能。
由此,可以编写 CRUD 接口,如下:
package org.fuys.owndb.dao;import java.util.List;import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.SelectKey;import org.apache.ibatis.annotations.Update;import org.fuys.owndb.vo.Goal;public interface IGoalDao {
@Insert("INSERT INTO goal(name,description,start_time,end_time) VALUES(#{name},#{description},#{startTime},#{endTime})") @SelectKey(before = false, keyProperty = "goalId", resultType = java.lang.String.class, statement = "select last_insert_id()") public int insert(Goal goal) throws Exception;
@Update("UPDATE goal SET name=#{name},description=#{description},start_time=#{startTime},end_time=#{endTime} WHERE goalId = #{goalId}") public int update(Goal goal) throws Exception;
@Delete("DELETE FROM goal WHERE goalId = #{goalId}") public int delete(int goalId) throws Exception;
@Select("SELECT goalId,name,description,start_time AS startTime,end_time AS endTime FROM goal WHERE goalId = #{goalId}") public Goal selectOne(int goalId) throws Exception;
@Select("SELECT goalId,name,description,start_time AS startTime,end_time AS endTime FROM goal WHERE name like concat(concat('%',#{name}),'%') and description like concat(concat('%',#{description}),'%')") public List<Goal> selectList(Goal goal) throws Exception;
@Select("SELECT goalId,name,description,start_time AS startTime,end_time AS endTime FROM goal WHERE ${column} like concat(concat('%',#{keyword}),'%') LIMIT #{start},#{linesize}") public List<Goal> selectSplit(@Param("start") int start, @Param("linesize") int linesize, @Param("column") String column, @Param("keyword") String keyword) throws Exception;
@Select("SELECT count(goalId) FROM goal WHERE ${column} like concat(concat('%',#{keyword}),'%') ") public int selectCount(@Param("column") String column, @Param("keyword") String keyword) throws Exception;}复制代码
但是编写了接口,还不够,还需要通过 SqlSessionFactory 获取 org.apache.ibatis.session.Configuration 对象,再由 Configuration 对编写的接口添加注册。流程如下:
SqlSessionFactory --> getConfiguration() --> Configuration --> addMapper()注册
测试部分代码示例如下:
@Test public void testInsert() throws Exception { // add mapper MyBatisSqlSessionFactory.getSqlSessionFactory().getConfiguration().addMapper(IGoalDao.class); IGoalDao igoalDao = MyBatisSqlSessionFactory.getSqlSession().getMapper(IGoalDao.class); Goal goal = new Goal(); goal.setName("JJ - " + new Random().nextInt(99)); goal.setDescription("To be singer"); goal.setStartTime(new Date()); goal.setEndTime(new Date()); int len = igoalDao.insert(goal); MyBatisSqlSessionFactory.getSqlSession().commit(); MyBatisSqlSessionFactory.closeSqlSession(); TestCase.assertEquals(len, 1); logger.info(String.valueOf(len)); logger.info(goal); } @Test public void testSelectSplit() throws Exception { // add mapper MyBatisSqlSessionFactory.getSqlSessionFactory().getConfiguration().addMapper(IGoalDao.class); IGoalDao igoalDao = MyBatisSqlSessionFactory.getSqlSession().getMapper(IGoalDao.class); List<Goal> goalList = igoalDao.selectSplit(1, 3, "name", "j"); MyBatisSqlSessionFactory.closeSqlSession(); TestCase.assertNotNull(goalList); logger.info(goalList); }复制代码
综上所述,接口的子类可以通过注解来实现,但是,因为注解的方式无法实现动态 SQL,建议最好使用配置文件的方式进行开发。
划线
评论
复制
发布于: 刚刚阅读数: 4
andy
关注
还未添加个人签名 2019-11-21 加入
还未添加个人简介









评论