Mybatis-使用注解开发
1. 面向接口编程
定义与实现的分离;
接口反映了系统设计人员对系统的抽象理解;
接口应有两类:
- 对一个个体的抽象,它可对应为一个抽象体(abstract class)
- 对一个个体某一方面的抽象,即形成一个抽象面(interface)
2. 使用注解开发
-
接口
@Select("select * from user") List<User> getUsers();
-
在mybatis核心配置文件中绑定接口
<mappers> <mapper class="com.kangzhu.dao.UserMapper"/> </mappers>
-
测试
@Test public void test() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.getUsers(); for (User user : users) { System.out.println(user.getName()); } sqlSession.close(); }
note:
虽然使用注解很方便,也不用写Mapper.xml文件;但是对于较为复杂的sql操作,注解就显得力不从心了;同时,结果映射也是无法实现的;
3. mybatis详细执行流程
- Resources获取加载全局的配置文件
- 创建SqlSessionFactoryBuilder对象
- build过程
- 解析配置文件流
- 根据配置文件流进行配置
- 得到SqlSessionFactory对象
- 创建事务管理器(相当于connection)
- 创建executor执行器
- 创建SqlSession对象,用来实现CRUD(执行器执行,并且可能涉及事务提交)
- 查看是否执行成功(可能涉及事务回滚)
4. CRUD
通过参数设置自动提交:
-
在工具类获取Sqlsession对象的时候参入参数
public static SqlSession getSqlSession() { SqlSession sqlSession = sqlSessionFactory.openSession(true); return sqlSession; }
-
原理
- 点击进入openSession方法:
public interface SqlSessionFactory { SqlSession openSession(); // 选用的是第二个方法重构 SqlSession openSession(boolean var1); SqlSession openSession(Connection var1);
- 找到其下面的实现类:
public SqlSession openSession(boolean autoCommit) { return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, autoCommit); }
可以看到我们实在这里实现的自动提交事务;
关于注解获取接口参数问题:
// 方法存在多个参数,所有参数前必须加上 @Param()
@Select("select * from user where id = #{userId}")
User getUserByID(@Param("userId") int id);
当存在多个参数时,需要使用@Param()注解;而且注解中引用的参数名和@Param()中的一致;
但是:
@Insert("insert into user (id, name, password) values (#{id}, #{name}, #{pwd})")
int addUser(User user);
这种如果参数是JavaBean对象不用使用参数注解;注意注解中的参数要和JavaBean对象中的一致,而不是和数据库字段一致;
5. 再次体会Mybatis
- 一款优秀的持久层框架
- 几乎避免了所有的JDBC代码和手动设置参数以及获取结果集
- 可以使用XML或注解来配置和映射原生类型、接口和Java的POJO