解耦,可扩展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好;定义与实现的分离;两类接口:抽象体 abstract class 和 抽象面 interface;一个个体可能有很多个抽象面; 7.2 使用注解开发
注解在接口上实现;
public interface UserMapper {
@Select("select * from user")
List getUsers();
}
需要在核心配置文件mybatis-config.xml中绑定接口;
测试!
本质:反射机制实现底层:动态代理Mybatis详细执行流程
- Resources对象获取全局配置文件;实例化SqlSessionFactoryBuilder对象;XMLConfigBuilder解析配置文件流;Configuration所有配置信息;sqlSessionFactory对象实例化;transaction事务管理;创建executor执行器;创建sqlSession;实现CRUD;查看是否执行成功;如果执行成功,提交事务;关闭sqlSession。
MybaitsUtils.java
public static SqlSession getSqlSession() {
//这里可以设置参数true事务自动提交, 不用再手动写代码sqlSession.commit()
return sqlSessionFactory.openSession(true);
}
7.4.2 查询: Read
编写接口,添加注解 UserMapper.java
@Select("select * from user where id = #{id}")
User getUserById(@Param("id") int id);
测试程序
@Test
public void testGetUserById() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(2);
System.out.println(user);
sqlSession.close();
}
结果
注意:这里password为null,是因为数据库表的字段属性名pwd与实体类的属性名称password不一致;但是这里使用注解开发不能使用结果映射集,所以为了简单起见,最好保持属性名称一致。或者将其注解sql语句修改为select id, name, pwd as password from user where id = #{id},修改之后的结果:
7.4.3 添加: Create
编写接口
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
编写测试程序
@Test
public void testAddUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(1,"ano","123");
int i = mapper.addUser(user);
if(i > 0) {
System.out.println("添加用户成功 " + i);
}
sqlSession.close();
}
结果
编写接口
@Update("update user set name = #{name}, pwd = #{password} where id = #{id}")
int updateUser(User user);
编写测试程序
@Test
public void testUpdateUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(1, "anobabe","123456");
int i = mapper.updateUser(user);
if(i > 0) {
System.out.println("修改用户成功 " + i);
}
sqlSession.close();
}
结果
编写接口
@Delete("delete from user where id = #{id}")
int deleteUserByID(int id);
编写测试程序
@Test
public void testDeleteUserByID() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUserByID(4);
if(i > 0) {
System.out.println("删除成功 " + i);
}
sqlSession.close();
}
结果
7.4.6 #{} 和 ${}的区别#{}是预编译处理,${}是字符串替换。MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值,而在处理 时 , 是 把 {} 时,是把 时,是把{}替换成变量的值。#{}可以有效的防止SQL注入。一些特殊情况必须用 , 如 使 用 o r d e r b y 时 使 用 {},如使用order by时使用 ,如使用orderby时使用{}而不是#{}



