mybatis学习02.5 基于注解开发

数据准备

表结构

idint(11)
usernamevarchar(32)
birthdaydatetime
sexchar(1)
addressvarchar(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();
  1. 添加测试方法
//核心代码
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:实现一对多结果集封装
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页