阅读 1466

MyBatis系列(七)- MyBatis使用注解开发| 8月更文挑战

相关文章

MyBatis系列汇总:MyBatis系列


前言

  • 注解在我们的工作当中使用的频率越来越高了,不管是学习Spring还是SpringBoot,注解开发都是必不可少的。

  • 我们需要学习一下在Mybatis中如何使用注解开发。

  • 以下是官方文档的原话:

    • 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
    • 选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
  • 也就是简单的语句我们可以使用注解,复杂的还是使用XML语句映射。当然,两种方式肯定可以同时存在的!

注解实现CRUD

  • 前置条件,需要配置映射器

    • <mappers>
          <package name="dy.mapper"/>
      </mappers>
      复制代码

①、查(select)

  • mapper中增加注解sql

    • public interface UserMapper {
          @Select("select * from user where id = #{id}")
          List<User> getUserInfo(@Param("id") Integer id);
      }
      复制代码
  • Test

    • @Test
      public void selectUser() {
          SqlSession session = MybatisUtils.getSession();
          UserMapper mapper = session.getMapper(UserMapper.class);
          List<User> users = mapper.getUserInfo(30);
          for (User map: users){
              System.out.println(map);
         }
          session.close();
      }
      复制代码
  • 执行结果

    • image-20210716142437392.png

②、增(insert)

  • mapper中增加注解sql

    • public interface UserMapper {
          @Insert("insert into user(name,age,`like`)values(#{name},#{age},#{like} )")
          Integer addUserInfo(User user);
      }
      复制代码
  • Test

    • @Test
          public void addUserInfo() {
              SqlSession session = MybatisUtils.getSession();
              UserMapper mapper = session.getMapper(UserMapper.class);
      ​
              //造数据
              User user = new User();
              user.setName("大鱼");
              user.setAge(25);
              user.setLike("吃鱼");
              Integer statusNum = mapper.addUserInfo(user);
              System.out.println(statusNum);
      ​
              session.commit();//提交事务
              session.close();
      }
      复制代码
  • 执行结果

    • image-20210716143558150.png
    • image-20210716143707416.png

③、改(update)

  • mapper中增加注解sql

    • public interface UserMapper {
          @Update("update user set name = #{name},age = #{age},`like` = #{like} where id = #{id}")
          Integer updateUserInfo(User user);
      }
      复制代码
  • Test

    •     @Test
          public void updateUserInfo() {
              SqlSession session = MybatisUtils.getSession();
              UserMapper mapper = session.getMapper(UserMapper.class);
      ​
              //造数据
              User user = new User();
              user.setId(43);
              user.setName("新大鱼");
              user.setAge(23);
              user.setLike("大吉大利,今晚吃鸡!");
              Integer statusNum = mapper.updateUserInfo(user);
              System.out.println(statusNum);
      ​
              session.commit();//提交事务
              session.close();
          }
      ​
      复制代码
  • 执行结果

    • image-20210716143818088.png
    • image-20210716143837920.png

④、删(delete)

  • mapper中增加注解sql

    • public interface UserMapper {
          @Delete("delete from user where id = #{id}")
          Integer deleteUserInfo(int id);
      }
      复制代码
  • Test

    •     @Test
          public void deleteUserInfo() {
              SqlSession session = MybatisUtils.getSession();
              UserMapper mapper = session.getMapper(UserMapper.class);
              Integer statusNum = mapper.deleteUserInfo(43);
              System.out.println(statusNum);
      
              session.commit();//提交事务
              session.close();
          }
      复制代码
  • 执行结果

    • image-20210716143909489.png
    • image-20210716143922248.png

⑤、自动提交事务

  • 大家有没有发现,除了查询,其他的操作都需要提交事务!

  • 其实MyBatis支持自动提交事务哦~

  • 还记得我们的MybatisUtils类嘛?不记得回过头看看我前面的文章!

  • public class MybatisUtils {
    
       private static SqlSessionFactory sqlSessionFactory;
    
       static {
           try {
               String resource = "ContextAplication.xml";
               InputStream inputStream = Resources.getResourceAsStream(resource);
               sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
    
       //获取SqlSession连接
       public static SqlSession getSession(){
           //这里传入 true  即可自动提交事务!无需手动提交
           //但是不建议使用,建议手动提交commit
           return sqlSessionFactory.openSession(true);
      }
    }
    复制代码
  • 去除提交事务的代码,我们来测试一下是否生效!

    •     @Test
          public void addUserInfo() {
              SqlSession session = MybatisUtils.getSession();
              UserMapper mapper = session.getMapper(UserMapper.class);
              //造数据
              User user = new User();
              user.setName("我是测试提交事务的");
              user.setAge(25);
              user.setLike("事务已经取消了");
              Integer statusNum = mapper.addUserInfo(user);
              System.out.println(statusNum);
              //这里本来是提交事务的代码
      	    //session.commit();//提交事务
              session.close();
          }
      复制代码
  • 执行结果:

    • image-20210716144433708.png
    • image-20210716144443535.png
  • 为什么不建议设置自动提交事务?

    • 这用的不多,每次执行一个对数据库的CRUD操作可以用这个,如果一个方法里面多次和数据库进行交互,如果每个连接处于独立的连接中,这个事务是控制不住的!
    • 这里不详细讲解为什么控制不住,等基础的系列文章写完之后,会出MyBatis的源码系列文章!到时候再详细讲解,这里只讲解使用,先会用!再去深究为什么要这样用!为什么能这样用!

路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah

文章分类
后端
文章标签