注解开发
数据准备
表结构
id | int(11) |
---|---|
username | varchar(32) |
birthday | datetime |
sex | char(1) |
address | varchar(256) |
实体类属性
private Integer userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
表字段 与 实体类属性 的映射
@Results(id="userMap" ,value = {}
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday")
)
1 单表CRUD
1.1 select
1.1.1 查询所有
- 需求分析
查询所有用户信息 - 在持久层接口 IUserDao.java 中添加 findAll 方法
@Select("select * from user")
List<User> findAll();
<!--
select * from user 这是SQL语句
List<User> 查询结果封装的位置
-->
- 添加测试方法
//核心代码
public void testFindAll(){
List<User> users = userDao.findAll();
for(User user : users)
System.out.println(user);
}
1.1.2 指定查询
-
需求分析
根据 id 查询一个指定用户 -
在持久层接口 IUserDao.java 中添加 findById 方法
@Select("select * from user where id = #{uid} ")
@ResultMap("userMap")
User findById(Integer userId);
<!--
select * from user where id = #{uid} 包含了一个 SQL语句,以及一个占位符
User 结果封装的位置
Integer userId 用于替换占位符,使SQL语句完整
-->
- 添加测试方法
//核心代码
public void testFindById() {
User user = userDao.findById(41);
System.out.println(user);
}
1.2 insert
- 需求分析
插入一个用户信息 - 在持久层接口 IUserDao.java 中添加 savaUser 方法
@Insert("insert into user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address}
)")
@SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before =
false, statement = { "select last_insert_id()" })
int saveUser(User user);
<!--
keyColumn:数据表中自增长的id
keyProperty:结果集映射实体类的属性
resultType:设置返回类型
statement:设置sql语句的映射类型
-->
- 添加测试方法
//核心代码
public void testSave() {
User user = new User();
user.setUserName("河南人");
user.setUserSex("男");
user.setUserAddress("河南省");
user.setUserBirthday(new Date());
int res = userDao.saveUser(user);
System.out.println("影响数据库记录的行数:"+res);
System.out.println("插入的主键值:"+user.getUserId());
}
1.3 update
- 需求分析
修改指定行信息 - 在持久层接口 IUserDao.java 中添加 updateUser 方法
@Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id = #{id} ")
int updateUser(User user);
- 添加测试方法
//核心代码
public void testUpdate() {
User user = userDao.findById(63);
user.setUserBirthday(new Date());
user.setUserSex("女");
int res = userDao.updateUser(user);
System.out.println(res);
}
1.4 delete
- 需求分析
删除指定行信息 - 在持久层接口 IUserDao.java 中添加 deleteUser 方法
@Delete("delete from user where id = #{uid} ")
int deleteUser(Integer userId);
- 添加测试方法
//核心代码
public void testDelete() {
int res = userDao.deleteUser(63);
System.out.println(res);
}
1.5 模糊查询
-
需求分析
通过某个字段的模糊信息,进行模糊查询。 -
在持久层接口 IUserDao.java 中添加 findByName 方法
@Select("select * from user where username like #{username} ")
List<User> findByName(String name);
- 添加测试方法
//核心代码
public void testFindByName() {
List<User> users = userDao.findByName("%m%");
for(User user : users)
System.out.println(user);
}
2 多表查询
2.1 one 一对一
-
应用场景
跨表查询,代替了配置文件当中的 assocation -
在持久层接口 IAccountDao.java 中添加 findAll 方法,并采用延迟加载的方式
-
注:Account实体类 应该包含一个 User 的属性,用于 一对一 表查询进行结果集封装
@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(column="uid",
property="user",
one=@One(select="com.itheima.dao.IUserDao.findById",
fetchType=FetchType.LAZY) )
})
List<Account> findAll();
- 添加测试方法
//核心代码
public void testFindAll() {
List<Account> accounts = accountDao.findAll();
for(Account account : accounts) {
System.out.println(account);
System.out.println(account.getUser());
}
}
2.2 many 一对多
-
应用场景
多表查询,一般设计到 左/右外连接 -
需求分析
查询用户信息时,也需查询他的账户列表。
一个用户具有多个账户信息,就形成了 User 与 Account 之间的一对多关系。 -
注:用户实体类中应该包含一个 List< Account> 属性,用于进行一对多的结果集封装。
-
在持久层接口 IUserDao.java 中添加 findAll 方法,并采用延迟加载的方式
@Select("select * from user")
@Results(id="userMap",
value= {
@Result(id=true,column="id",property="userId"),
@Result(column="username",property="userName"),
@Result(column="sex",property="userSex"),
@Result(column="address",property="userAddress"),
@Result(column="birthday",property="userBirthday"),
@Result(column="id",property="accounts",
many=@Many(
select="com.itheima.dao.IAccountDao.findByUid",
fetchType=FetchType.LAZY
) )
})
List<User> findAll();
}
- 添加测试方法
//核心代码
public void testFindAll() {
List<User> users = userDao.findAll();
for(User user : users) {
System.out.println("----用户信息-----");
System.out.println(user);
System.out.println(user.getAccounts());
}
}
总结
@Insert:表插入操作
@Update:表更新操作
@Delete:表删除操作
@Select:表查询操作
@Result:实现结果集封装
@Results:使用@Results注解来映射查询结果集(表字段)到实体类属性,与@Result 一起使用,封装多个结果集
@ResultMap:引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装