MyBatis

MyBatis核心组件

ORM和MyBatis

ORM即Object Relational Mapping(对象---关系映射)的简称。

项目中的业务实体有两种表现形式:对象和关系数据,即在内存中表现为对象,在数据库中表现为关系数据。

ORM框架一般以中间件的形式存在,如下图

从系统结构上看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全面向对象的做法,而面向对象的做法也会对性能产生一定的影响,因此产生一个半自动化的ORM框架MyBatis应运而生。

MyBatis是一个Java持久层框架,它封装少、高性能、可优化、维护简单等优点成为了目前Java移动互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程。其半自动是因为它需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibermate只需要提供POJO和映射关系即可。

MyBatis的基本构成

MyBatis核心组件包括四部分:

  • SqlSessionFactoryBuilder(构造器)
  • SqlSessionFactory(工厂接口)
  • SqlSession(会话)
  • SQL Mapper(映射器)

MyBatis核心组件之间的关系图如下 :

SqlSessionFactoryBuilder组件

作用:依据配置信息或者代码生成SqlSessionFactory

SqlSessionFactory组件

作用:用于生产SqlSession会话

SqlSession是MyBatis的核心接口,主要进行持久化操作。在MyBatis中有两个实现类DefaultSqlSession和SqlSessionManager,前者单线程使用后者多线程使用。作用类似于JDBC中的Connection对象,代表着一个连接资源的启用。

作用:获取Mapper接口;发送SQL给数据库;控制数据库事务;

MyBatis核心配置 

<?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">
<configuration>
<properties resource="jdbc.properties"/>
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>
    <typeAliases>
        <package name="com.zhan.bean"/>
    </typeAliases>
     <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="jdbc"></transactionManager>
            <dataSource type="pooled">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="com.zhan.dao.UserDao"/>
    </mappers>
</configuration>

<configuration>:配置

<properties>:配置属性集:加载了配置文件,下面就需要读取配置文件key对应的value

<settings>:项目的配置信息

<typeAliases>:加载com.zhan.bean包中所有的类,给类-默认起别名为类的名字但首字母小写

<environments>:配置(MyBatis运行环境)环境信息——就是配置连接数据库的参数;

default:指定配置的环境信息的id,表示默认连接该环境 

<transactionManager>    :配置事务的处理方式:模式使用JDBC的事务处理

<dataSource>:数据源的默认type设置为pooled,表示使用连接池

映射器

1.使用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="com.zhan.dao.UserDao">
    <select id="selectAll" resultType="user">
        select * from t_user
    </select>
    <select id="selectById" parameterType="int" resultType="user">
        select * from t_user where uid = #{uid}
    </select>
</mapper>

<mapper>元素中的属性:namespace是映射的dao接口;把配置文件和接口进行映射

映射器的配置元素:

select元素:映射查询语句

 <select id="selectAll" resultType="user">
        select * from t_user
    </select>

update元素:映射更新语句

<update id="update" parameterType="com.zhan.bean.User">
        update t_user set username= #{username},password= #{password},phone= #{phone},address=#{address} where uid = #{uid};
    </update>

delete元素:映射删除语句

    <delete id="delete" parameterType="int">
        delete from t_user where uid= #{uid};
    </delete>

insert元素:映射插入语句

    <insert id="add" parameterType="com.zhan.bean.User">
        insert into t_user(username,password,phone,address)values(#{username},#{password},#{phone},#{address});
    </insert>

id:映射接口的方法名;

parameterType:指定参数的类型(如果是集合类型只需要指定集合元素的类型即可);

resultType:指定返回值的类型;

2.使用注解实现映射器

使用注解方式定义映射器就比较简单了,只需要定义一个映射器接口即可,然后通过注解的方式来注入 SQL。

注解是解释程序,给JVM编译器看的;注释是用来解释代码,给程序员看的;

使用注解方式实现映射器,在处理一些比较简单的 SOL 语句时,使用起来非常简洁。    
但是实际工作中 SQL 语句会比我们这里的举例复杂得多,而使用 XML 方式能更好地处理相对复杂的 SQL 结构,同时 MyBatis 官方推荐使用的也是 XML 方式。另外需要要注意的是同一个映射器接口方法上不能同时使用 XML 方式和注解方式实现映射器。

package com.zhan.dao;

import com.zhan.bean.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserDao {
    //查询所有用户信息
    @Select("select * from t_user")
    List<User> selectAll();

    //新增
    @Insert("insert into t_user(username,password,phone,address)values(#{username},#{password},#{phone},#{address})")
    int add(User user);

    //删除
    @Delete("delete from t_user where uid = #{uid}")
    int delete(int uid);
    //修改
    @Update("update t_user set username= #{username},password= #{password},phone= #{phone},address=#{address} where uid = #{uid}")
    int update(User user);
    //单查
    @Select("select * from t_user where uid = #{uid}")
    User selectById(int uid);
    //模糊查询
    @Select("select * from t_user where username like concat ('%',#{uname},'%')")
    List<User> seach(String uname);
}

动态SQL

 <select id="seach" parameterType="user" resultType="user">
        select * from t_user
        <where>
            <if test="username != null and username != ''">
                and username like concat('%',#{username},'%')
            </if>
            <if test="address != null and address != ''">
                and address like concat('%',#{address},'%')
            </if>
        </where>
    </select>

<if>标签

test的属性值是一个符合OGNL要求的判断表达式,表达式的结果为true或false,除此之外所有的非0值都为true,只有0为false。

<where>标签

当where标签里面的条件成立时,才会加入where关键字组装到SQL里面且会将紧跟where后面的第一个and自动去掉,否则就不会加入。

<update id="update" parameterType="user">
        update t_user
        <set>
            <if test="username != null and username != ''">
                username=#{username},
            </if>
            <if test="password != null and password != ''">
                password=#{password},
            </if>
            <if test="phone != null and phone != ''">
                phone =#{phone},
            </if>
            <if test="address != null and address != ''">
                address=#{address},
            </if>
        </set>
        where uid = #{uid}
    </update>

<set>标签

作用:如果该标签包含的元素中有返回值,就插入一个set,如果set的字符串是以逗号结尾的,就将这个逗号删除。

<delete id="del" parameterType="delVO">
        delete from t_user where uid in
        <foreach item="id" collection="ids" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

<foreach>标签:可以对一个集合变量进行迭代 ——常用于批量删除

item:临时变量

collection:集合变量

open:以什么符号开始

close:以什么符号结束

separator:遍历出来的数据之间的分隔符

#{uid} 放入标签中,实现了迭代元素并拼接上了字符 

缓存配置

使用缓存在一定程度上可以大大提高数据的读目取性能,尤其是对于查询量大和使用频繁的数据,其缓存命中率越高,越能体现出使用缓存的作用。MyBatis 作为持久层框架,也提供了使用缓存的功能。
MyBatis中缓存分为一级缓存和二级缓存,默人情况下一级缓存是开启的,而且是不能关闭的。因此我们常说的MyBatis 缓存,都是指二级缓存。

           
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值