这是一张mybatis原理实现流程图,姑且放这。
再说一些注意事项:
1、持久层接口和持久层接口的映射配置必须在相同的包下
2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口全限定类名(没有配置别名的时候)
3、SQL 语句的配置标签,,,的 id 属性必须和持久层接口的方法名相同。
4、当模式查询时有两种解决办法:
- 在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%。例如:%李,配置文件中的#{username}也只是一个占位符,所以 SQL 语句显示为“?”
- 另一种就是在配置文件中加入%
sql语句如下:
select * from user where username like '%${value}%'
5、#{}和${}区别
-
#{} 表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。 -
$ {} 表示拼接 sql 串
通过$ {}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, $ {} 可以接收简单类型值或 pojo 属性值,如果parameterType 传输单个简单类型值,${}括号中只能是 value。
6、mysql 在 在 windows 系统中不区分大小写!
Mybatis 与 与 JDBC 编程的比较
-
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。 -
Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。 -
向sql语句传参数麻烦,因为sql语句的where 条件不一定,可能多也可能少,占位符需要和参数对应。
解决:Mybatis自动将 java 对象映射至 sql 语句,通过 statement 中的parameterType 定义输入参数的类型。 -
对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对
象解析比较方便。
解决:Mybatis自动将 sql执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型。
resultType 配置结果类型
resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。
<!-- 根据用户名称模糊查询,参数变成一个 QueryVo 对象了 -->
<select id="findByVo" resultType="返回类型" parameterType="接收类型">
select * from user where username like #{user.username};
</select>
resultMap 结果类型
resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
<!-- 建立 User 实体和数据库表的对应关系
type 属性:指定实体类的全限定类名
id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
-->
<resultMap type="类型" id="userMap">
<<id property="id" column="ID"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<result property="birthday" column="birthday"/>
</resultMap>
id 标签:用于指定主键字段
result 标签:用于指定非主键字段
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称