Mybatis学习笔记-注解开发
面向接口编程
- 根本原因:【解耦】,【可拓展】,【更高规范性】
- 接口类型:
-
- abstract class
-
- interface
使用注解开发
- 简单语句可用注解开发(直接查询,列名与属性名相同)
本质:反射机制实现
底层:动态代理
-
- 注解直接在接口上实现
@Select("SELECT * FROM user")
List<User> getUsers();
-
- 也与要配置核心配置文件
<!--绑定接口-->
<mappers>
<mapper class="cn.iris.dao.UserMapper"/>
</mappers>
-
- 测试
@Test
public void getUsersTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for ( User user : users) {
System.out.println(user);
}
sqlSession.close();
}
- 复杂情况均用xml文件配置
注解实现CRUD
在工具类创建时实现自动提交事务
// 有了 SqlSessionFactory,我们可以从中获得 SqlSession 的实例
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
// 涉及源码
public SqlSession openSession(boolean autoCommit) {
return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, autoCommit);
}
查询
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(@Param("id") int id);
添加
@Insert("INSERT INTO user(id,name,pwd) VALUES (#{id},#{name},#{password})")
int addUser(User user);
修改
@Update("UPDATE user SET name = #{name} WHERE id = #{id}")
int updateUser(@Param("id") int id, @Param("name") String name);
删除
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteUserById(@Param("id") int id);
方法存在多参数时,每个参数前都需要加@Param("列名")
@param()注解
- 基本类型参数&String类型,需要加
- 引用类型(如:User)不用加
- 只有单参,可忽略但不建议
- SQL中引用的则是该@param设定的属性名
#{} 与 ${}区别
--#{}:预编译符--没有sql注入风险
--${}:常规编译(字符串拼接)--存在sql注入风险