ssm------MyBatis

MyBatis概述

  • MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
  • MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
  • 总之,Mybatis对JDBC访问数据库的过程进行了封装,简化了JDBC代码,解决JDBC将结果集封装为Java对象的麻烦。
    image
    在这里插入图片描述

(1)mybatis-config.xml是Mybatis的核心配置文件,通过其中的配置可以生成SqlSessionFactory,也就是SqlSession工厂
(2)基于SqlSessionFactory可以生成SqlSession对象
(3)SqlSession是一个可以发送SQL去执行,并返回结果,类似于JDBC中的Connection对象,也是Mybatis中至关重要的一个对象。
(4)Executor是SqlSession底层的对象,用于执行SQL语句
(5)MapperStatement对象也是SqlSession底层的对象,用于接收输入映射(SQL语句中的参数),以及做输出映射(即将SQL查询的结果映射成相应的结果)

MyBatis优势对比

1、使用传统方式JDBC访问数据库:

使用JDBC访问数据库有大量重复代码(比如注册驱动、获取连接、获取传输器、释放资源等);
JDBC自身没有连接池,会频繁的创建连接和关闭连接,效率低;
SQL是写死在程序中,一旦修改SQL,需要对类重新编译;
对查询SQL执行后返回的ResultSet对象,需要手动处理,有时会特别麻烦;

2、使用mybatis框架访问数据库:

Mybatis对JDBC对了封装,可以简化JDBC代码;
Mybatis自身支持连接池(也可以配置其他的连接池),因此可以提高程序的效率;
Mybatis是将SQL配置在mapper文件中,修改SQL只是修改配置文件,类不需要重新编译。
对查询SQL执行后返回的ResultSet对象,Mybatis会帮我们处理,转换成Java对象。

mybatis-config.xml

MyBatis的全局配置文件,配置连接的数据库并导入Mapper配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- MyBatis的全局配置文件 -->
<configuration>
    <!-- 1.配置环境,可配置多个环境(比如:develop开发、test测试) -->
    <environments default="develop">
        <environment id="develop">
            <!-- 1.1.配置事务管理方式:JDBC/MANAGED JDBC:将事务交给JDBC管理(推荐) MANAGED:自己管理事务 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 1.2.配置数据源,即连接池 JNDI/POOLED/UNPOOLED JNDI:已过时 POOLED:使用连接池(推荐) UNPOOLED:不使用连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/yonghedb?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!-- 2.导入Mapper配置文件,如果mapper文件有多个,可以通过多个mapper标签导入 -->
    <mappers>
        <mapper resource="EmpMapper.xml" />
    </mappers>
</configuration>

映射关系

实体类Emp

package com.tedu.pojo;

public class Emp {
    // 1.声明实体类中的属性
    private Integer id;
    private String name;
    private String job;
    private Double salary;

    // 2.提供对应的getter和setter方法
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    // 3.重写toString方法
    @Override
    public String toString() {
        return "Emp [id=" + id + ", name=" + name + ", job=" + job + ", salary=" + salary + "]";
    }

}

接口EmpMapper

package com.tedu.dao;

import com.tedu.pojo.Emp;
public interface EmpMapper {

    /**
    * 根据id查询员工信息
    * @param id
    * @return Emp
    */
    public Emp findById(Integer id);

}

映射文件EmpMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 不同Mapper文件的namespace值应该保证唯一 在程序中通过[ namespace + id ]定位到要执行哪一条SQL语句 -->
<mapper namespace="com.tedu.dao.EmpMapper">
    <!-- 通过select、insert、update、delete标签声明要执行的SQL -->
    <!-- 1.查询:查询Emp表中指定id的员工信息 -->
    <select id="findById" resultType="com.tedu.pojo.Emp">
        select * from emp where id=#{id}
    </select>
</mapper>

映射文件标签说明

前面是xml的文档声明,用于声明xml的版本和编码,引入了xml约束文档,当前xml文档将会按照mybatis-3-mapper.dtd文件所要求的规则进行书写。
Mapper标签:根标签,其中namespace(名称空间,也叫命名空间),要求不能重复。在程序中通过【namespace + id 】定位到要执行哪一条SQL语句
select标签:用于指定将来要执行的各种SQL语句。标签上可以声明属性,下面介绍常用的属性:id、resultType、resultMap
id属性:要求值不能重复。将来在执行SQL时,可以通过【namespace +id】找到指定SQL并执行。
resultType属性:从这条SQL语句中返回所期望类型的类的完全限定名称(包名+类名)。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。简而言之,resultType控制查询SQL执行后返回值的类型或集合中的泛型,
例如查询emp表中的单条记录,返回值是一个Emp对象,因此,resultType=“com.tedu.pojo.Emp”;
如果查询emp表中的多条记录,返回值是一个List,此时resultType的值应该集合中的泛型,因此resultType=“com.tedu.pojo.Emp”;
resultMap属性:复杂对象结构(例如多表关联查询等)。 使用 resultType或 resultMap,但不能同时使用。

MyBatis增删改查

  • 编辑EmpMapper.xml文件, 添加新增员工对应的sql.
<insert id="insert" >
    insert into emp value(null, '赵云', '保安', 6000)
</insert>
  • 编辑EmpMapper.xml文件, 添加修改员工对应的sql。
<update id="update">
    update emp set job='保镖', salary=20000 where name='赵云'
</update>
  • 编辑EmpMapper.xml文件, 添加删除员工对应的sql。
<delete id="delete">
    delete from emp where name='赵云'
</delete>
  • 编辑EmpMapper.xml文件, 添加查询员工对应的sql。
<select id="select">
    select * from emp 
</select>

mybatis中的占位符

在上面的增删改查操作中,SQL语句中的值是写死在SQL语句中的,而在实际开发中,此处的值往往是用户提交过来的值,因此这里我们需要将SQL中写死的值替换为占位符。
在mybatis中占位符有两个,分别是 #{} 占位符 和 ${} 占位符:

#{}占位符

相当于JDBC中的问号(?)占位符,是为SQL语句中的参数值进行占
位,大部分情况下都是使用#{}占位符;并且当#{}占位符是为字符串或者日期类型的值进行占位时,在参数值传过来替换占位符的同时,会进行转义处理(在字符串或日期类型的值的两边加上单引号);

在mapper文件中: select * from emp where name=#{name}
在程序执行时: select * from emp where name=?
参数:王海涛,将参数传入,替换占位符
select * from emp where name=王海涛; -- 错误
select * from emp where name='王海涛'; -- 正确

${}占位符

是为SQL片段(字符串)进行占位,将传过来的SQL片段直接拼接在
${} 占位符所在的位置,不会进行任何的转义处理。(由于是直接将参数拼接在SQL语句中,因此可能会引发SQL注入攻击问题)

动态SQL标签

if、where标签

  • 标签:是根据 test属性 中的布尔表达式的值,从而决定是否执行包含在其中的SQL片段。如果判断结果为true,则执行其中的SQL片段;如果结果为false,则不执行其中的SQL片段
  • 标签:用于对包含在其中的SQL片段进行检索,在需要时可以生成where关键字,并且在需要时会剔除多余的连接词(比如and或者or)
<!--
* 如果没有参数, 则不执行where子句, 默认查询所有员工:
* select * from emp
*
如果参数中只有minSal(即minSal不为null), 则:
* ... where salary > minSal
*
如果参数中只有maxSal(即maxSal不为null), 则:
* ... where salary < maxSal
* 如果参数有
minSal、maxSal(即minSal、maxSal不为null), 则:
* ... where salary > minSal and
salary < maxSal 
-->
<select id="findAllBySal2" resultType="com.tedu.pojo.Emp">
    select * from emp
    <where>
        <if test="minSal != null">
            and salary>#{minSal}
        </if>
        <if test="maxSal != null">
            and salary <![CDATA[ < ]]>
            #{maxSal}
        </if>
    </where>
</select>

foreach标签

  • foreach 标签:可以对传过来的参数数组或集合进行遍历,以下是foreach标签上的各个属性介绍:

在这里插入图片描述

<!-- 练习: 根据员工的id批量更新员工信息 将id为 2、4、6、8的员工的薪资在原有基础上增加1000 update emp set 
    salary=salary + 1000 where id in(2,4,6,8); -->
<update id="updateByIds">
    update emp set salary=salary + #{sal}
    where id in
    <foreach collection="arrIds" open="(" item="id" separator=","
        close=")">
        #{id}
    </foreach>
</update>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值