Mybatis配置文件元素
在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<configuration>元素内配置。
元素
<properties>是一个配置属性的元素,通过外部配置来动态替换内部定义的属性:
如首先需创建一个jdbc.properties配置文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=alian
其次需要在mybatis-config.xml文件中配置<properties/>属性:
<properties resource="jdbc.properties"/>
<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>
dataSource中连接数据库的4个属性(driver、url、username和password)值将会由jdbc.properties文件中对应的值来动态替换,这就为配置提供了灵活性。
<settings>元素
<settings>元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。
<typeAliases>元素
<typeAliases>元素用于为配置文件中的Java类型设置别名,其使用的意义在于减少全限定类名的冗余:
<typeAliases>
<typeAlias alias="user" type="com.neu.po.User"/>
</typeAliases>
<typeAliases>
<package name="com.neu.po"/>
</typeAliases>
<typeAliases>中alias属性的属性值"user"就是自定义的别名,可以代替"com.neu.po.User"使用在MyBatis文件的任何位置;如果省略alias属性,MyBatis会默认将类名首字母小写后的名称作为别名。当POJO类过多时,还可以通过自动扫描包的形式自定义别名。
<typeHandler>元素
typeHandler的作用就是将预处理语句(prepared statement)中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。
<typeHandlers>
<typeHandler handler="com.neu.type.UsertypeHandler"/>
</typeHandlers>
<!--注册一个包中所有的类型处理器-->
<typeHandlers>
<package name="com.neu.type"/>
</typeHandlers>
使用这种方式,系统会在启动时自动扫描com.neu.type包下所有的文件,并把它们作为类型处理器。
<plugins>元素
<plugins>元素的作用就是配置用户所开发的插件
<environments>元素
<environments>元素用于在配置文件中对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,可以通过<environments>元素配置多种数据源,即配置多种数据库。
- <transactionManager>元素用于配置事务管理
- <dataSource>元素用于配置数据源
对于数据源的配置,MyBatis框架提供了UNPOOLED、POOLED和JNDI三种数据源类型:
数据源类型 | 描述 |
---|---|
UNPOOLED | 配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择 |
POOLED | 此数据源利用“池”的概念将JDBC连接对象组织起来,避免在创建新的连接实例时需要初始化和认证的时间。这种方式使得并发Web应用可以快速地响应请求,是当前流行的处理方式 |
JNDI | 此数据源可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用 |
<mappers >元素
<mappers>元素用于指定MyBatis映射文件的位置,通常可以使用以下4种方法引入映射器文件:
<!--使用类路径引入-->
<mappers>
<mapper resource="com/neu/mapper/UserMapper.xml"/>
</mappers>
<!--使用本地文件路径引入-->
<mappers>
<mapper url=“D:/com/neu/mapper/UserMapper.xml”/>
</mappers>
<!--使用接口类引入-->
<mappers>
<mapper class="com.neu.mapper.UserMapper"/>
</mappers>
<!--使用包名引入-->
<mappers>
<package name="com.neu.mapper"/>
</mappers>
映射文件
如果使用的数据库不支持主键自动增长(如Oracle),或者支持增长的数据库取消了主键自增的规则,就可以使用MyBatis提供的另一种方式来自定义生成主键,具体配置如下:
<insert id="insertUser" parameterType="com.neu.po.User">
<selectKey keyProperty="id" resultType="Interger" order="BEFORE">
select if(max(id) is null,1,max(id)+1) as newid from t_user
</select>
insert into t_user(id,username,jobs,phone) values(#{id},#{username},#{jobs},#{phone})
</insert>
<sql>元素的作用是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段:
<sql id="user Columns">id,username,jobs,phone</sql>
<select id="findUserById" parameterType="Interger" resultType="com.neu.po.User">
select <include refid="user Columns"> from t_user where id=#{id}
</select>
SQL片段:使用<include>元素的refid属性引用了自定义的代码片段,refid属性值为自定义代码片段的id。
<resultMap>元素
<resultMap>元素表示结果映射集,主要作用是定义映射规则、级联更新以及定义类型转化器等。
<resultMap type="com.neu.po.User" id="resultMap">
<id property="id" column="t_id"/>
<result property="name" column="t_username"/>
<result property="age" column="t_age"/>
</resultMap>
<select id="findAllUser" resultMap="resultMap">
select * from t_user
</select>
上述代码中,<id>和<result>的property属性表示User类的属性名,column属性表示数据表t_user的列名;<id>用于表示哪个列是主键,<result>用于表示POJO和数据表中普通列的映射关系。
(此外,还可以通过<resultMap>元素中的<association>和<collection>处理多表时的关联关系。
动态SQL
MyBatis中的动态SQL提供对SQL语句动态组装的功能,解决了开发人员在使用JDBC进行数据库开发时手动拼装SQL的工作。
标签 | 描述 |
---|---|
<if> | 判断语句,用于单条件分支判断 |
<choose>(<when>、<otherwise>) | 用于多条件分支判断 |
<where ><trim><set> | 辅助元素,用于处理一些SQL拼装、特殊字符问题 |
<foreach> | 循环语句,常用于in语句等列举条件中 |
<bind> | 从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询的SQL中 |
举例如下:修改映射文件UserMapper.xml,在映射文件中使用<if>元素编写根据用户姓名和职业组合条件查询用户信息列表的动态SQL。
<select id="findUserByNameAndJobs" parameterType="com.neu.po.User">
select * from t_user where 1=1
<if test="username !=null and username !=''">
and username like concat('%',#{username},'%')
</if>
<if test="jobs != null and jobs !=''">
and jobs=#{jobs}
</if>
</select>
在某些情况下,使用<if>元素是不合适的,可以使用<choose>、<when>、<otherwise>元素进行处理,类似于在Java语言中使用switch…case…default语句。
上述代码首先查看第一个<when>元素中的条件是否满足,若第一个条件为真,则只动态组装第一个<when>元素内的SQL片段;否则继续向下判断第二个<when>元素中的条件是否为真,以此类推;若前面所有when元素中的条件都不为真,则只组装<otherwise>元素内的SQL片段。
<where>元素:可以取代上述代码中的"where 1=1"
使用<where>元素对"where 1=1"条件进行了替换,<where>元素会自动判断组合条件下拼装的SQL语句,只有<where>元素内的条件成立时,才会在拼接SQL中加入where关键字,否则将不会添加;即使where之后的内容有多余的“AND”或“OR”,<where>元素也会自动将它们去除。(<where>可搭配<trim>元素使用)
<set>元素主要用于更新操作,主要作用是在动态包含的SQL语句前输出一个SET关键字,并将SQL语句中最后一个多余的逗号去除。
注:在映射文件中使用<set>和<if>元素组合进行update语句动态SQL组装时,如果<set>元素内包含的内容都为空,就会出现SQL语法错误。所以在使用<set>元素进行字段信息更新时,要确保传入的更新字段不能都为空。
<foreach>元素:
findUserByIds_MyBatisTest.java:
<bind>元素:
在进行模糊查询编写SQL语句的时候,若使用“${}”进行字符串拼接,则无法防止SQL注入问题;若使用concat函数进行拼接,则只针对 MySQL数据库有效;若使用的是Oracle数据库,则要使用连接符号“||”。这样,映射文件中的SQL就要根据不同的情况提供不同形式的实现,显然是比较麻烦的,且不利于项目的移植。为此,MyBatis提供了<bind>元素来解决这一问题。我们完全不必使用数据库语言,只要使用 MyBatis的语言即可与所需参数连接。
findUserByName_MyBatisTest.java: