mybatis11.16

一. 简单过一遍:

1.基本文件

1.核心配置文件 mybatis.xml

  • 指定mapper,即存sql语句的地方
<?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>
        <setting name="logImpl" value="SLF4J"/>
    </settings>

    <environments default="development">
        <environment id="development">

            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="j20020503"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        自动从根路劲下寻找文件-->
        <mapper resource="t_carMapper.xml"/>

<!--        绝对路径加载图片:可以用url=“file///XXXXXX”-->

    </mappers>
</configuration>

2.sql存放之地 t_carMapper.xml

  • 指定name空间
  • 指定sql语句id
<?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="dd">
   <insert id="insertCar">
       insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
       values(null,'1004','丰田',30.0,'2020-11-2','燃油车')
   </insert>
</mapper>

3.操作

  • 主要目的:获取执行sql语句的对象sqlsession
  • sqlsession -> sqlsessionfactory ->sqlsessionfactorybuilder
  • sqlsession.commit()
package com.jiang.mybatis.test;

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 mybatis001 {
    public static void main(String[] args)  {
       SqlSession sqlSession=null;
        try {
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = null;
            sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis.xml"));
             sqlSession = sqlSessionFactory.openSession();
            int count = sqlSession.insert("insertCar");
            sqlSession.commit();
        } catch (IOException e) {
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        }


        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

2.建工具类

mybatis_tool

  • 工具类构造方法私有化,防止new对象
  • 方法是static修饰,直接类名+方法调用
  • 一个sqlsessionbuilder对应一个数据库,所以只用static一下就行
package com.jiang.mybatis.test;

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 mybatis_tool {
    //1.工具类的构造方法一般都是私有化的,为了防止new对象(无意义)
    //2.方法是static 修饰的直接调用,非静态方法得实例才能调用。
    //3.工具类一般是公用的,为了节约资源,不用大量实例化工具类,而是直接类名+方法直接调用即可
    private mybatis_tool() {

    }

    public static SqlSessionFactory sqlSessionFactory=null;

    static {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //只用创建一次即可,一个sqlsessionfactory对应一个数据库
        //放入静态代码块后,要sqlsession对象则直接 opensession即可
        try {
            sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

}


测试工具类

 @Test
    public void Testmybatis_tool(){
        SqlSession sqlSession=mybatis_tool.getsqlsession();
        int count = sqlSession.insert("insertCar");
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }

3.日志设置

<?xml version="1.0" encoding="UTF-8"?>

<!-- 配置文件修改时重新加载,默认true -->
<configuration debug="false">

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
            <!-- 输出日志记录格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--    mybatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>


    <!-- 日志输出级别,LOGBACK日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR-->
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

二.增删改查操作

1.一个简单的pojo/bean(对象类)

package com.jiang.pojo;

import java.util.Objects;

public class T_Car {
    //如果你认为这个属性不能为null,那么就用long,因为它默认初值为0,如果这个字段可以为null,那么就应该选择Long。
    private Long id;
    private String num;
    private String brand;
    private Double guide_price;
    private String produce_time;
    private String car_type;

    @Override
    public String toString() {
        return "T_Car{" +
                "id=" + id +
                ", num='" + num + '\'' +
                ", brand='" + brand + '\'' +
                ", guide_price='" + guide_price + '\'' +
                ", produce_time='" + produce_time + '\'' +
                ", car_type='" + car_type + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        T_Car t_car = (T_Car) o;
        return Objects.equals(id, t_car.id) && Objects.equals(num, t_car.num) && Objects.equals(brand, t_car.brand) && Objects.equals(guide_price, t_car.guide_price) && Objects.equals(produce_time, t_car.produce_time) && Objects.equals(car_type, t_car.car_type);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, num, brand, guide_price, produce_time, car_type);
    }

    public Long getId() {
        return id;
    }

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

    public String getnum() {
        return num;
    }

    public void setnum(String num) {
        this.num = 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;
    }

    public T_Car() {
    }

    public T_Car(Long id, String num, String brand, Double guide_price, String produce_time, String car_type) {
        this.id = id;
        this.num = num;
        this.brand = brand;
        this.guide_price = guide_price;
        this.produce_time = produce_time;
        this.car_type = car_type;
    }
}

2.测试

package com.jiang;

import com.jiang.MybatisTool;
import com.jiang.pojo.T_Car;
import org.apache.ibatis.jdbc.SQL;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Testmodule {
    @org.junit.Test
    public void TestCRUD(){
        Map<String,Object> map=new HashMap<>();
        map.put("car_num","1005");
        map.put("brand","迈凯轮");
        map.put("guide_price",10.0);
        map.put("produce_time","2020-10-4");
        map.put("car_type","燃油机");
            SqlSession sqlSession=MybatisTool.getsqlsession();
            int count =sqlSession.insert("insertCar",map);
            //1.map转参数  key代替原本sqlmapper.xml中的值,
          //另一种就是POJO
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();


    }


    @Test
    public void TestPoJO(){
        SqlSession sqlSession = MybatisTool.getsqlsession();
        T_Car t_car = new T_Car(null,"1006","摩托",11.0,"2022-10-9","新能源");
        int count = sqlSession.insert("insertCar", t_car);
        //mapper那边是属性值
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();

    }

    @Test
    public void TestDel(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        sqlSession.delete("deleteid",20);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void TestUpdate(){
        SqlSession sqlSession = MybatisTool.getsqlsession();
        T_Car t_car = new T_Car(1L,"111","药老",66.0,"2020-0-0","飞机");
        sqlSession.update("updatecar",t_car);
        sqlSession.commit();
        sqlSession.close();
    }




//    查找不需要commit()
    @Test
    public void TestSelect(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        Object o = sqlSession.selectOne("selectid", 5);
        System.out.println(o);
        sqlSession.close();
    }

    @Test
    public void TestSelectAll(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        List<Object> list = sqlSession.selectList("selectAll");
//        遍历:
//        for (Object o : list) {
//            System.out.println(o);
//        }
        list.forEach(o -> System.out.println(o));
        sqlSession.close();
    }


    @Test
    public void TestNamespace(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        List<Object> list = sqlSession.selectList("02.selectAll");
        list.forEach(o -> System.out.println(o));
        sqlSession.close();
    }
}

3.对应的sql语句

<?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="01">
    <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})
--         1.访问相应的getXXX()
    </insert>

    <delete id="deleteid">
        delete from t_car where id=#{sdsdsd}
    </delete>

    <update id="updatecar">
        update t_car set car_num=#{car_num},brand=#{brand},guide_price=#{guide_price},produce_time=#{produce_time},car_type=#{car_type} where id=#{id}
    </update>
<!--    &#45;&#45; 指定结果集封装的对象-->
<!--    &#45;&#45;         select * from t_car where  id=#{id}-->
    <select id="selectid" resultType="com.jiang.pojo.T_Car">
select id,car_num as num,brand,guide_price,produce_time,car_type from t_car where id=#{id}
    </select>

    <select id="selectAll" resultType="com.jiang.pojo.T_Car">
-- 封装list集合对象的数据类型
        select id,car_num as num,brand,guide_price,produce_time,car_type from t_car
    </select>
</mapper>

由上到下简单讲一下
1.插入(用map装数据并插入)

    @org.junit.Test
    public void TestCRUD(){
        Map<String,Object> map=new HashMap<>();
        map.put("car_num","1005");
        map.put("brand","迈凯轮");
        map.put("guide_price",10.0);
        map.put("produce_time","2020-10-4");
        map.put("car_type","燃油机");
            SqlSession sqlSession=MybatisTool.getsqlsession();
            int count =sqlSession.insert("insertCar",map);
            //1.map转参数  key代替原本sqlmapper.xml中的值,
          //另一种就是POJO
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }

2.测试pojo插入

    @Test
    public void TestPoJO(){
        SqlSession sqlSession = MybatisTool.getsqlsession();
        T_Car t_car = new T_Car(null,"1006","摩托",11.0,"2022-10-9","新能源");
        int count = sqlSession.insert("insertCar", t_car);
        //mapper那边是属性值
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }
mapper.xml
   <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})
--         1.访问相应的getXXX()
    </insert>

3.删除操作

   @Test
    public void TestDel(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        sqlSession.delete("deleteid",20);
        sqlSession.commit();
        sqlSession.close();
    }

mapper.xml
<delete id="deleteid">
        delete from t_car where id=#{sdsdsd}
    </delete>

4.更新操作

  @Test
    public void TestUpdate(){
        SqlSession sqlSession = MybatisTool.getsqlsession();
        T_Car t_car = new T_Car(1L,"111","药老",66.0,"2020-0-0","飞机");
        sqlSession.update("updatecar",t_car);
        sqlSession.commit();
        sqlSession.close();
    }
    对应mapper.xml
       <update id="updatecar">
        update t_car set car_num=#{car_num},brand=#{brand},guide_price=#{guide_price},produce_time=#{produce_time},car_type=#{car_type} where id=#{id}
    </update>

5.查找操作(不需要commit()了,因为不会进入数据库进行更改)
通过id查找

  @Test
    public void TestSelect(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        Object o = sqlSession.selectOne("selectid", 5);
        System.out.println(o);
        sqlSession.close();
    }
    对应mapper.xml
      <select id="selectid" resultType="com.jiang.pojo.T_Car">
select id,car_num as num,brand,guide_price,produce_time,car_type from t_car where id=#{id}
    </select>

查全部

    @Test
    public void TestSelectAll(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        List<Object> list = sqlSession.selectList("selectAll");
//        遍历:
//        for (Object o : list) {
//            System.out.println(o);
//        }
        list.forEach(o -> System.out.println(o));
        sqlSession.close();
    }
    对应mapper.xml
    <select id="selectAll" resultType="com.jiang.pojo.T_Car">
-- 封装list集合对象的数据类型
        select id,car_num as num,brand,guide_price,produce_time,car_type from t_car
    </select>

避雷点:
1.结果集出现空值。原因可能是pojo属性名与数据库名不一致
解决:更改属性名
或者用as

    <select id="selectid" resultType="com.jiang.pojo.T_Car">
select id,car_num as num,brand,guide_price,produce_time,car_type from t_car where id=#{id}
    </select>

namespace
可能出现同名但不同空间的sql id,指定空间

    @Test
    public void TestNamespace(){
        SqlSession sqlSession=MybatisTool.getsqlsession();
        List<Object> list = sqlSession.selectList("02.selectAll");
        list.forEach(o -> System.out.println(o));
        sqlSession.close();
    }

三.配置文件的讲解

  • <properties> 配置类似于全局变量并通过${ }来引用

还有一种方法就是写一个文件.properties
通过引入

    <properties resource="jdbc.properties"/>
  • 一个数据库对应一个SqlSessionFactory,一个环境同样对应一个SqlSessionFactory
  • <transactionManager type=“JDBC”/> 配置事务管理器
  • JDBC:使用原生的JDBC代码来管理事务
    conn.AutoCommit(false)

    conn.commit();
    MANAGED:mybatis不再负责事务的管理,将事务管理交给其他的JEE容器来管理。例如Spring
  • <dataSource type=“POOLED”> 指定数据源的获取connection对象的方式。
    取值:
    1.UNPOOLED:不使用数据库连接池技术。每次请求过来,都是创建新的connection对象。太占用资源。 刷新创建一个,刷新又创建一个,数量过多会崩。
    2.POOLED:使用mybatis自己实现的数据库连接池
    3.JNDI:集成其他第三方数据库连接池 tomcat服务器使用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">
                       <!--dtd约束:哪些属性,标签,顺序-->
<configuration>
<!--    <properties>-->
<!--&lt;!&ndash;        map的key 与 values&ndash;&gt;-->
<!--&lt;!&ndash;        类似于一个全局变量,引用的话就用${}&ndash;&gt;-->
<!--&lt;!&ndash;        properties的东西可以写到一个单独文件中&ndash;&gt;-->
<!--        <property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!--        <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis"/>-->
<!--        <property name="jdbc.username" value="root"/>-->
<!--        <property name="jdbc.password" value="j20020503"/>-->
<!--    </properties>-->
    <properties resource="jdbc.properties"/>
    <settings>
        <setting name="logImpl" value="SLF4J"/>
    </settings>
     <!--默认使用default环境-->
    <environments default="one">
        <!--一个环境,连接的数据库是mybatis-->
        <!--一个数据库对应一个SqlSessionFactory,一个环境同样对应一个SqlSessionFactory-->
        <environment id="one">

            <!--配置事务管理器,指定mybatis具体用什么方式去管理事务
                        1.两值:JDBC:使用原生的JDBC代码来管理事务
                               conn.AutoCommit(false)
                               ...
                               conn.commit();

                               MANAGED:mybatis不再负责事务的管理,将事务管理交给其他的JEE容器来管理。例如Spring

            -->
            <transactionManager type="JDBC"/>
            <!--dataSource数据源(数据库连接池)
                作用:为程序提供connection对象
                实现了java.sql.DataSource接口

                type:指定数据源的获取connection对象的方式。
                    取值:1.UNPOOLED:不使用数据库连接池技术。每次请求过来,都是创建新的connection对象。太占用资源。
                                  刷新创建一个,刷新又创建一个,数量过多会崩。

                         2.POOLED:使用mybatis自己实现的数据库连接池
                         3.JNDI:集成其他第三方数据库连接池  tomcat服务器使用mybatis
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="j20020503"/>
                
                <property name="poolMaximumActiveConnections" value="3"/>
                <property name="poolTimeToWait" value="2000"/>
                <property name="poolMaximumCheckoutTime" value="10000"/>
                <!--失效时间-->
                <property name="poolMaximumIdleConnections" value="1"/>
<!--                你招了十个工人,但是订单量只够一些人干,所以有员工空闲,你最多能容忍五个员工空闲,再空闲一个你就把他开除-->
            </dataSource>
        </environment>

        <environment id="two">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="j20020503"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
   <mapper resource="Mapper.xml"/>
    </mappers>
</configuration>

测试配置

dataSource=UNPOOLED
不使用数据库连接池技术。每次请求过来,都是创建新的connection对象。太占用资源。
刷新创建一个,刷新又创建一个,数量过多会崩。

  @Test
    public void TestDataSource_UNFLOODE() throws IOException {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //dataSource=UNPOOLED
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("Config.xml"), "two");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("1.insertCar");
        sqlSession.commit();
        sqlSession.close();

        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        sqlSession2.insert("1.insertCar");
        sqlSession2.commit();
        sqlSession2.close();
    }
Opening JDBC Connection
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@368f2016]
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@368f2016]
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@368f2016]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@368f2016]
Opening JDBC Connection
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@22ff4249]
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@22ff4249]
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@22ff4249]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@22ff4249]

dataSource=POOLED

  • 从pool取出connection使用关闭放回
  • 每一次连接都从池中拿,效率高
  • 从池中拿,所以数量是可控的。
   @Test
    public void TestDataSource_FLOODE() throws IOException {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("Config.xml"), "one");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("1.insertCar");
        sqlSession.commit();
        sqlSession.close();

        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        sqlSession2.insert("1.insertCar");
        sqlSession2.commit();
        sqlSession2.close();
        //从pool取出connection使用关闭放回
        //每一次连接都从池中拿,效率高
        //从池中拿,所以数量是可控的。
    }
Opening JDBC Connection
Created connection 447718425.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
Returned connection 447718425 to pool.
Opening JDBC Connection
Checked out connection 447718425 from pool.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
Returned connection 447718425 to pool.
<property name="poolMaximumActiveConnections" value="3"/>
允许同时三个connection存在,超过的话等待20s(默认值),把第一个宣布第一个失效,并传给第四使用
            <property name="poolTimeToWait" value="2000"/>  每两秒发一个等待信息
            <property name="poolMaximumCheckoutTime" value="10000"/>  总共等待10s,把第一个失效
            <!--失效时间-->
            <property name="poolMaximumIdleConnections" value="1"/>
               你招了十个工人,但是订单量只够一些人干,所以有员工空闲,你最多能容忍五个员工空闲,再空闲一个你就把他开除
  @Test
    public void TestPOOLEDproperty() throws IOException {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("Config.xml"), "one");
        for (int i = 0; i <4; i++) {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            sqlSession.insert("1.insertCar");
            //允许同时三个connection存在,超过的话等待20s(默认值),把第一个宣布第一个失效,并传给第四使用
        }
    }
Opening JDBC Connection
Created connection 447718425.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1aafa419]
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
Opening JDBC Connection
Created connection 943870983.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@38425407]
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
Opening JDBC Connection
Created connection 1785507932.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6a6cb05c]
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
Opening JDBC Connection
Waiting as long as 2000 milliseconds for connection.
Waiting as long as 2000 milliseconds for connection.
Waiting as long as 2000 milliseconds for connection.
Waiting as long as 2000 milliseconds for connection.
Waiting as long as 2000 milliseconds for connection.
Claimed overdue connection 447718425.
==>  Preparing: insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,"111","宝马",30.0,"2020-10-1","小飞棍来咯!") 
==> Parameters: 
<==    Updates: 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值