学习内容:使用注解开发(CRUD)
1. 怎么使用注解
1.1、注解在接口上实现
1.2、需要再核心配置文件中绑定接口
1.3、编写测试程序
我们使用注解就可以不用编写UserMapper.xml(可以理解成接口实现类)文件了。
Mybatis详细的执行流程:
本质:反射机制实现
底层:动态代理
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
2. 用注解实现CRUD(增删改查)
数据库中的数据:
2.1、我们可以在工具类创建的时候实现自动提交事务
public static SqlSession getSqlSession() {
//这里设置了true之后,执行事务自动提交
//就不用再手动写代码了(sqlSession.commit();)
return sqlSessionFactory.openSession(true);
}
2.2、查询(根据id查询用户)
- 编写接口,增加注解
方法存在多个参数的时候,所有的参数前面必须加上@Param("参数名")注解
只有基本数据类型要加@Param(),引用数据类型不用加
sql语句中的#{属性名}中的属性名必须和@Param("属性名")中的属性名一致,否则将找不到
//通过id查询用户
//方法存在多个参数的时候,所有的参数前面必须加上@Param("参数名")注解
//只有基本数据类型要加@Param(),引用数据类型不用加
//sql语句中的#{属性名}中的属性名必须和@Param("属性名")中的属性名一致,否则将找不到
@Select("select * from user where id=#{id}")
User getUserById(@Param("id") int id);
- 编写测试程序
//根据id查询用户
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
sqlSession.close();
}
结果:
之前说过,这里之所以password找不到是因为数据库中的属性名是pwd,而实体类中的属性名是password,两者不一致,所以查找不到(详情请见)。
但是这里没有无法使用结果映射集,只能将sql语句改为select id,name,pwd as password from mybatis.user where id = #{id}
,但是如果当实体类中的属性较多的时候,会很麻烦,所以还是尽量保持数据库和实体类中的属性名一致。
修改之后的结果:
2.3、添加
- 编写接口,增加注解
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
- 编写测试程序
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int result = mapper.addUser(new User(4,"pc","123"));
if (result>0){
System.out.println("添加成功!");
}
sqlSession.close();
}
结果:
2.4、修改
- 编写接口,增加注解
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
- 编写测试程序
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int result = mapper.updateUser(new User(4,"lb","123"));
if (result>0){
System.out.println("修改成功!");
}
sqlSession.close();
}
结果:
2.5、删除
- 编写接口,增加注解
//删除
@Delete("delete from user where id=#{id}")
int deleteUser(@Param("id") int id);
- 编写测试程序
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int result = mapper.deleteUser(4);
if (result>0){
System.out.println("删除成功!");
}
sqlSession.close();
}
结果:
3. 关于@Param() 注解
- 基本类型的参数或者String类型,需要加上
- 引用类型不需要加
- 如果只有一个基本类型的话,可以忽略,但是建议大家都加上!
- 我们在SQL中引用的就是我们这里的 @Param() 中设定的属性名!
4. #{}和${} 区别
延伸:
-
用${传入数据直接显示在生成的sqI中,如上面的语句,用role. id = ${roleld,jdbcType=INT&ER},那么sq|在解析的时候值为role_ id= roleid,执行时会报错;
-
${方式无法防止sq|注入;
-
$-般用入传入数据库对象,比如数据库表名;
-
能用#}时尽量用#0};
注意:
Mybaties排序时使用order by动态参数时需要注意,使用${}而不用#{}。