Mybatis框架入门

来源:互联网 发布:红尘男女 网络歌手 编辑:程序博客网 时间:2024/05/18 13:43

一、传统的JDBC程序存在的问题

1、数据库连接,使用时就创建,不适用时就立即释放,对数据库进行频繁的开启和关闭,
造成数据库资源浪费,影响数据库性能
2、将 sql 语句硬编码到 java 代码中,如果 sql 语句修改,还需要重写编译 java 代码,不
便于系统维护
3、从查询的 resultSet 中遍历结果集数据时,将获取表的字段进行硬编码,不利于系统维

解决:
1、使用连接池关联数据库里连接
2、将 sql 语句存入到 xml 配置文件中,sql 语句修改无需重写编译
3、将查询的结果集 自动映射成 Java 对象

二、Mybatis框架

mybatis 是一个持久层框架,使程序员依靠mybatis的映射方式,专注于sql语句,自动完成输入输出映射。
示例:
1、工程目录:
这里写图片描述

2、在 config 资源目录下添加 sqlMapConfig..xml 文件,配置数据源和事物,并加载 Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 和 spring 整合后,下面配置将会被废弃* --><environments default="development"><environment id="development"><!-- 使用了 JDBC 的事物管理,事物控制由 myBatis 控制 --><transactionManager type="JDBC"/><!-- 使用了连接池,由 myBatis 管理,以后会使用第三方的--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/yspweb"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 加载 mapper --><mappers><mapper resource="sqlMap/User.xml"/></mappers></configuration>

3、Mapper 映射文件配置 User.xml
这里写图片描述

延伸:尽量不使用${}${}表示一个拼接符, 有 sql 注入的风险。
where id=${value} sql解析后变成id=value
where id=#{value} sql解析后变成id="value",多了双引号。
mybaties排序时使用order by 动态参数时需要注意,使用${}而不用#{};

4、创建Java具体类
这里写图片描述
5、先加载 SqlMapConfig 资源文件,再通过 SqlSessionFactoryBuilder 根据资源文件创建会话工厂,有了会话工厂就可以通过 SessionFactory 的 openSession()方法获取到会话 SqlSession 对象。

SqlSession 是线程不安全的(即多个线程访问不能使用同一个对象),在 SqlSession
实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession 的最佳使用场合是在方法体内,定义成局部变量使用;执行完了数据库的操作后,记得要释放资源,执行更新操作时还要先提交事物。

这里写图片描述
这里写图片描述
6、输出映射
1)resultType 为基本类型
Integer,String,map
2)resultMap 自定义类型,一般为pojo

 <resultMap id="mybatisId" type="包名.pojo名"    <result property="funcId" column="func_id" javaType="String"   jdbcType="VARCHAR" />    。。。。</resultMap>

三、动态sql开发

1.<if test>标签

第一种,精确查询   <if test="name !=null and name !=''">            and name = #{name}   </if>第二种,模糊查询   <if test="fileName != null and fileName !=''">      <bind name="fileName_l" value="'%'+fileName+'%'"/>          AND file_name like #{fileName_l}   </if>

2.for each标签
1) 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2) 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.)如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名。

传入参数为list,要用size()<if test="func_ids != null and func_ids.size()>0">        and fmr.func_id in        <foreach collection="func_ids" index="index" item="item"            open="(" separator="," close=")">            #{item}        </foreach>        </if>

传入参数为array,要用length
这里写图片描述

3.and or 混用需要加括号,因为and的优先级高于or,不加括号会得到不正确的结果

        <if test="reviseStatus != null and reviseStatus!=''">            and            <if test="reviseStatus==2">            ( revise_status='3'            </if>            <if test="reviseStatus==2">            or            </if>            revise_status = #{reviseStatus, jdbcType=INTEGER}            <if test="reviseStatus==2">            )            </if>        </if>
原创粉丝点击