MyBatis技术总结
分类:JavaEE框架技术原创文章
作者:程序猿VV
-
什么是MyBatis?
MyBatis是一个基于JDBC的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain OldJava Objects,普通老式 Java 对象)为数据库中的记录。
-
MyBatis中的主要组成部分
SqlSessionFactory:SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。
SqlSessionFactory创建代码示例:
InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); ``` >SqlSession:即会话,相当于JDBC中的连接+操作+结果集。 > >如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try...catch...finally... 语句来保证其正确关闭。 ##### SqlSession创建代码示例: ```java SqlSession sqlSession = sqlSessionFactory.openSession();
-
MyBatis配置
- 设置(settings)
主要作用:MyBatis框架运行规则配置,可以影响MyBatis的运行时行为。
设置(settings)代码示例:
-
类型别名(typeAliases)
主要作用:1.通过
标签下的子标签 给指定类的完全限定名取别名。 2.通过
标签下的子标签 直接指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean。
类型别名(typeAliases)代码示例:
- 环境配置(environments)
主要作用:定义了如何配置元素,包括环境元素、事务管理器、数据源配置、数据源参数设置(此处使用properties外部文件设置);如果需要配置多个环境时,则在
节点中配置多个 即可,但要保证默认环境中匹配其中一个环境的id值。注意:每个sqlSessionFactory实例只能选择一种环境。 环境配置(environments)代码示例:
- 映射器(mappers)
主要作用:通过映射器,我们可以自定义SQL语句,灵活的操作数据库。
sql映射器:sql映射文件+sql映射接口 一张数据库内的表对应一个映射器,与表名相同。
映射器(mappers)代码示例:
-
MyBatis XML 映射器
1.常用节点作用总结
- select :映射sql查询语句
- update:映射sql修改语句
- delete:映射sql删除语句
- insert:映射sql插入语句
2.常用属性作用总结
- id 属性:sql语句的唯一标识符,通过id引用sql语句
- resultType 属性:sql语句的返回值类型
- parameterType 属:sql语句的参数类型
- useGeneratedKeys属性:开启主键回填
- keyProperty属性:设置用于保存回填主键值的属性名称,即对应实体类的属性名称
3.常见SQL映射示例
示例1:普通增加
insert into answer_record(respondent,question,right_answer,submit_answer,submit_datetime)
values(#{respondent},#{question},#{rightAnswer},#{submitAnswer},#{submitDatetime})
/**
* 添加新答题记录
* @param answerRecord 答题记录对象
* @return 影响行数
* ps.测试时需要输出新答题记录的编号
*/
int insertAnswerRecord(AnswerRecord answerRecord);
示例2:批量增加
insert into answer_record(respondent,question,right_answer,submit_answer,submit_datetime)
values
(
#{record.respondent},
#{record.question},
#{record.rightAnswer},
#{record.submitAnswer},
now()
)
/**
* 批量添加新答题记录
* @param answerRecordList 添加数据集合
* @return 影响行数
*/
int insertAnswerRecordBatch(List answerRecordList);
示例3:删除记录
delete from answer_record
where record_id = #{recordId}
/**
* 删除答题记录
* @param recordId 答题记录编号
* @return 影响行数
*/
int deleteAnswerRecord(int recordId);
示例4:批量删除
delete from answer_record
where record_id in
#{rid}
/**
* 批量删除答题记录
* @param recordIdList
* @return
*/
int deleteAnswerRecordBatch(List recordIdList);
示例5:动态修改
update answer_record
respondent = #{respondent},
question = #{question},
right_answer = #{rightAnswer},
submit_answer = #{submitAnswer},
submit_datetime = now()
where record_id = #{recordId}
/**
* 动态修改答题记录
* @param answerRecord 答题记录对象(包含答题记录编号)
* @return 影响行数
*/
int updateAnswerRecord(AnswerRecord answerRecord);
示例6:动态查询
/**
* 按照条件对象中的多条件值,动态查询
* @param condition 条件对象
* @return 答题记录集合
*/
List listAnswerRecordByCondition(AnswerRecord condition);
示例7:查询结果封装为Map
/**
* 按照答题者姓名,统计该答题者的总答题数目、正确题目数目、错误题目数目
* @param respondent
* @return
*/
Map countAnswerRecordDataByRespondent(String respondent);