-
什么是MyBatis?
MyBatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为java对象并返回。
-
MyBatis中的主要组成部分
SqlSessionFactory:SqlSessionFactory是MyBatis中的一个重要的对象,它是用来创建SqlSession对象的,而SqlSession用来操作数据库的,SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。
SqlSessionFactory创建代码示例:
```java
//1.InputStream in = Resources.getResourceAsStream("xxx.xml");
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sfb.build(in);
```
SqlSession:使用Mybatis的主要java接口就是SqlSession。可以通过这个接口来执行命令,获取映射器和管理事务,从而实现增删改查,每个线程都应该有它自己的 SqlSession 实例,SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
SqlSession创建代码示例:
```java
//1.SqlSession sqlSession = sqlSessionFactory.openSession();
```
-
MyBatis配置
- 设置(settings)
主要作用:settings是MyBatis中极为重要的调整设置,会改变Mybatis的运行时行为。
设置(settings)代码示例:
<settings> <setting name="xxx" value="xxx"/> </settings>
- 类型别名(typeAliases)
主要作用:给很长的包路径起别名,简化使用对象,
类型别名(typeAliases)代码示例:
<typeAliases> <!--type属性:完整的实体类、包路径; alias属性:实体类别名--> <typeAlias alias="userinfo" type="xxx.Userinfo"/> </typeAliases>
- 环境配置(environments)
主要作用:在 MyBatis 中,environments 是放有关数据库连接数据的配置信息的,其中可以配置多个数据库的连接环境,方便 sql 语句可以适用于多个数据库环境。
环境配置(environments)代码示例:
<!-- 环境列表 --> <environments default="development"> <!-- 环境1(开发) --> <environment id="development"> </environment> </environments>
- 映射器(mappers)
主要作用:添加映射文件,可以通过读取映射文件调用相应的方法。(sql语句都写在映射文件中:增删改查)
映射器(mappers)代码示例:
<mappers> <!-- SQL映射文件 --> <mapper resource="xxx/ProductMapper.xml"/> </mappers>
-
MyBatis XML 映射器
1.常用节点作用总结
- select :映射查询语句
- update:映射更新语句
- delete:映射删除语句
- insert:映射插入语句
2.常用属性作用总结
- id 属性:表示命名空间中唯一的标识符,常与明明空间组合起来使用。组合后如果不唯一,MyBatis会抛出异常。
- resultType 属性:从SQL语句中返回的类型的类的完全限定名或别名。如果是集合类型,那应该是集合可以包含的类型,而不能是集合本身。返回时可以使用 resultType 或 resultMap,但不能同时使用。
- parameterType 属性:该属性表示传入SQL语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
- useGeneratedKeys属性:在settings元素中设置useGeneratedKeys参数作用是允许JDBC支持自动生成主键,需要驱动兼容;xml映射器中配置的useGeneratedKeys参数只会对xml映射器产生影响,且在settings元素中设置的全局useGeneratedKeys参数值对于xml映射器不产生任何作用;在接口映射器中设置的useGeneratedKeys参数会覆盖在
<settings>
元素中设置的对应参数值。 - keyProperty属性
3.常见SQL映射示例
示例1:普通增加 SQL映射配置 <insert id="insertAnswerRecord" parameterType="AnswerRecord" useGeneratedKeys="true" keyProperty="recordId"> insert into answer_record(respondent,question,right_answer,submit_answer,submit_datetime) values(#{respondent},#{question},#{rightAnswer},#{submitAnswer},now()) </insert>
接口方法定义 int insertAnswerRecord(AnswerRecord answerRecord);
>示例2:批量增加
> SQL映射配置
<insert id="insertAnswerRecordBatch"
parameterType="list"
useGeneratedKeys="true" keyProperty="recordId">
INSERT INTO
answer_record(respondent,question,right_answer,submit_answer,submit_datetime)
VALUES
<foreach collection="list" item="record" separator=",">
(
#{record.respondent},
#{record.question},
#{record.rightAnswer},
#{record.submitAnswer},
now()
)
</foreach>
</insert>
接口方法定义 int insertAnswerRecordBatch(List<AnswerRecord> answerRecordList);
>示例3:普通删除
> SQL映射配置
<delete id="deleteAnswerRecord">
delete from answer_record
where record_id = #{recordId}
</delete>
>> 接口方法定义
int deleteAnswerRecord(int recordId);
>示例4:批量删除
>
> > SQL映射配置
>
> <delete id="deleteAnswerRecordBatch" parameterType="list">
> DELETE FROM answer_record
> WHERE record_id IN
> <foreach collection="list" item="rid" separator="," open="(" close=")">
> #{rid}
> </foreach>
> </delete>
> >>```java
> >> >> 接口方法定义
> >> int deleteAnswerRecordBatch(List<Integer> recordIdList);
> >>```
>示例5:动态修改
>
> > SQL映射配置
>
> <update id="updateAnswerRecord" parameterType="AnswerRecord">
> update answer_record
> <set>
> <if test="respondent!=null">respondent = #{respondent},</if>
> <if test="question!=null">question = #{question},</if>
> <if test="rightAnswer!=null">right_answer = #{rightAnswer},</if>
> <if test="submitAnswer!=null">submit_answer = #{submitAnswer},</if>
> submit_datetime = now()
> </set>
> where record_id = #{recordId}
> </update>```
> >> 接口方法定义
>int updateAnswerRecord(AnswerRecord answerRecord);
>示例6:动态查询
>
> > SQL映射配置
>
> <select id="listAnswerRecordByCondition" resultType="AnswerRecord" parameterType="AnswerRecord">
>
> SELECT record_id AS recordId,
> respondent,
> question,
> right_answer AS rightAnswer,
> submit_answer AS submitAnswer,
> submit_datetime AS submitDatetime
> FROM answer_record
>
> <where>
> <if test="respondent != null">
> AND respondent = #{respondent}
> </if>
>
> <if test="question != null">
> AND question = #{question}
> </if>
>
> <if test="rightAnswer != null">
> AND right_answer = #{rightAnswer}
> </if>
>
> <if test="submitAnswer != null">
> AND submit_answer = #{submitAnswer}
> </if>
> </where>
> </select>```
> >> 接口方法定义
>List<AnswerRecord> listAnswerRecordByCondition(AnswerRecord condition);
>示例7:查询结果封装为Map
> SQL映射配置```
<select id="countAnswerRecordDataByRespondent" resultType="Map">
select count(record_id) as total_question,
(select count(record_id) from answer_record where respondent = #{respondent} and right_answer = submit_answer) as right_question,
(select count(record_id) from answer_record where respondent = #{respondent} and right_answer != submit_answer) as wrong_question
from answer_record
where respondent = #{respondent}
</select>```
>> 接口方法定义
Map<String,Integer> countAnswerRecordDataByRespondent(String respondent);
网友评论