1.传统的jdbc开发:
开发过程
1)加载驱动
2)获取链接connection
3)获取预处理对象statement
4)设置sql (采用占位符,防止sql注入)
5)给占位符设置值
6)执行获取结果集
7)对结果集进行封装
8)释放资源
开发问题:
1)频繁的创建链接
2)释放资源 造成了系统资源的浪费。 --》 数据库连接池
3)sql语句在java代码中,造成后期维护不易。
4)占位符设置值 存在硬编码。where语句里 条件不固定,造成维护不易
5)对结果集的解析封装 存在硬编码
2.ORM简介
Object Relational Mapping: 对象关系映射。
简单的理解为:ORM是通过 使用描述对象和数据库之间的映射关系的 元数据,将程序中的 对象自动的持久化到关系型数据库中。
3.mybatis架构
mybatis是一个ORM框架,是一个基于Java的[持久层]框架。
mybatis会对jdbc的操作过程进行封装,使得开发者只需要关注SQL本身,而无需去花费精力去处理 注册驱动、获取链接、
设置参数、结果集解析、 释放资源等工作,可以简化jdbc开发成本。
4.mybatis环境搭建
1.新建java项目,导入jar包
2.配置log4j.properties 打印日志
3.配置mybatis全局配置文件
<environments default="mysql">
<environment id="mysql">
<!-- 事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
5.会话工厂与会话
SqlSessionFactory: 会话工厂,通过全局配置文件创建的,由SqlSessionFactoryBuild对象创建。
作用:创建会话。
特点:会话工厂一旦创建,就会在应用程序的执行期间一直存在。我们就不需要重复的来创建这个会话工厂了。
所以我们应该 把它的实现方式设计为 单例模式的。
SqlSession: 会话。 作用:操作数据库。
特点:线程不安全的。应该把会话声明为局部的。
6.动态代理实现sql查询
只需要程序员编写Mapper接口(相当于dao接口),和映射文件,由 mybatis框架根据接口来创建接口的动态代理对象,
来代理接口方法的实现(类似于传统dao开发方式中的实现类)
规范要求:
1.mapper.xml映射文件 和 mapper接口的名字 必须一致。
2.mapper.xml映射文件的 namespace 与 接口 的类全路径相同
3.mapper.xml映射文件的 statement的id 与 接口的方法名相同
4.mapper.xml映射文件 的参数类型parameterType 与 接口方法的 参数类型相同
5.mapper.xml映射文件 的输出结果类型 与 接口方法的 返回类型相同
7.Mapper.xml详解
parameterType(输入类型)
java简单类型 int、String #{占位符的方式,任意字符}
pojo自定义对象 新增 #{pojo的属性名}
hashmap
<!-- hashmap用例取值方式: #{map的key}
注意: 当使用map中不存在的key取值时,取值为空null。 代码此处不报错-->
<select id="selectByMap" parameterType="map" resultType="User">
select * from user where sex = #{sex} and address like concat ("%",#{address},"%")
</select>
多参数的
<!-- 多参数的 用例parameterType 可以省略掉@Param: 作用:把注解的对象 set放到了map中 ,key就是("")
第二种取值方式: #{index}, 下标index从0开始-->
<select id="selectByParams" resultType="User">
<!-- select * from user where sex = #{sex} and address like concat ("%",#{address},"%") -->
select * from user where sex = #{0} and address like concat ("%",#{1},"%")
</select>
resultType(输出类型)
java简单类型的
pojo自定义对象
hashmap
resultMap
resultType:在指定pojo对象接收 映射的结果集时, 需要要将 pojo对象的属性名 和 数据库表的字段名要一致。
如果有不一致的,则查询的改字段为null。
解决对象属性名与表的类名不一致的方法:
方案一:给sql查询的字段 as 别名, 别名和pojo对象的属性名一致
SELECT carId carId, name carName , userId userId from car
方案二:使用resultMap方式
8.动态sql,实现sql语句的拼接
<!-- 动态sql :if用例
if: 语句判断, <if test=""> 使用and进行的并
where: 去除多余的and 或者是 or-->
<select id="selectIf" parameterType="map" resultType="User">
select * from user
<where>
<if test="sex!=null and sex!=''">
and sex = #{sex}
</if>
<if test="address!=null and address!=''">
and address like concat ("%",#{address},"%")
</if>
</where>
</select>
foreach: 批量删除
collection:集合的类型 。 可以是 list(list集合) / array(数组) / map /pojo包装类中的 属性名
item: 循环中的当前对象
open:循环的开始
close:循环的介绍
separator: 分割符
<delete id="deleteBatch" parameterType="int">
delete from user where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>