MyBatis学习笔记(二)

MyBatis学习笔记(二)

MyBatis中的事务

在上个笔记中提到我们MyBatis中的SqlSession对象需要手动提交,那么我们就得出一个结论,在MyBatis中我们的事务是默认开启的, 那如何设置自动关闭事务,我们只需要在这个构造函数中传递true.

SqlSession sqlSession = build.openSession(true);

这个opensession方法会帮我们把这个bool值传到JDBC事务管理器的初始化方法当中,并且如果是true的话JDBC事务的autocommit的值就是true
这是源码分析图
在这里插入图片描述

MyBatis当中的事务管理选择

刚刚我们说到MyBatis当中的事务是默认开启的,在源码分析中,我们看到了他是调用的JDBC的事务管理器,如果我们要选择其他事务管理器,如:Spring的管理,我们需要在mybatis配置文件中进行如下设置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--在这个事务管理器的类型中如果写JDBC 那么就是启用JDBC的事务管理器,如果传MANAGED的话 就会去寻找其他事务管理,若没有则就不开启事务-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://47.111.53.113:3306/test"/>
                <property name="username" value="huangsikai"/>
                <property name="password" value="Hsk040722"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="CarMapper.xml"/> 
    </mappers>
</configuration>

MyBatis中集成日志框架

我们需要在mybatis配置文件中进行如下设置:
在configuration中我们添加< settings >标签对
在name里面我们输入logImpl 这是对日志的支持
value属性就是日志框架的名称

注:这里的标签顺序遵循dtd约束,我们需要按照顺序写

<configuration>
    <settings>
        <setting name="logImpl" value="log4j2"/>
    </settings>
    ...
</configuration>

当然也要确保相应的jar包也要导入
最后一点就是Mybatis只需要配置 STD_LOGGING 标准日志框架就可以,其他的日志框架,会自动查找

封装MyBatis

在一个Mybatis中我们或许会用到很多次CRUD,对此,我们就可以把上回我们讲到的工厂和工厂Builder进行一个封装,因为我们在一般情况下只需要它产出一个sqlsession对象,对此我们可以进行如下封装:

package org.example;

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;

public class MyBatisUtils {


    private MyBatisUtils() {}

    private  static SqlSessionFactory sqlSessionFactory;

    static{

        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"))
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    public static SqlSession getSession()
    {
        return sqlSessionFactory.openSession();
    }
}

MyBatis向CRUD传送参数

截止目前 我们的CRUD都是固定值,但在真实开发当中,这些值都是由前端传过来的,在JDBC中我们使用?来给定一个占位符,在执行Sql语句的时候,添加参数,在Mybatis当中我们占位符是#{},我们有如下两种方式传递,第一种是通过Map集合,第二种则是用JavaBean仅需一个映射。我们需修改语句如下:

<insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        values(null,#{},#{},#{},#{},#{})
    </insert>

MyBatis通过Map集合传参

我们声明一个map集合如下

  Map<String, Object> map = new HashMap<>();
        map.put("car_num","1003");
        map.put("brand","奔驰");
        map.put("guide_price","100");
        map.put("produce_time","2000-11-11");
        map.put("car_type","燃油");

随后我们在sql语句中的#{}中填入map集合当中的key

 <insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        values(null,#{car_num},#{brand},#{guide_price},#{produce_time},#{car_type})
    </insert>

key可以不和数据库中的列名一样,但需要和map的key一致,因为源码是调用的map.getKey方法。如果不一致的话会返回null
随后,我们把map集合添加进去。

   int insertCar = sqlSession.insert("insertCar",map);

关闭了事务记得手动提交一下!
最后,别忘了关闭链接。

	sqlSession.close();

MyBatis通过pojo/javabean传参

首先我们需要新建一个pojo类,跟map集合一样,pojo类的成员变量可以不和数据库列名一样,但需要传值的时候对应。
生成一个构造方法,生成getset方法(源码是调用get/set进行传值,赋值)

package org.example;

public class Car {

    private Long id;
    private int car_num;
    private String brand;
    private double guide_price;
    private String produce_time;
    private String car_type;

    public Car() {
    }

    public Car(Long id, int car_num, String brand, double guide_price, String produce_time, String car_type) {
        this.id = id;
        this.car_num = car_num;
        this.brand = brand;
        this.guide_price = guide_price;
        this.produce_time = produce_time;
        this.car_type = car_type;
    }

    public Long getId() {
        return id;
    }

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

    public int getCar_num() {
        return car_num;
    }

    public void setCar_num(int car_num) {
        this.car_num = car_num;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getGuide_price() {
        return guide_price;
    }

    public void setGuide_price(double guide_price) {
        this.guide_price = guide_price;
    }

    public String getProduce_time() {
        return produce_time;
    }

    public void setProduce_time(String produce_time) {
        this.produce_time = produce_time;
    }

    public String getCar_type() {
        return car_type;
    }

    public void setCar_type(String car_type) {
        this.car_type = car_type;
    }
}

随后我们新建一个car对象并赋值。

        Car car = new Car(null,1003,"奔驰",100,"2000-11-11","燃油");
        int insertCar = sqlSession.insert("insertCar",car);

我们的mapper也要对应

<insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        values(null,#{car_num},#{brand},#{guide_price},#{produce_time},#{car_type})
    </insert>

随后,我们执行代码,更新数据库,发现执行成功。
最后,因为我们的mybatis是调用我们的get/set方法进行赋值和传值,所以我们在传占位符的时候,传set/get方法名字的后面的名字就可以。
假如,我更改成如下代码:

 public int getNum() {
        return car_num;
    }
 public void setNum(int car_num) {
        this.car_num = car_num;
    }

所以我们在mapper需要改成这样

<insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        values(null,#{num},#{brand},#{guide_price},#{produce_time},#{car_type})
    </insert>

MyBatis会把首字母大写然后接上get/set,拼成上面的get/set方法。
至此MyBatis学习笔记(二)结束了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄大大ovo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值