Mybatis框架入门

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

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

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

二、Mybatis框架

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

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



<configuration>

<environments default="development">
<environment id="development">

<transactionManager type="JDBC"/>

<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>

<mappers>
<mapper resource="sqlMap/User.xml"/>
mappers>
configuration>

3、Mapper 映射文件配置 User.xml
Mybatis框架入门_第2张图片

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

4、创建Java具体类
Mybatis框架入门_第3张图片
5、先加载 SqlMapConfig 资源文件,再通过 SqlSessionFactoryBuilder 根据资源文件创建会话工厂,有了会话工厂就可以通过 SessionFactory 的 openSession()方法获取到会话 SqlSession 对象。

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

Mybatis框架入门_第4张图片
Mybatis框架入门_第5张图片
6、输出映射
1)resultType 为基本类型
Integer,String,map
2)resultMap 自定义类型,一般为pojo

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

三、动态sql开发

1.标签

第一种,精确查询
   <if test="name !=null and name !=''">
            and name = #{name}
   if>
第二种,模糊查询
   <if test="fileName != null and fileName !=''">
      "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
        "func_ids" index="index" item="item"
            open="(" separator="," close=")">
            #{item}
        
        if>

传入参数为array,要用length
Mybatis框架入门_第6张图片

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>

你可能感兴趣的:(javaweb,mybatis)