五、Mybatis 使用注解开发和Lombok体验

8、使用注解开发

在上面使用的开发流程中,我们都是先在UserMapper中创建接口,然后在对应的xml文件中增加对应的sql语句,然后再写测试方法测试。除了这种方式,Mybatis也推出了注解开发的方式,一定程度上简化了开发的过程,我们来看看吧。

同样的我们复制一份项目,避免已有数据的干扰。

image-20210829165934118

首先需要在MybatisUtils文件中,设置sqlSession自动提交为true.

MybatisUtils.java

//SqlSessionFactory --> sqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //使用Mybatis第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
         }
    }

    //既然有了sqlSessionFactory对象,顾名思义就可以使用它获取sqlSession对象了
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true); // 这里设置为ture!!!
    }
}

然后我们在UserMapper中创建一个根据id查询用户信息的接口:

//根据id查询用户
@Select("select * from user where id = ${id}")
User getUserById(@Param("id") int id);
  1. 在这里我们看到,在定义的接口上我们增加了@Select(...),这就是mybatis提供的注解方式,不难推断出除了@Select还有@Update,@Delete,@Insert对应着更新,删除和插入操作
  2. 然后我们看到,@Select后面就是我们需要使用的sql语句,在sql中需要传入的参数方式和在xml配置的方式一样;需要注意的是,在接口的参数中我们使用了@Param,这里的Param可以理解为为参数id设置了一个映射,上面的sql会获取名叫id(param中设置的名称),我们建议为所有的基本类型参数都加上@Param

就这样,我们就可以拿来测试了:

@Test
public void TestGetUserById() {
  SqlSession sqlSession = MybatisUtils.getSqlSession();
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  User user = mapper.getUserById(1);
  System.out.println(user);
  sqlSession.close();
}

可以看到,使用的方式也和之前没有差别,如果是简单的sql语句,用注解的方式就可以省去在xml中配置的步骤。

上面是一个查询的例子,下面贴出来增删改的操作:

UserMapper.java

//添加用户
@Insert("insert into user(id,name,password) values (#{id}, #{name}, #{password})")
int addUser(User user);

//更新用户
@Update("update user set name=#{name}, password=#{password} where id=#{id}")
int updateUser(User user);

//删除用户
@Delete("delete from user where id=#{uid}")
int delUser(@Param("uid") int id);  // 在这里,sql中的参数如果使用#{id}就会提示找不到,以为我们@Param指定了参数是uid

TestUserMapper.java

@Test
public void TestAddUser() {
  SqlSession sqlSession = MybatisUtils.getSqlSession();
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  User user = new User(6, "李云龙", "444444");
  int i = mapper.addUser(user);
  if (i>0) {
    System.out.println("添加用户成功!");
  }
  sqlSession.close();
}

@Test
public void TestUpdateUser() {
  SqlSession sqlSession = MybatisUtils.getSqlSession();
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  User user = new User(6, "李云虎", "233233");
  int i = mapper.updateUser(user);
  if (i>0) {
    System.out.println("修改用户成功!");
  }
  sqlSession.close();
}

@Test
public void TestDelUser() {
  SqlSession sqlSession = MybatisUtils.getSqlSession();
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  int i = mapper.delUser(6);
  if (i>0) {
    System.out.println("删除用户成功!");
  }
  sqlSession.close();
}

9、Lombok

Lombook是一款方便编写pojo中实体类的getter、setter等方法的插件,通过Lombok的注解可以快速生成。

Lombok官网:https://projectlombok.org

首先我们看pojo/User.java,将User中的getter和setter方法,还有toString方法都删除。

image-20210830131837318

要使用lombok插件,首先当然是引入对应的maven依赖,在pom.xml增加lombok的依赖包:

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.20</version>
</dependency>

然后就可以使用啦,我们在实体类User上加上@Data注解,从IDEA左下方的结构中可以看到,lombok帮我们自动生成的很多东西:

image-20210830132408546

生成的方法中包含每个属性的get,set方法,还有equals,hashcode和toString方法,是不是很方便!除了@Data Lombok还提供了很多其他注解@NoArgsConstructor无参构造,@AllArgsConstructor有参构造等等......

虽然lombok可以给我带来很大的便利,但是也有反对的声音:这样的编写方式,会极大的降低代码的阅读性,给新人上手和团队维护带负担(https://blog.csdn.net/jcmj123456/article/details/109194089)总的来说,可以根据自己的情况判断是否使用吧,如果团队中使用了Lombok插件也不用一脸困惑。

posted @ 2021-09-12 21:52  LucaZ  阅读(110)  评论(0编辑  收藏  举报