注解开发的简介及配置
注解是可以代替映射文件(如IUserDao.xml等等),主配置文件(SqlMapConfig.xml)还是要写的。
在进行注解开发之前,新建一个maven工程。在pom.xml文件下将如下内容复制进去:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis_annotation</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
新建用户实体类,如下图所示:
创建IUserDao接口,如下图所示:
新建主配置文件SqlMapConfig.xml,把以下内容贴进去:
<?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">
<!--mybatis的主配置文件-->
<configuration>
<!-- 引入外部配置文件-->
<properties resource="jdbcConfig.properties"></properties>
<!-- 配置别名-->
<typeAliases>
<package name="com.zzq.domain"/>
</typeAliases>
<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>
<!-- 指定带有注解的dao接口所在位置-->
<mappers>
<package name="com.zzq.dao"/>
</mappers>
</configuration>
最后在IUserDao接口当中进行注解的填写。
注意事项:
1、注解和映射配置文件(如IUserDao.xml)不能共存,否则会报错。
2、拿到了注解就拿到了泛型(即返回值类型)。注解所在的位置隐含类名、包名和方法名信息。
注解开发的CURD操作
一、添加:
1、在IUserDao接口类当中添加如下内容:
/**
* 保存用户
*
* @param user
*/
@Insert("insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})")
void saveUser(User user);
2、进行测试。
二、更新
1、在IUserDao接口类当中添加如下内容:
@Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}")
void updateUser(User user);
2、测试。
三、删除
1、在IUserDao接口类当中添加如下内容:
@Delete("delete from user where id=#{id}")
void deleteUser(Integer userId);
2、测试
四、查询一个用户
1、在IUserDao接口类当中添加如下内容:
@Select("select * from user where id=#{id}")
User findById(Integer userId);
2、测试
五、模糊查询
1、在IUserDao接口类当中添加如下内容:
@Select("select * from user where username like #{username}")
List<User> findUserByName(String name);
或者
2、测试
或者
六、查询用户总数
1、在IUserDao接口类当中添加如下内容:
@Select("select count(*) from user")
int findTotalUser();
2、测试
注解建立实体类属性和数据库表中列的对应关系
当实体类的属性跟数据库的列名不一致时,无法查询出所需的结果。
解决办法:
1、加入以下注解完成实体类属性和数据库列名的映射。以查询所有用户为例:
@Select("select * from user")
@Results(value = {
@Result(id = true, column = "id", property = "userId"),
@Result(column = "username", property = "userName"),
@Result(column = "address", property = "userAddress"),
@Result(column = "sex", property = "userSex"),
@Result(column = "birthday", property = "userBirthday"),
})
List<User> findAll();
2、对于新的方法,必须还得新添加映射。为了使得映射适用于所有的方法,可以给刚才的注解加上id属性,让其他方法去引用它:
一对一的查询配置
1、在上述的基础上新建一个Account实体类,实现序列化接口。
2、创建一个IAccount接口,添加下列内容:
/**
* 查询所有账户,并且获取每个账户所属的用户信息
*
* @return
*/
@Select("select * from account")
List<Account> findAll();
3、Account实体类中添加一对一关系映射:
4、建立查询的映射(对应关系)。在IAccountDao中添加如下内容:
/**
* 查询所有账户,并且获取每个账户所属的用户信息
*
* @return
*/
@Select("select * from account")
@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.zzq.dao.IUserDao.findById", fetchType = FetchType.EAGER))
})
List<Account> findAll();
其中@Result中各个内容的含义如下:
id:为true时表示主键
column:查出的account的id
select:配置根据主键查询的方法名的路径
fetchType:配置延迟加载/立即加载
一对多的查询配置
1、在User实体类当中添加一对多的关系映射。
2、在IAccount接口中添加如下内容:
3、IUserDao接口中增加注解,如下所示:
@Select("select * from user")
@Results(id = "userMap", value = {
@Result(id = true, column = "id", property = "userId"),
@Result(column = "username", property = "userName"),
@Result(column = "address", property = "userAddress"),
@Result(column = "sex", property = "userSex"),
@Result(column = "birthday", property = "userBirthday"),
@Result(property = "accounts", column = "id", many = @Many(select = "com.zzq.dao.IAccountDao.findAccountByUid", fetchType = FetchType.LAZY))
})
使用二级缓存
一级缓存系统自动开启,我们无需进行手动配置。
二级缓存需要在SqlMapConfig.xml中添加如下内容:
在IUserDao中添加如下内容:
blocking的默认值是不使用二级缓存,需要改成true。