1. 面向接口编程
解耦,可拓展,提高复用
2. 使用注解开发
-
在接口上实现注解
@Select("select * from user") List<User> getUsers();
-
在核心配置文件中绑定接口
<!--绑定接口--> <mappers> <mapper class="com.yl.dao.UserMapper"/> </mappers>
-
测试
@Test public void test(){ SqlSession sqlSession = MyBatisUntils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUsers(); for (User user : userList) { System.out.println(user); } sqlSession.close(); }
本质:反射机制
底层:动态代理
客户端想访问目标对象(interface),事情由代理对象来做,代理对象找真实对象去做(代理对象和真实对象需实现同一接口),真实对象和目标对象实现了同一个方法,代理对象能够做一些拓展的功能
Mybatis执行流程
3. 注解CRUD
创建工具类时设置自动提交事务
//创建执行SQL的对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
编写接口,增加注解
//方法存在多个参数,所有参数前加 @Param("id")注解
@Select("select * from user where id = #{id}")
User getUserById(@Param("id") int id);
//引用对象不需要 @Param
@Insert("insert into user(id,name,pwd) values(#{id},#{username},#{pwd})")
int addUser(User user);
@Update("update user set name=#{username},pwd=#{pwd} where id = #{id}")
int updateUser(User user);
@Delete("delete from user where id = #{uid}")
int delUser(@Param("uid") int id);
测试
【必须将接口注册绑定到核心配置文件中】
<!--绑定接口-->
<mappers>
<mapper class="com.yl.dao.UserMapper"/>
</mappers>
@Test
public void test(){
SqlSession sqlSession = MyBatisUntils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
/* List<User> userList = mapper.getUsers();
for (User user : userList) {
System.out.println(user);
}*/
/* User userById = mapper.getUserById(2);
System.out.println(userById);*/
// int i = mapper.addUser(new User(7, "李昊", "uiafa"));
// int i = mapper.updateUser(new User(6, "王晓", "dayuda"));
int i = mapper.delUser(7);
sqlSession.close();
}
@Param() 注解
- 基本类型参数或String类型需添加该注解
- 引用类型无需添加
- 若只有一个基本类型,可以省略
- 在SQL中引用的就是 @Param() 中设定的属性名
#{ } 与 ${ }区别
- #{ } 预编译,可防止SQL注入
- ${ } 拼接,不能防止SQL注入