8、使用注解开发
在上面使用的开发流程中,我们都是先在UserMapper中创建接口,然后在对应的xml文件中增加对应的sql语句,然后再写测试方法测试。除了这种方式,Mybatis也推出了注解开发的方式,一定程度上简化了开发的过程,我们来看看吧。
同样的我们复制一份项目,避免已有数据的干扰。
首先需要在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);
- 在这里我们看到,在定义的接口上我们增加了@Select(...),这就是mybatis提供的注解方式,不难推断出除了@Select还有@Update,@Delete,@Insert对应着更新,删除和插入操作
- 然后我们看到,@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方法都删除。
要使用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帮我们自动生成的很多东西:
生成的方法中包含每个属性的get,set方法,还有equals,hashcode和toString方法,是不是很方便!除了@Data Lombok还提供了很多其他注解@NoArgsConstructor无参构造,@AllArgsConstructor有参构造等等......
虽然lombok可以给我带来很大的便利,但是也有反对的声音:这样的编写方式,会极大的降低代码的阅读性,给新人上手和团队维护带负担(https://blog.csdn.net/jcmj123456/article/details/109194089)总的来说,可以根据自己的情况判断是否使用吧,如果团队中使用了Lombok插件也不用一脸困惑。