MyBatis学习二MyBatis的配置文件详解

    xiaoxiao2021-03-25  73

    一.xml映射配置文件(全局配置文件)

    1.XML 文档的高层级结构如下(再写配置文件的时候不能更改此顺序):

     configuration 配置       properties 属性       settings 设置

          typeAliases 类型命名       typeHandlers 类型处理器       objectFactory 对象工厂       plugins 插件       environments 环境                    environment 环境变量                    transactionManager 事务管理器                    dataSource 数据源        映射器

    1.1properties 属性

    properties的配置有三种方式:

    第一种

    <properties> <property name="password" value="123456"/> </properties>

    第二种:在db,properties文件中配置,然后加载此资源

    <properties resource="db.properties" > </properties> 第三种

    //编写Properties Properties properties = new Properties(); properties.setProperty("password", "1234"); //建立sqlsessionFactory SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream,properties); 如果三种都配置,那么加载顺序是:第一种——>第二种——>第三种

    1.2settings 设置

    settings配置会影响MyBatis的运行方式

    <!-- 是否使用缓存 --> <setting name="cacheEnabled" value="true"/> <!--是否启用延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="enhancementEnabled" value="false"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25000"/> </settings>

    1.3typeAliases

    类型别名就是为java类型设置一个短的名称

    <!-- 单个别名定义 --> <typeAlias type="com.study.mybatis.Customer" alias="customer"/> <!-- 包别名定义:指定包名称为该包下的po类声明别名,默认别名就是类名(不区分大小写) --> <package name="com.study.mybatis"/> </typeAliases>

    1.4typeHandlers

    无论是 MyBatis 在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成 Java 类型,如果我们想将获取的值按照自己的方式转换,那么就得自己写一个类型处理器.

    重写TypeHandler 接口

    1.5objectFactory

    Mybatis每次创建一个新的结果对象实例时,它使用一个 ObjectFactory 实例来完成,我们可以重写该实例,以自己的方式创建

    继承 ObjectFactory

    1.6plugins

    添加插件

    1.7environments

    environments可以配置我们的数据库连接池,事物管理等

    <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <!--配置数据源,采用mybatis连接池,使用POOLED方式 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
    1.7.1transactionManager
    在MyBatis中有两种事物管理,JDBC ,MANAGED JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。 MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如 Spring 或 JEE 应用服务器的上下文)
    1.7.2dataSsource
    数据源的配置,有三种配置: 第一种:UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接 第二种:POOLED – 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间 第三种:JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用

    1.8Mappers

    有四种种配置mapper映射文件路径的方式 第一种:<mapper resource=""/>  相对于类路径的资源 <mapper resource="OrdersExtMapper.xml"/> 第二种:<mapper url=""/>  使用完全限定路径 <mapperurl="file:///D:\workspace1\mybatis_01\config\sqlmap\User.xml"/> 第三种:<mapper class=""/> 使用接口的全限定名 <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> 此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下; 第四种:<mapper package=""/> 指定包下的所有映射文件 <packagename="com.study.mybatis.mapper"/> 注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下

    二.SqlMapper映射配置文件

    结构如下:

    cache - 配置给定命名空间的缓存。 cache-ref – 从其他命名空间引用缓存配置。 resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。 parameterMap – 已经被废弃了!老式风格的参数映射。 sql – 可以重用的 SQL 块,也可以被其他语句引用。 insert – 映射插入语句 update – 映射更新语句 delete – 映射删除语句 select – 映射查询语句

    主要详解insert中的一些配置属性,update,delete,insert和select一样。sql片段,resultMap

    1.select

    1.1输入类型

    输入类型有四种,简单类型,pojo类型,包装pojo类型,map类型,主要来看下map类型

    map类型:

    sqlMapper配置文件

    <select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap"> SELECT * FROM t_customer WHERE id=#{id} </select>

    mapper接口:

    public Customer findUserByHashMap(Map<String, Object> hashmap) throws Exception; 测试代码:

    @Test public void test6() throws Exception{ Map<String, Object> hash=new HashMap<String, Object>(); hash.put("id", 4); String resource="SqlMapConfig.xml"; //读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //建立sqlsessionFactory SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream); //创建session SqlSession session=sqlSessionFactory.openSession(); //调用session的增删改查 CustomerMapper mapper = session.getMapper(CustomerMapper.class); //传入map类型的参数 System.out.println(mapper.findUserByHashMap(hash).getCname()); //提交事物 session.commit(); session.close(); }

    1.2输出类型

    1.2.1resultType

    使用resultType映射的规范:

    使用resultType进行结果映射时,需要查询出的列名和映射的对象的属性名一致,才能映射成功。

    如果查询的列名和对象的属性名全部不一致,那么映射的对象为空。

    如果查询的列名和对象的属性名有一个一致,那么映射的对象不为空,但是只有映射正确那一个属性才有值。

    如果查询的sql的列名有别名,那么这个别名就是和属性映射的列名。

    简单类型

    使用简单类型规则:

    查询的列必须是一列,才能映射为简单类型,比如,统计计数

    po类

    po类在MyBatis学习一中有概述

    1.2.2resultMap

    resultMap进行结果映射时,不需要其列名和属性名一致,但须声明一个resultMap,来对列名和属性名进行映射

    resultMap配置:

    <!-- id:专门为查询结果中唯一的映射 result:映射查询结果中的普通列  --> <resultMap type="com.study.mybatis.Customer" id="userByMap"> <id column="id" property="id"/> <result column="cname" property="cname"/> </resultMap> <select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap"> SELECT * FROM t_customer WHERE id=#{id} </select> Customer类:

    public class Customer { private Integer id; private String cname; public Integer getId() { return id; } public void setId(Integer cid) { this.id = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } } 测试:

    @Test public void test6() throws Exception{ Map<String, Object> hash=new HashMap<String, Object>(); hash.put("id", 4); String resource="SqlMapConfig.xml"; //读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //建立sqlsessionFactory SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream); //创建session SqlSession session=sqlSessionFactory.openSession(); //调用session的增删改查 CustomerMapper mapper = session.getMapper(CustomerMapper.class); //传入map类型的参数 System.out.println(mapper.findUserByHashMap(hash).getCname()); //提交事物 session.commit(); session.close(); }

    2.sql片段

    Sql片段可以让代码有更高的可重用性

    Sql片段需要先定义后使用

    定义:

    <sql id="sqlFindId"> SELECT * FROM t_customer WHERE =#{id} </foreach> 调用:

    <select id="findById" parameterType="int" resultType="customer"> <include refid="sqlFindId"></include> </select>

    3.动态sql

    例:foreach

    <!-- collection:pojo集合中的属性名称 item:遍历出的结果声明结果名称 open:遍历开始时的连接符 close:遍历结束时的连接符 separator:分隔符 --> <sql id="sqlForeach"> SELECT * FROM t_customer WHERE id IN <foreach collection="idList" item="id" open="(" close=")" separator=","> #{id} </foreach> </sql>

    转载请注明原文地址: https://ju.6miu.com/read-38605.html

    最新回复(0)