mybatis配置文件sqlMap-Config.xml补充
配置详细介绍见网址:http://www.mybatis.org/mybatis-3/zh/configuration.html
<configeration>
<!-- 加载属性文件 -->
<!--
在properties元素体内定义的元素属性优先被读取,
然后读取properties元素中resource或url加载的属性,他会覆盖已读取的同名属性,
最后读取parameterType传递的属性,它会覆盖已读取的同名属性
-->
<!-- 建议
1.不要在properties元素体内定定义任何值,只将属性定义在properties文件中
2.在properties文件中定义的属性名一定要有特殊性,如xxxx.xxx
-->
<properties resource="db.properties">
<property name="" value=""/>
<property name="" value=""/>
</properties>
<!-- 全局配置参数 -->
<!-- 使用时再进行配置,否则配错了影响系统 -->
<!-- <setting> -->
<!-- </setting> -->
<!-- 别名定义 -->
<typeAliases>
<!--
针对单个别名定义
type:类型的路径
alias:别名
-->
<typeAlias type="com.zyl.mybatis.demo.pojo.EbizCode" alias="EbizCode"/>
<!-- 批量别名定义
mybatis 自动扫描包中的po类,自动定义别名,别名就是类名(首字母大小写均可)
注:vo视图层对象,po持久层对象,pojo自定义对象
-->
<package name="com.zyl.mybatis.demo.pojo"/>
</typeAliases>
<!-- 类型处理器
mybatis通过typeHandlers完成jdbc类型和java类型的转换,
通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义
-->
<!-- <typeHandlers></typeHandlers> -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理, 事务控制由mybatis进行管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis进行管理 -->
<dataSource type="POOLED">
<property name="driver" value=""/>
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<!-- 通过resource 一次加载一个映射文件 -->
<mapper resource="sqlmap/EbizCode.xml" />
<!-- 通过mapper 加载映射文件 (单个)
规范:
需要将mapper接口的类名和mapper.xml映射文件名保持一致,且在一个目录中(使用mapper代理方式)
-->
<!-- <mapper class=""/>
<!-- 批量加载mapper映射文件
规范:
需要将mapper接口的类名和mapper.xml映射文件名保持一致,且在一个目录中(使用mapper代理方式)
-->
<!-- <package name=""/> -->
</mappers>
</configeration>
mybatis基础简单归纳
一、首先看下sql文件的编写
<!--
命名空间,作用是对sql进行分类管理,理解sql隔离
注意:使用mapper代理方法开发,namesapce有特殊重要的作用
The content of element type "mapper" must match "EMPTY". 这个错误是上面的头有问题
(dtd头文件引入出现错误)
-->
<mapper namespace="ebizCode">
<!-- 定义sql片段 -->
<!--
一般基于单表来定义sql片段,可重用性高
一般不要包含<where>标签
-->
<sql id="test">
</sql>
<!-- 定义resultMap
将 select id id_, name name_ from pf_customer 和pojo类中的属性做一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id: resultMap唯一标识
-->
<resultMap type="pfCustomer" id="pfCustomerMap">
<!-- id表示结果集唯一标识 -->
<id column="id_" property="id" />
<!-- 普通映射定义 -->
<result column="name_" property="name" />
</resultMap>
<!-- 配置sql语句 -->
<!--
通过selct执行数据库查询
id:标识映射文件中的sql,称为statement的id
将sql语句封装到mapperdstatement对象中
#{} 表示一个占位符号
parameterType 指定输入参数的类型
#{codeType} 其中codeType表示输入的参数,参数名称就是id,若输入参数为简单类型, #{}中参数名可以任意,可以value或其它名称
resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录(画重点)映射成java对象
-->
<select id="getEbizCodeByType" parameterType="String" resultType="com.zyl.mybatis.demo.pojo.EbizCode">
select * from ebiz_code c where c.code_type= #{codeType}
</select>
<!-- 根据用户名模糊查询,可能返回多条 -->
<!-- (画重点)resultType:指定就是单条记所映射的java对象类型 -->
<!-- ${}表示拼接sql串,将接收到的参数不加任何修饰拼接在sql中(容易造成sql注入)
${value}表示输入参数的内容,若传入类型是简单类型,${}中只能传value
-->
<select id="getEbizCodeByName" parameterType="String" resultType="com.zyl.mybatis.demo.pojo.EbizCode">
select * from ebiz_code c where c.code_type like '%#{value}%'
</select>
<select id="getEbizCodeByAll" parameterType="com.zyl.mybatis.demo.pojo.EbizCode" resultType="com.zyl.mybatis.demo.pojo.EbizCode">
<!-- where标签可以自动去掉第一个and -->
<where>
<if test="ebizCode != null">
and ebizCode.name like '%#{value}%'
</if>
<if test="ebizCode != null">
and ebizCode.name like '%#{value}%'
</if>
<if test="ebizCode != null">
and ebizCode.name like '%#{value}%'
</if>
<if test="ebizCode != null">
and ebizCode.name like '%#{value}%'
</if>
<!--
open 是拼接前的连接符
close 是拼接后的连接符
separator 每个对象之间的连接符
-->
<foreache collecion="待遍历的集合" item="集合中每个对象" open="AND(" close=")" separator="or">
</foreache>
</where>
</select>
<!-- 引用sql片段 -->
<select id="getEbizCodeByAll" parameterType="com.zyl.mybatis.demo.pojo.EbizCode" resultType="com.zyl.mybatis.demo.pojo.EbizCode">
<!-- where标签可以自动去掉第一个and -->
<where>
<!-- 引用sql片段id,若片段id不在本mapper中,需要加namespace -->
<include refid="test" />
<!-- 还可以引用其他片段 -->
</where>
</select>
</mapper>
1. parameterType:在映射文件通过parameterType指定输入 参数的类型;
2. resultType:在映射文件通过resultType指定输出结果类型 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
3.#{}和${}区别
#{} 表示一个占位符;#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号(会引起sql注入,存在安全隐患,不建议使用)
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
4.selectOne表示查询出一条记录进行映射,使用【4】可以实现,使用【5】也可以。
5. selectList查询出多条记录进行映射,使用【5】可以实现,使用【4】不可以。
6. mybatis / hibernate 本质区别和应用场景:
hibernate是一个标准的ORM框架。入门门槛较高,不需要程序写sql,sql语句自动生成。对sql语句进行优化、修改比较困难。
应用场景:适用于需求变化不多的中小型项目,比如后管系统、erp、oa等。
mybatis是专注sql本身,需要程序猿自己编写sql语句,sql修改、优化比较方便。
mybatis是一个不完全的orm框架,虽然程序员自己写sql,但也可以实现映射(输入/输出映射)。
应用场景:变动多,如互联网项目。
7. mybatis开发dao的方法
原始dao的方法
需要程序员自己编写dao接口和实现类
需要在dao实现类中注入一个sqlSessionFactory工厂
总结原始dao开发问题
Ⅰ.dao接口实现类方法中存在大量的模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
Ⅱ.调用SqlSession方法时,将statement的参数硬编码了。
Ⅲ.调用SqlSession方法时传入的变量,由于SqlSession方法使用泛型,导致即使变量类型传入错误类
型,在编译阶段也不会报错,不利于开发。
mapper代理开发(mybatis才有)
只需程序员编写mapper接口(就是dao接口)
程序员再编写mapper.xml(映射文件)和mapper.java需要遵循一些开发规范
采用mapper代理开发dao接口注意事项:
Ⅰ.在mapper.xml中 namespace 等于mapper接口全路径地址。
Ⅱ.mapper.java接口中的方法,方法名和xml中statement的id一致。
Ⅲ.mapper.java接口中的方法输入参数类型和mapper.xml中statement的paramterType指定的类型一致。
Ⅳ.mapper.java接口中的方法输出参数类型和mapper.xml中statement的resultType指定的类型一致。
8. SqlSession相关
8.1.SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory
将SqlSessionFactoryBuilder当成一个工具类,不需要使用单例模式进行管理SqlSessionFactoryBuilder
在需要创建工厂SqlSessionFactory的时候,只需要new一次SqlSessionFactory即可
8.2.SqlSessionFactory
通过SqlSessionFactory创建会话SqlSession,使用单例模式管理SqlSessionFactory(一旦创建,一直使用一个实例)。
mybatis 和 spring 整合后,使用单例模式管理SqlSessionFactory。
8.3.SqlSession
面向用户(程序员)的接口。
SqlSession 提供很多操作数据库的方法。
SqlSession 是线程不安全的。在 SqlSession 的实现类中除了有接口的方法(具体操作数据库的方法),还有数据域属性。
SqlSession 最佳应用场合在方法体内,定义成局部变量。
9.执行过程(画重点)
Ⅰ.配置mybatis文件,sqlMapConfig.xml(名字不固定)
Ⅱ.通过配置文件,加载mybatis运行环境,创建sqlSessionFactory会话工厂(sqlSessionFactory实际使用时按单例方式)
Ⅲ.通过sqlSessionFactory创建sqlSession
sqlSession是一个面向用户的接口(提供操作数据的方法),实现对象线程不安全,建议sqlSession应用场合在方法体内。
Ⅳ.调用sqlSession的方法操作数据库
若需要提交事务,需执行sqlSession的commit方法
Ⅴ.释放资源,关闭sqlSession