使用注解开发

使用注解开发跟使用xml开发比起来,更简洁,更方便。不需要在配置额外的dao层xml文件,直接在接口上使用注解即可。

注意事项

在使用注解开发的时候,就不能在使用xml开发,如果即使用了注解,又在resources的对应目录中存在了相应的配置文件,那么mybatis在运行时就会报异常,即使你在mapper标签中指明了你使用的是某个接口。

使用步骤

  1. 首先配置Mybatis的配置文件
  • 这里使用了加载外部资源的方式配置,使用properties标签,并且将resources的值设置为相应的资源文件
  • 还有一种加载的方式为url,将值填写为对应的url也可获取对应的资源
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbcConfig.properties"></properties>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
  1. 然后配置实体类,如下:
package com.oylong.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
private Integer id;
private String username;
private String address;
private String sex;
private Date birthday;
...
  1. dao层接口
package com.oylong.dao;

import com.oylong.domain.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserDao {
@Select("select * from user")
List<User> findAll();
}
  1. 在全局配置文件中,增加需要配置的接口,如下
...
<mappers>
<mapper class="com.oylong.dao.UserDao"></mapper>
</mappers>
...

我们可以看到,与使用xml配置不同,这里我们填的是dao层接口的全限定类名。

  1. 之后即可在测试类中使用
...
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = factory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);

System.out.println(userDao.findAll());

sqlSession.close();
inputStream.close();
...

单表增删改查操作

如下的dao层接口

public interface UserDao {
@Select("select * from user")
List<User> findAll();

@Insert("insert into user (username, address, sex, birthday) values (#{username},#{address},#{sex},#{birthday})")
void addUser(User user);

@Update("update user set username = #{username}, address = #{address}, sex = #{sex}, birthday = #{birthday} where id = #{id}")
void updateUser(User user);

@Select("select * from user where id = #{id}")
User findUserById(Integer id);

@Delete("delete from user where id = #{id}")
void delteUserById(Integer id);
}

属性名和字段名不对应的情况

在xml文件中可以通过配置resultMap来解决,所以在注解中,为们也有对应的解决方法,就是使用@Results注解。如下代码:

@Select({"select * from user"})
@Results(id="map", value={
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="username", property="userName", jdbcType=JdbcType.VARCHAR),
@Result(column="address ", property="userAddress", jdbcType=JdbcType.INTEGER)
})

这样就可以正常的封装我们的实体类了,同时可以使用id属性,去复用我们写的映射信息。

@Update("update user set username = #{username}, address = #{address}, sex = #{sex}, birthday = #{birthday} where id = #{id}")
@ResultMap("map)
void updateUser(User user);

多表查询

一对一查询

一个账户对应一个用户

  • 类似于xml中的配置,我们使用'@Results'注解来简化
@Results(id = "accountMap",value = {
@Result(id = true, column = "id", property = "id"),
@Result(column = "uid", property = "uid"),
@Result(column = "money", property = "money"),
@Result(property = "user", column = "uid", one = @One(select = "com.oylong.dao.UserDao.findUserById", fetchType = FetchType.EAGER))
})
@Select("select * from account")
public List<Account> findAll();

可以看到,使用@Results注解下的@Result注解来配置每一项属性,通过@One注解下的select来关联我们相应的接口。其中的fetchType为指定的加载时机,延迟加载和立即加载分别对应FetchType.EAGERFetchType.LAZY

一对多查询

一个用户可以有多个账户

  • 同上,只是我们不使用one属性,而是使用many属性来指定选择的集合。
  • 首先为们需要在AccountDao接口中添加:
@Select("select * from account where uid = #{uid}")
public List<Account> findByUid(Integer uid);
  • 然后更改UserDao接口为如下
@Results(id="UserMap", value = {
@Result(id=true, property = "id", column = "id"),
@Result(property = "username", column = "username"),
@Result(property = "sex", column = "sex"),
@Result(property = "address", column = "address"),
@Result(property = "accounts", column = "id", many = @Many(
select="com.oylong.dao.AccountDao.findByUid",
fetchType = FetchType.LAZY
)),
})
@Select("select * from user")
List<User> findAll();

这样即可实现多对一的查询

开启二级缓存

一级缓存Mybatis默认支持,二级缓存的开启也很简单,首先还是需要在Mybatis的配置文件中配置,之后就是在

...
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
...

之后在dao接口上加上注解@CacheNamespace(blocking = true)即可

...
@CacheNamespace(blocking = true)
public interface AccountDao {
...
Last modification:April 4, 2021
If you think my article is useful to you, please feel free to appreciate