mybatis的核心配置

SqlSessionFactory

  • 它是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession
  • SqlSessionFactory对象的实例通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder可以通过XML配置文件或一个预先定义好的Configuration实例构建出它的实例。
  //得到文件的输出流
        InputStream resourceAsStream = Resources.getResourceAsStream(“配置文件位置”);
        //根据配置文件构建SqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);**
  • SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在,每个数据库对应一个SqlSessionFactory对象,在构建SqlSessionFactory实例的时候,建议使用单例模式。

SqlSession

  • 它是应用程序域持久化层之间交互操作的一个单线程对象,其主要作用是执行持久化操作;
  • 每个线程都应该有一个自己的SqlSession实例,并且实例时不能被共享的,同时,SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中,但不能在一个类的静态字段或者实例字段或任何类型的管理范围使用;
  • 通常使用完SqlSession对象之后,要进行关闭操作。
  • 方法
    在这里插入图片描述

MyBatisUtils

package com.yzb.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;
import java.io.InputStream;
/*
* 工具类
* */
public class MyBatisUtils {
    /*
    * 初始化sqlSessionFactory对象
    * */
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        try {
            //使用mybatis提供resources类加载MyBatis的配置文件
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            //创建SqlSessionFactory工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //获取SqlSession对象的方法
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }
}

配置文件

在MyBatis框架的核心配置文件中,元素是配置文件的根元素。其他元素都在根元素里面配置。
在这里插入图片描述
在这个配置文件中,子元素要按照上面的顺序进行配置,否则会出错。

properties

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root

mybatis-config.xml

<?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="db.properties"/>****
    <!--1.配置环境 ,默认的环境id为mysql-->
    <environments default="mysql">
        <!--1.2.配置id为mysql的数据库环境 -->
        <environment id="mysql">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <!--数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url"
                          value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!--2.配置Mapper的位置 -->
    <mappers>
        <mapper resource="com/yzb/chapter06/mapper/CustomerMapper.xml" />
    </mappers>
</configuration>

settings

  • 用于改变mybatis运行时的行为,例如开启二级缓存,开启延迟加载等。

一级缓存

package com.yzb.example;

import com.yzb.chapter07.pojo.Customer;
import org.apache.ibatis.session.SqlSession;

public class Test2 {
    public static void main(String[] args) {
        SqlSession session = MyBatisUtils.getSession();
         Customer o = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
        System.out.println(o.toString());
        //事务的提交,代表一级缓存的关闭
        session.commit();
        SqlSession session1 = MyBatisUtils.getSession();
        Customer customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
        System.out.println(customer.toString());

    }
}

在这里插入图片描述

package com.yzb.example;

import com.yzb.chapter07.pojo.Customer;
import org.apache.ibatis.session.SqlSession;

public class Test2 {
    public static void main(String[] args) {
        SqlSession session = MyBatisUtils.getSession();
         Customer o = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
        System.out.println(o.toString());
        //事务的提交,代表一级缓存的关闭
       /* session.commit();*/
        SqlSession session1 = MyBatisUtils.getSession();
        Customer customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
        System.out.println(customer.toString());

    }
}

在这里插入图片描述
此时开启了一级缓存。

二级缓存

  • 在mybatis-config.xml
   <settings>
        <setting name="cacheEnable" value="true"/>
    </settings>
  • 在customerMapper中添加
<!--开启二级缓存-->
    <cache/>
  • Test3
package com.yzb.example;

import com.yzb.chapter07.pojo.Customer;
import org.apache.ibatis.session.SqlSession;

public class Test3 {
    /*
     * 开启缓存测试
     * SqlSessionFactory
     * 需要手动开启
     * 二级缓存查询的对象需要开启序列化接口
     * */
    public static void main(String[] args) {
        SqlSession session = MyBatisUtils.getSession();
         Customer customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
        System.out.println(customer.toString());
        session.close();

        session = MyBatisUtils.getSession();
         customer = session.selectOne("com.yzb.chapter07.mapper.CustomerMapper.findCustomerById", 1);
        System.out.println(customer.toString());
        session.close();
    }
}

在这里插入图片描述

typeAliasea元素

  • 用于配置文件中的java类型设置一个简短的名字
 <typeAliases>
        <!--如果忘记了配置alias,那末会类名首字母小写后作为别名-->
        <typeAlias type="com.yzb.chapter07.pojo.Customer" alias="customer"/>
        <!--使用自动扫描包来定义别名,同上,将类名首字母小写后作为别名-->
        <package name="com.yzb.chapter07.pojo"/>
        <!--@Alias("")注解的形式-->
    </typeAliases>

typeHandler 元素

  • 主要用于将预处理对象语句中传入的参数从JavaType(java类型)转换成jdbcType(Jdbc类型),或者从数据库中取出结果时将jdbcType转换成javaType
<typeHandlers>
        <!--以单个类的形式配置-->
        <typeHandler handler="com.itheima.type.CustomertypeHandler"/>
        <!--注册一个包中所有的typeHandler,系统会在启动时自动扫描包下的所有的文件-->
        <package name="com.itheima.type"/>
    </typeHandlers>
  • 类处理器很多不提及了。

objectFactory和plugins元素

objectFactory(对象工厂)主要是用来实例化目标类,它可以通过默认的无参构造器来完成实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。
默认情况下,使用默认的ObjectFactory,它是由DefalutObjectFactory提供服务的。
如果想进行更改,可以通过重写方法自定义。

package com.yzb.example;

import org.apache.ibatis.reflection.factory.DefaultObjectFactory;

import java.util.List;
import java.util.Properties;

public class MyObjectFactory extends DefaultObjectFactory {
    @Override
    public <T> T create(Class<T> type) {
        return super.create(type);
    }

    @Override
    public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
        return super.create(type, constructorArgTypes, constructorArgs);
    }

    @Override
    public void setProperties(Properties properties) {
        super.setProperties(properties);
    }

    @Override
    public <T> boolean isCollection(Class<T> type) {
        return super.isCollection(type);
    }
    
}

在mybatis-config.xml配置文件中加入这个配置

   <objectFactory type="com.yzb.example.MyObjectFactory">
        <property name="name" value="MyObjectFactory"/>
    </objectFactory>

plugins 元素

  • mybatis允许在已映射语句执行过程中的某一点进行拦截调用,这种拦截调用就是通过插件来实现的。

environments和mappers 元素

<environments default="mysql">
    <!--1.2.配置id为mysql的数据库环境 -->
    <environment id="mysql">
        <!-- 使用JDBC的事务管理 -->
        <transactionManager type="JDBC" />
        <!--数据库连接池 -->
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}" />
            <property name="url"
                      value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </dataSource>
    </environment>
</environments>
<!--2.配置Mapper的位置 -->
<mappers>
    <mapper resource="com/yzb/chapter07/mapper/CustomerMapper.xml" />
</mappers>

jdbc事务管理的type

在这里插入图片描述

DataSource的type

  • 1
    在这里插入图片描述
  • 2
    在这里插入图片描述
    在这里插入图片描述
  • 3
    在这里插入图片描述
    在这里插入图片描述

mappers

<!--2.配置Mapper的位置 -->
    <!--使用类路径引入-->
<mappers>
    <mapper resource="com/yzb/chapter07/mapper/CustomerMapper.xml" />
</mappers>
    <!--使用本地文件路径引入-->
    <mappers>
        <mapper url="file://D:com/itheima/mapper/UserMapper"/>
    </mappers>
    <!--使用接口类引入-->
    <mappers>
        <mapper class="com.itheima.mapper.UserMapper"/>
    </mappers>
    <!--使用报名引入-->
    <mappers>
        <package name="com.itheima.mapper"/>
    </mappers>

mapper.xml映射文件的主要元素

  • 在这个配置文件中 <mapeper 元素是映射文件中的根元素,其他都是它的子元素。
    在这里插入图片描述

select元素

<select id="findCustomerById" parameterType="Integer"
            resultType="com.yzb.chapter07.pojo.Customer">
        select * from t_customer where id = #{id}
    </select>

常用属性
在这里插入图片描述

insert

<!--添加用户信息-->
    <insert id="addCustomer" parameterType="com.yzb.chapter07.pojo.Customer" keyProperty="id"  useGeneratedKeys="true">
        insert into t_customer(username,jobs,phone) values(#{username},#{jobs},#{phone})
    </insert>

在这里插入图片描述

update和delete元素

   <!--更改用户信息-->
    <update id="updateCustomer" parameterType="com.yzb.chapter07.pojo.Customer">
        update t_customer set username= #{username} ,jobs = #{jobs} ,phone = #{phone} where id = #{id}
    </update>
    <delete id="deleteCustomer" parameterType="Integer">
        delete from t_customer where id = #{id}
    </delete>

sql元素

定义可重用的SQL语句。

    <!--sql元素的使用-->
    <sql id="customer">id,username,jobs,phone</sql>
    <!--根据客户编号获取客户信息 -->
    <select id="findCustomerById" parameterType="Integer"
            resultType="com.yzb.chapter07.pojo.Customer">
        select <include refid="customer"></include> 
        from t_customer where id = #{id}
    </select>
<?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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.yzb.chapter07.mapper.CustomerMapper">
    <sql id="tablename">
        ${prefix}customer
    </sql>
    <sql id="someinclude">
        form 
        <include refid="${include_target}"></include>
    </sql>
    <sql id="customerColumns">
        id,username,jobs,phone
    </sql>
    <select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer" >
        select 
        <include refid="customerColumns"/>
        <include refid="someinclude">
            <property name="prefix" value="t_"/>
            <property name="include_target" value="tablename"/>
        </include>
        
    </select>


</mapper>

resultMap

结果映射集,主要是定义映射规则,级联的更新以及定义类型的转换器等。
在这里插入图片描述

User

package com.yzb.example1;

public class User {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

UserMapper.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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.yzb.example1.UserMapper">
    <resultMap id="resultMap" type="com.yzb.example1.User">
        <id property="id" column="t_id"></id>
        <result property="username" column="t_username"/>
        <result property="password" column="t_password"/>
    </resultMap>
    <select id="findAllUser" resultMap="resultMap">
        select * from t_user
    </select>


</mapper>

Test

package com.yzb.example1;

import com.yzb.example.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class Test {
    public static void main(String[] args) {
        SqlSession session = MyBatisUtils.getSession();
        List<User> users = session.selectList("com.yzb.example1.UserMapper.findAllUser");
        for (User user : users) {
            System.out.println(user);
        }
        session.close();
    }
}

mybatis-config.xml

### 数据库表的图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200626220407195.png) 这可以解决数据库和持久层对象的属性不一样的时候使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值