Mybatis学习之Mybatis基础入门学习

一、什么是MyBatis

  1. MyBatis是优秀的持久层框架
  2. MyBatis使用XML将SQL与程序解耦,便于维护
  3. MyBatis学习简单,执行高效,是JDBC的延伸

二、MyBatis开发流程

  1. 引入MyBatis依赖
  2. 创建核心配置文件
  3. 创建实体(Entity)类
  4. 创建Mapper映射文件
  5. 初始化SessionFactory
  6. 利用SqlSession对象操作数据

三、MyBatis环境配置
1.mybatis-config.xml
a. MyBatis采用XML格式配置数据库环境信息
b. MyBaits环境配置标签
c. environment包含数据库驱动、URL、用户名与密码

<?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>
    <settings>
        <!-- goods_id ==> goodsId 驼峰命名转换 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--启用Pagehelper分页插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--设置数据库类型-->
            <property name="helperDialect" value="mysql"/>
            <!--分页合理化-->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>
    
    <!--设置默认指向的数据库-->
    <environments default="dev">
        <!--配置环境,不同的环境不同的id名字-->
        <environment id="dev">
            <!-- 采用JDBC方式对数据库事务进行commit/rollback -->
            <transactionManager type="JDBC"></transactionManager>
            <!--采用连接池方式管理数据库连接-->
            <!--<dataSource type="POOLED">-->
            <dataSource type="com.imooc.mybatis.datasource.C3P0DataSourceFactory">
                <property name="driverClass" value="com.mysql.jdbc.Driver"/>
                <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/babytun?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="user" value="root"/>
                <property name="password" value="root"/>
                <property name="initialPoolSize" value="5"/>
                <property name="maxPoolSize" value="20"/>
                <property name="minPoolSize" value="5"/>
                <!--...-->
            </dataSource>
        </environment>
        <environment id="prd">
            <!-- 采用JDBC方式对数据库事务进行commit/rollback -->
            <transactionManager type="JDBC"></transactionManager>
            <!--采用连接池方式管理数据库连接-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.1.155:3306/babytun?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mappers/goods.xml"/>
        <mapper resource="mappers/goods_detail.xml"/>
    </mappers>
</configuration>

四、SqlSessionFactory

  1. SqlSessionFactory是MyBatis的核心对象
  2. 用于初始化MyBatis,创建SqlSession对象
  3. 保证SqlSessionFactory在应用中全局唯一

五、SqlSession

  1. SqlSession是MyBatis操作数据库的核心对象
  2. SqlSession使用JDBC方式与数据库交互
  3. SqlSession对象提供了数据表CRUD对应方法

六、初始化工具类MyBatisUtils

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;

/**
 * MyBatisUtils工具类,创建全局唯一的SqlSessionFactory对象
 */
public class MyBatisUtils {
    //利用static(静态)属于类不属于对象,且全局唯一
    private static SqlSessionFactory sqlSessionFactory = null;
    //利用静态块在初始化类时实例化sqlSessionFactory
    static {
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            //初始化错误时,通过抛出异常ExceptionInInitializerError通知调用者
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * openSession 创建一个新的SqlSession对象
     * @return SqlSession对象
     */
    public static SqlSession openSession(){
        return sqlSessionFactory.openSession();
    }

    /**
     * 释放一个有效的SqlSession对象
     * @param session 准备释放SqlSession对象
     */
    public static void closeSession(SqlSession session){
        if(session != null){
            session.close();
        }
    }
}

七、MyBatis数据查询步骤

  1. 创建实体类(Entity)
  2. 创建Mapper XML
  3. 编写SQL标签
  4. 开启驼峰命名映射
  5. 新增
  6. SqlSession执行select语句

八、SQL传参

 <!-- 单参数传递,使用parameterType指定参数的数据类型即可,SQL中#{value}提取参数-->
    <select id="selectById" parameterType="Integer" resultType="com.imooc.mybatis.entity.Goods">
        select * from t_goods where  goods_id = #{value}
    </select>

    <!-- 多参数传递时,使用parameterType指定Map接口,SQL中#{key}提取参数 -->
    <select id="selectByPriceRange" parameterType="java.util.Map" resultType="com.imooc.mybatis.entity.Goods">
        select * from t_goods
        where
          current_price between  #{min} and #{max}
        order by current_price
        limit 0,#{limt}
    </select>

九、MyBatis获取多表关联查询结果
ResultMap结果映射

  1. ResultMap可以将查询结果映射为复杂类型的Java对象
  2. ResultMap适用于Java对象保存多表关联结果
  3. ResultMap支持对象关联查询等高级特性
 <!-- 利用LinkedHashMap保存多表关联结果
        MyBatis会将每一条记录包装为LinkedHashMap对象
        key是字段名  value是字段对应的值 , 字段类型根据表结构进行自动判断
        优点: 易于扩展,易于使用
        缺点: 太过灵活,无法进行编译时检查
     -->
    <select id="selectGoodsMap" resultType="java.util.LinkedHashMap" >
        select g.* , c.category_name,'1' as test from t_goods g , t_category c
        where g.category_id = c.category_id
    </select>

十、MyBatis日志输出
Mybatis 内置日志工厂

  1. u SLF4J
  2. Apache Commons Logging
  3. Log4j 2 u Log4j
  4. JDK logging
Mybatis配置SLF4J日志组件
<configuration>
	<settings>
		... 
		<setting name="logImpl" value="SLF4J"/>
		... 
	</settings>
</configuration>

十一、selectKey与useGeneratedKeys的区别
selectKey将数据插入后,将最新的数据返回
useGeneratedKeys也是用于获取最新生成的

  1. selectKey标签的用法
<insert id="insert" parameterType="com.itlaoqi.mybatis.entity.Goods">
INSERT INTO  SQL 语句
<selectKey resultType="int" keyProperty="goodsId" order="AFTER">
<!-- 当前连接中最后产生的id号 -->
select last_insert_id()
</selectKey>
</insert>
  1. useGeneratedKeys属性用法
 <insert id="insert" parameterType="com.itlaoqi.mybatis.entity.Goods"
	 useGeneratedKeys="true"
	 keyProperty="goodsld"
	 keyColumn="goods_id" >
	 INSERT INTO SQL语句
</insert>
  1. 二者区别-显示与隐士
    a. selectKey标签需要明确编写获取最新主键sql语句
    b. useGeneratedKeys属性会自动根据驱动生成对应sql语句
  2. selectKey适用于所有的关系型数据库
    a. selectKey 适用于所有的关系型数据库
    b.useGeneratedKeys只支持"自增主键"类型的数据库
  3. 在Oracle中selectKey的用法
<insert id="insert" parameterType="com.itlaoqi.mybatis.entity.Goods">
	INSERT INTO  SQL 语句
	<selectKey resultType="Integer" order="BEFORE" keyProperty="goodsId" order="AFTER">
	<!-- 当前连接中最后产生的id号 -->
	select seq_goods.nextval as id from dual
	</selectKey>
</insert>

十二、MyBatis预防SQL注入攻击

  1. SQL注入攻击:SQL注入是指攻击者利用SQL漏洞,绕过系统约束,越权获取数据的攻击方式
SQL代码:
select * from a where name ='”+ name+”'”;
正常情况:
name:张三 -> select * from a where name='张三';
SQL注入攻击:
name:' or 1=1 or 1='
select * from a where name='' or 1=1 or 1=''
  1. MyBatis两种传值方式
 ${}文本替换,未经任何处理对SQL文本替换
 #{}预编译传值,使用预编译传值可以预防SQL注入

十三、MyBatis工作流程
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值