1、MyBatis主配置文件
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 目录结构
1.1.3.4 注意事项
- properties标签的resource属性指向的类路径下的文件(在maven工程下为resources目录下)。
- 在${jdbc.driver}中,大括号里面的值要对应properties文件中定义的变量名,要个要求一一对应。
-
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- dataSource 元素的子元素 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
- 总结:通过方法参数传递的属性具有最高优先级,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>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。