9、使用注解开发
9.1、面向接口编程
解耦合
定义和实现分离
针对复用技术,体现整体架构
9.2、使用注解写sql
在接口上加注解就不需要 mapper.xml 了
public interface UserMapper {
@Select("select * from mybatis.user")
List<User> getUsers();
}
测试类不变
@Test
public void testSelectAll() {
try (SqlSession session = MybatisUtils.getSqlSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> userList = mapper.getUsers();
for (User u : userList) {
System.out.println(u);
}
}
}
结果:
User{id=1, name='dzy', passwd='null'}
User{id=2, name='张三', passwd='null'}
User{id=3, name='李四', passwd='null'}
User{id=4, name='王五', passwd='null'}
User{id=5, name='Hello', passwd='null'}
User{id=6, name='李五', passwd='null'}
为什么pwd是null?
- 因为 java 属性是 passwd 字段名是 pwd,并且没有使用 resultMap。
官方文档说:
- 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
- 选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
9.3、使用注解传参数
编写接口(每一个参数都需要@Param注解):
List<User> getUserByNameAndPasswd(@Param("n") String name, @Param("p") String passwd);
在 mapper.xml 的 sql 中直接使用注解里的参数 n 和 p 。
<select id="getUserByNameAndPasswd" resultMap="userMap">
select * from mybatis.user where `name` = #{n} and `pwd` = #{p}
</select>
编写测试代码:
@Test
public void TestSelectByNameAndPwd() {
try (SqlSession session = MybatisUtils.getSqlSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> userList = mapper.getUserByNameAndPasswd("dzy","123456");
for (User u: userList) logger.info(u);
}
}
结果:
[com.dzy.dao.UserDaoTest]-User{id=1, name='dzy', pwd='123456'}
为什么这个 pwd 不是 null?
- 因为设置了 resultMap
注意:
- 使用注解传参可以传多个参数
- 要在每个基本类型参数前面加注解,String 什么的也要加
- 引用类型不要加
- sql 中引用的是注解中的参数
9.4、使用注解增删改
如果使用9.2注解中写 sql 的方法,mybatis 会把 autoCommit 设置为 true。这样就不需要写sqlSession.commit()
提交事务了。系统会自动提交这个事务。