Mybatis框架解读

1.mybatis概述

        原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis。

MyBatis 是一款优秀的持久层框架。

MyBatis 避免了几乎所有的JDBC代码手动设置参数以及手动获取结果集的操作。

Mybatis 将基本的JDBC常用接口封装,对外提供操作即可.

        MyBatis 可以使用XML或注解来配置和映射,将数据库中的记录映射成 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象),是一种 ORM(ORM Object Relational Mapping 对象关系映射)实现. 它支持动态SQL以及数据缓存.

2.mybatis搭建

  1. 创建一个maven项目

  2. 导入mybatis 依赖的jar

  3. .创建一个全局的mybatis配置文件,配置数据库连接等配置

  4. 创建数据库 创建表 准备数据库

  5. 创建一个访问接口,定义方法

  6. 创建接口对应映射文件

  7. 测试mybatisgu

mybatis 依赖的jar

<!--mybatis框架-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>

创建一个全局的mybatis配置文件,

 配置数据库连接等配置 

 创建sql映射文件

<?xmlversion="1.0"encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC"-//mybatis.org//DTDMapper3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mappernamespace="接口的地址">
 <selectid="findAdminById"parameterType="int" resultType="com.ffyc.mybatis.model.Admin">
     select * fromadmin whereid=#{id}
 </select>
 </mapper>

测试mybatis

//1.mybatis读取配置文件
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //2.创建 SqlSessionFactory,负责创建Session对象(连接数据库的会话对象)
        //SqlSessionFactory对象也是只需要创建一次,创建后不需要销毁
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //3.创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.创建接口的代理对象
        Admindao admindao = sqlSession.getMapper(Admindao.class);
        //5.调用
        Admin admin = admindao.findAdminById(1);//让代理对象帮我们调用映射文件中与此接口中相同名称的方法
        System.out.println(admin);
        //关闭会话
        sqlSession.close();//关闭连接对象

3.Mybatis-Dao 层面向接口开发

面向接口开发方式只需要程序员编写接口,由Mybatis框架创建接口的动态代理 对象,使用sqlsession.getMapper(接口.class);获得代理对象.

面向接口开发需要遵循以下规范:

        1、 Mapper.xml文件中的namespace与mapper接口的类路径相同. 

        2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同.

        3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的 parameterType 的类型相同.

        4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的 resultType 的类型相同.

 4.Mybatis 日志

具体选择哪个日志实现由MyBatis的内置日志工厂确定。它会使用最先找到的。 Mybatis 内置的日志工厂提供日志功能,具体的日志实现有以下几种方式: SLF4J|LOG4J|JDK_LOGGINGCOMMONS_LOGGING|STDOUT_LOGGING 配置日志

<settings>
 <setting name="logImpl" value="STDOUT_LOGGING"/>
 </settings>

 5.参数传递

单个参数直接传递

/*
        参数传递
     */

    //单个参数传递
    Admin findAdminById(int id);

 多个参数传递

多个参数传递可以用@param("id")绑定

//多个参数的传递
    Admin login(@Param("acc") String account, @Param("pwd") String password);

在映射文件中这样写 

如果传递一个复杂的对象,就需要用parameterType参数进行类型定义 

传入一个admin对象,admin中有许多属性,就比较复杂,如果用@param绑定就会非常的麻烦,

此时我们就得想其他的办法,用parameterType参数进行类型定义

Admin login1(Admin admin);
<select id="login1" parameterType="Admin" resultType="Admin">
            select * from  admin where account = #{account} and password = #{password}
    </select>

6.增删改查

1.增

<insert id="唯一标识" useGeneratedKeys="把新增加的主键赋值到自己定义的 keyProperty " keyProperty=“ 接收主键的属性 parameterType="参数类型">

<insert id="insertAdmin" parameterType="Admin" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    insert into admin(account,password,gender)values (#{account},#{password},#{gender})
</insert>

2.删

<delete id="唯一标识" parameterType="参数类型">

<delete id="deleteAdmin" parameterType="int">
        delete from admin  where id = #{id}
    </delete>

3.改

<update id="唯一标识" parameterType="参数类型">

<delete id="deleteAdmin" parameterType="int">
        delete from admin  where id = #{id}
    </delete>

 4.查

<select id="唯一标识" resultType="返回结果集类型">

<select id="login" resultType="Admin">
    select * from admin where account = #{acc} and password = #{pwd}
  </select>

 7.结果处理

   ------简单结果映射

       返回简单基本类型  例如:

<select id="finAdminCount" resultType="int">
        select count (*) from admin
    </select>

-------对象映射

如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装 到POJO对象中.

如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局 设置实现自动转换

<setting name="mapUnderscoreToCamelCase" value="true"/>

----- #{}${}的区别

#{} 是占位符,是采用预编译方式向sql传值,可以防止sql注入,如果我们在sql中传值,使用#{}
        #{}:delete from admin where id=#{id}
        结果:delete from admin where id = ?
${} 她是将内容直接拼接到sql语句中,一般不用于向sql中传值,一般用于向sql中动态的传递列名
        ${}: delete from admin where id=’${id}’
        结果:delete from admin where id=’1’
区别:
 底层实现不同
     #{}  采用预编译方式 防止sql注入,更加安全
     ${}  采用字符串拼接,直接将值拼接到sql中
 使用场景不同
     #{}  一般用于向sql中的列传值
     ${}  一般用于向sql中动态传递列名  例如 排序时 order by 后面的列名是可以改变的
                                   例如 select 后面的列名可以自由选择

 8.特殊处理resultMap

----定义resultMap      

使用resultMap标签,对查询结果进行自定义映射
type="Admin"  最终返回结果的类型

(1). resutlMap 的 id 属性是resutlMap的唯一标识,本例中定义为 “adminResultMap”

(2). resutlMap 的 type 属性是映射的POJO类型

(3). id 标签映射主键,result标签映射非主键

(4). property 设置对象属性名称,column映射查询结果的列名称

<resultMap id="adminMap" type="Admin">
        <id column="adminid" property="id"></id>
        <result column="account" property="account"></result>
    </resultMap>

    <select id="findAdmin1" resultMap="adminMap">
        select id adminid , account from admin
    </select>

 ----使用resultMap

根据上面代码,

(1). 我们的输出映射使用的是resultMap,而非resultType

(2). resultMap 引用了 adminResultMap

 

 9.查询处理结果集

-----嵌套查询

    <resultMap id="StudentMap" type="Student">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <!-- 映射关联数据 专业名称 首先或创建一个专业对象,然后将专业名称封装到Major对象,最后将Major对象封装到Student对象中-->
        <association property="major" javaType="Major">
            <result column="mname" property="name"></result>
        </association>
    </resultMap>
    <!-- 关联查询方式1:-->
    <select id="findStudentById" resultMap="StudentMap">
            select
               s.id,
               s.num,
               s.name,
               s.gender,
               m.name mname
            from student s inner join major m on s.majorid = m.id where s.id = #{id}
    </select>

-----多表关联查询

 <resultMap id="studentMap1" type="Student">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <association property="major" javaType="Major" select="findMajorById" column="majorid"></association>
    </resultMap>
    <select id="findStudentById2" resultMap="studentMap1">
        select id,num,name,gender,majorid from student where id = #{id}
    </select>

    <select id="findMajorById" resultType="Major">
        select name from major where id = #{majorid}
    </select>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值