1、MyBatis主配置文件

image.png

1.1 属性(properties)

MyBatis主配置文件中的dataSource元素的propertie子元素的value属性的值,即可以直接定义,也可以在主配置文件中定义然后引用,也可以引用外部的properties文件。举例子来说就是,如下的两个xml的配置效果是一样的。

1.1.1 直接配置

<?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>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
    
</configuration>

1.1.2 引用配置

<?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>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </properties>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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>
    
    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
    
</configuration>

以上两种形式,在开发过程中一般不会这么用。一般是直接类路径下(在maven工程下就是resources目录下)定义一个properties文件,然后在MyBatis的主配置文件中引用该文件,然后就可以在主配置文件中直接引用。如下所示:

1.1.3 引用properties配置文件

1.1.3.1 properties配置文件
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis
jdbc.username = root
jdbc.password = root
1.1.3.2 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">
<configuration>

    <properties resource="datasource.properties"></properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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>

    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>

</configuration>

1.1.3.3 目录结构

image.png

1.1.3.4 注意事项

  1. properties标签的resource属性指向的类路径下的文件(在maven工程下为resources目录下)。
  2. 在${jdbc.driver}中,大括号里面的值要对应properties文件中定义的变量名,要个要求一一对应。
  3. 如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

    1. dataSource 元素的子元素 properties 元素体内指定的属性首先被读取。
    2. 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
    3. 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
    4. 总结:通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。

1.2 设置(settings)

<settings>
    <!--缓存配置的全局开关:如果这里设置成false,那么即便在映射器中配置开启也无济于事 -->
    <setting name="cacheEnabled" value="true" />
    <!--延时加载的全局开关 -->
    <setting name="lazyLoadingEnabled" value="false" />
    <!-- 是否允许单一语句返回多结果集 -->
    <setting name="multipleResultSetsEnabled" value="true" />
    <!-- 使用列标签代替列名,需要兼容驱动 -->
    <setting name="useColumnLabel" value="true" />
    <!-- 允许JDBC自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍能正常工作 -->
    <setting name="useGeneratedKeys" value="false" />
    <!-- 指定MyBatis该如何自动映射列到字段或属性:NONE表示取消自动映射;PARTIAL表示只会自动映射,没有定义嵌套结果集和映射结果集;FULL会自动映射任意复杂的结果集,无论是否嵌套 -->
    <setting name="autoMappingBehavior" value="PARTIAL" />
    <!-- 配置默认的执行器:SIMPLE是普通的执行器;REUSE会重用预处理语句;BATCH会重用语句并执行批量更新 -->
    <setting name="defaultExecutorType" value="SIMPLE" />
    <!--设置超时时间:它决定驱动等待数据库响应的秒数,任何正整数-->
    <setting name="defaultStatementTimeout" value="25"/>
    <!--设置数据库驱动程序默认返回的条数限制,此参数可以重新设置,任何正整数 -->
    <setting name="defaultFetchSize" value="100" />
    <!-- 允许在嵌套语句中使用分页(RowBounds) -->
    <setting name="safeRowBoundsEnabled" value="false" />
    <!-- 是否开启自动驼峰命名规则,即从a_example到aExample的映射 -->
    <setting name="mapUnderscoreToCamelCase" value="true" />
    <!-- 本地缓存机制,防止循环引用和加速重复嵌套循环 -->
    <setting name="localCacheScope" value="SESSION" />
    <!-- 当没有为参数提供特定JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,如NULL/VARCHAR/OTHER -->
    <setting name="jdbcTypeForNull" value="OTHER" />
    <!-- 指定触发延迟加载的方法,如equals/clone/hashCode/toString -->
    <setting name="lazyLoadTriggerMethods" value="equals" />
</settings>

1.3 别名(typeAliases)

在MyBatis的映射配置文件中(也就是接口对应的XxxMapper.xml文件),每当指定一个java类的所属类型时,都需要拼写出该类的全限定类名。例如下面的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">
<mapper namespace="com.mybatis.dao.UserDao">
    <!-- 查询所有 -->
    <select id="findAll" resultType="com.mybatis.domain.User">
        SELECT * FROM user
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="com.mybatis.domain.User">
        INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

如上这样配置存在一个问题,当配置文件少的时候还好,如果配置文件的数量一旦增多,就会导致工作量激增。所以就有了给java类的全限定类名取一个简短的别名,用别名代替全限定类名,减少不必要的工作量。具体操作如下。

主配置文件中使用typeAliases标签为pojo的全限定类名去一个别名,然后把映射配置文件中pojo的全限定类名替换成别名即可。别名可以任意,且当使用了别名后,别名将不区分大小写。具体配置如下。

主配置文件

<?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>
    <!-- 注意configuration下的子标签严格区分定义顺序(使用顺序) -->
    <properties resource="datasource.properties"></properties>

    <typeAliases>
        <!--
            type:用于指定pojo的全限定类名;
            alias:用于指定别名
        -->
        <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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>

    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

映射文件

<?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="com.mybatis.dao.UserDao">
    <!-- 查询所有 -->
    <!-- 使用了别名后pojo的别名不区分大小写 -->
    <select id="findAll" resultType="user">
        SELECT * FROM user
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="User">
        INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

以上操作虽然已经能极大的简化我们的开发,但是,一个项目中不可能只有一两个pojo。所以如果我们要使用上述的方式指定定义一个项目中所有pojo的话也不现实。typeAliases下除了typeAlias子标签外,还有一个package子标签,该标签的作用是为某个指定的包下所有的pojo一起取别名,默认类名即为别名。具体如下所示。

<?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>
    <!-- 注意configuration下的子标签严格区分定义顺序(使用顺序) -->
    <properties resource="datasource.properties"></properties>

    <typeAliases>
        <!--
            type:用于指定pojo的全限定类名;
            alias:用于指定别名
        -->
        <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias>
        <!-- 为com.mybatis.domain子包下的pojo一起取别名,别名即为类名 -->
        <package name="com.mybatis.domain"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <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>

    <mappers>
        <mapper resource="com/mybatis/dao/UserDao.xml"></mapper>
    </mappers>
</configuration>

2、MyBatis映射配置文件

2.1 select标签

<select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User">
  SELECT * FROM user WHERE id = #{id}
</select>

属性说明

  • id:当前select标签在当前映射配置文件中的唯一标识符;
  • parameterType:参数类型,如果为非基本类型的pojo,则需要写出pojo的全限定类名(如果取了别名,可以使用别名),如果为基本类型,可以直接写全限定类名,也可以直接写类名,如果没有则省略;
  • resultType:返回值类型,如果为非基本类型的pojo,则需要写出pojo的全限定类名(如果取了别名,可以使用别名),如果为基本类型,可以直接写全限定类名,也可以直接写类名,如果没有则省略;

2.2 insert标签

<insert id="saveUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id"  parameterType="com.mybatis.domain.User">
    INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>

属性说明

  • id:当前select标签在当前映射配置文件中的唯一标识符;
  • parameterType:参数类型,如果为非基本类型的pojo,则需要写出pojo的全限定类名(如果取了别名,可以使用别名),如果为基本类型,可以直接写全限定类名,也可以直接写类名,如果没有则省略;
  • useGeneratedKeys:开启主键回写(当我们向数据库插入数据时,主键是设置的自增的,但是我们插入好数据库后,我们希望得到刚刚插入的数据的主键,mybatis通过useGeneratedKeys、keyColumn、keyProperty可以实现该需求);
  • keyColumn:keyColumn:主键列名(既数据库表中的列名);
  • keyProperty:主键对应的属性名(实体中的属性名);

2.3 updata标签

<update id="updateUser" parameterType="com.mybatis.domain.User">
    UPDATE user
    SET username = #{username},
        birthday = #{birthday},
        sex = #{sex},
        address = #{address}
    WHERE id = #{id}
</update>

属性说明

  • id:当前select标签在当前映射配置文件中的唯一标识符;
  • parameterType:参数类型,如果为非基本类型的pojo,则需要写出pojo的全限定类名(如果取了别名,可以使用别名),如果为基本类型,可以直接写全限定类名,也可以直接写类名,如果没有则省略;

2.4 delete标签

<delete id="deleteUser" parameterType="java.lang.Integer">
    <!-- 当只有一个参数时,参数名称可以任意 -->
    DELETE FROM user WHERE id = #{id}   
</delete>

2.5 #{}和${}的区别

2.5 resultMap标签


短腿臭柯基
9 声望2 粉丝

下一篇 »
连接池

引用和评论

0 条评论