使用注解开发
使用注解开发跟使用xml开发比起来,更简洁,更方便。不需要在配置额外的dao层xml文件,直接在接口上使用注解即可。
注意事项
在使用注解开发的时候,就不能在使用xml开发,如果即使用了注解,又在resources的对应目录中存在了相应的配置文件,那么mybatis在运行时就会报异常,即使你在mapper
标签中指明了你使用的是某个接口。
使用步骤
- 首先配置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>
- 然后配置实体类,如下:
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;
...
- 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();
}
- 在全局配置文件中,增加需要配置的接口,如下
...
<mappers>
<mapper class="com.oylong.dao.UserDao"></mapper>
</mappers>
...
我们可以看到,与使用xml配置不同,这里我们填的是dao层接口的全限定类名。
- 之后即可在测试类中使用
...
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.EAGER
和FetchType.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 {
...