spring整合mybatis怎样配置注解

spring整合mybatis怎样配置注解,第1张

mybatis和spring的整合步骤:

1)使用mybatis,必须有个全局配置文件configuration.xml,来配置mybatis的缓存,延迟加载等等一系列属性,该配置文件示例如下:

Java代码

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"

"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<configuration>

<settings>

<!-- 全局映射器启用缓存 -->

<setting name="cacheEnabled" value="true" />

<!-- 查询时,关闭关联对象即时加载以提高性能 -->

<setting name="lazyLoadingEnabled" value="true" />

<!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->

<setting name="aggressiveLazyLoading" value="false" />

<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->

<setting name="multipleResultSetsEnabled" value="true" />

<!-- 允许使用列标签代替列名 -->

<setting name="useColumnLabel" value="true" />

<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->

<setting name="useGeneratedKeys" value="true" />

<!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->

<setting name="autoMappingBehavior" value="FULL" />

<!-- 对于批量更新 *** 作缓存SQL以提高性能 -->

<setting name="defaultExecutorType" value="BATCH" />

<!-- 数据库超过25000秒仍未响应则超时 -->

<setting name="defaultStatementTimeout" value="25000" />

</settings>

<!-- 全局别名设置,在映射文件中只需写别名,而不必写出整个类路径 -->

<typeAliases>

<typeAlias alias="TestBean"

type="com.wotao.taotao.persist.test.dataobject.TestBean" />

</typeAliases>

<!-- 非注解的sql映射文件配置,如果使用mybatis注解,该mapper无需配置,但是如果mybatis注解中包含@resultMap注解,则mapper必须配置,给resultMap注解使用 -->

<mappers>

<mapper resource="persist/test/orm/test.xml" />

</mappers>

</configuration>

2)该文件放在资源文件的任意classpath目录下,假设这里就直接放在资源根目录,等会spring需要引用该文件。

查看ibatis-3-config.dtd发现除了settings和typeAliases还有其他众多元素,比如properties,objectFactory,environments等等,这些元素基本上都包含着一些环境配置,数据源定义,数据库事务等等,在单独使用mybatis的时候非常重要,比如通过以构造参数的形式去实例化一个sqlsessionFactory,就像这样:

Java代码

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader)

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, properties)

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, properties)

而typeHandlers则用来自定义映射规则,如可以自定义将Character映射为varchar,plugins元素则放了一些拦截器接口。

2)在spring配置文件中指定c3p0数据源定义如下:

Java代码

<!-- c3p0 connection pool configuration -->

<bean id="testDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"

destroy-method="close">

<!-- 数据库驱动 -->

<property name="driverClass" value="${db.driver.class}" />

<!-- 连接URL串 -->

<property name="jdbcUrl" value="${db.url}" />

<!-- 连接用户名 -->

<property name="user" value="${db.username}" />

<!-- 连接密码 -->

<property name="password" value="${db.password}" />

<!-- 初始化连接池时连接数量为5个 -->

<property name="initialPoolSize" value="5" />

<!-- 允许最小连接数量为5个 -->

<property name="minPoolSize" value="5" />

<!-- 允许最大连接数量为20个 -->

<property name="maxPoolSize" value="20" />

<!-- 允许连接池最大生成100个PreparedStatement对象 -->

<property name="maxStatements" value="100" />

<!-- 连接有效时间,连接超过3600秒未使用,则该连接丢弃 -->

<property name="maxIdleTime" value="3600" />

<!-- 连接用完时,一次产生的新连接步进值为2 -->

<property name="acquireIncrement" value="2" />

<!-- 获取连接失败后再尝试10次,再失败则返回DAOException异常 -->

<property name="acquireRetryAttempts" value="10" />

<!-- 获取下一次连接时最短间隔600毫秒,有助于提高性能 -->

<property name="acquireRetryDelay" value="600" />

<!-- 检查连接的有效性,此处小弟不是很懂什么意思 -->

<property name="testConnectionOnCheckin" value="true" />

<!-- 每个1200秒检查连接对象状态 -->

<property name="idleConnectionTestPeriod" value="1200" />

<!-- 获取新连接的超时时间为10000毫秒 -->

<property name="checkoutTimeout" value="10000" />

</bean>

配置中的${}都是占位符,在指定数据库驱动打war时会自动替换,替换的值在父pom中配置。

3)需要一个sessionFactory来生成session,sessionFactory配置如下:

Java代码

<bean id="testSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="configLocation" value="classpath:configuration.xml" />

<property name="dataSource" ref="testDataSource" />

</bean>

4)配置一个映射器接口来对应sqlSessionTemplate,该映射器接口定义了接口方法:

Java代码

<!-- data OR mapping interface -->

<bean id="testMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

<property name="sqlSessionFactory" ref="testSqlSessionFactory" />

<property name="mapperInterface" value="com.wotao.taotao.persist.test.mapper.TestMapper" />

</bean>

5)至此,一个完整的myabtis整合spring的配置文件看起来应该如下所示:

Java代码

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<!-- c3p0 connection pool configuration -->

<bean id="testDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"

destroy-method="close">

<property name="driverClass" value="${db.driver.class}" />

<property name="jdbcUrl" value="${db.url}" />

<property name="user" value="${db.username}" />

<property name="password" value="${db.password}" />

<property name="initialPoolSize" value="5" />

<property name="minPoolSize" value="5" />

<property name="maxPoolSize" value="20" />

<property name="maxStatements" value="100" />

<property name="maxIdleTime" value="3600" />

<property name="acquireIncrement" value="2" />

<property name="acquireRetryAttempts" value="10" />

<property name="acquireRetryDelay" value="600" />

<property name="testConnectionOnCheckin" value="true" />

<property name="idleConnectionTestPeriod" value="1200" />

<property name="checkoutTimeout" value="10000" />

</bean>

<bean id="testSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="configLocation" value="classpath:configuration.xml" />

<property name="dataSource" ref="testDataSource" />

</bean>

<!-- data OR mapping interface -->

<bean id="testMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

<property name="sqlSessionFactory" ref="testSqlSessionFactory" />

<property name="mapperInterface" value="com.wotao.taotao.persist.test.mapper.TestMapper" />

</bean>

<!-- add your own Mapper here -->

<!-- comment here, using annotation -->

<!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">-->

<!-- <constructor-arg index="0" ref="sqlSessionFactory" />-->

<!-- </bean>-->

<!-- base DAO class, for module business, extend this class in DAO -->

<!-- <bean id="testBaseDAO" class="com.test.dao.TestBaseDAO">-->

<!-- <property name="sqlSessionTemplate" ref="sqlSessionTemplate" />-->

<!-- </bean>-->

<!-- <bean id="testDAO" class="com.test.dao.impl.TestDAOImpl" />-->

<!-- you can DI Bean if you don't like use annotation -->

</beans>

想必在利用Mybatis Generator生成代码之后,相比看着一堆鸡肋的注释很多人都和我一样很纠结,明明数据库中字段有注释,为什么生成的Bean没有呢?带着发现问题,一定要解决问题的决心,我进行了探索。

先mark几篇Mybatis Generator的资料: Mybatis Generator中文API 一篇很详细的博客

要想生成中文注释,首先我们需要新建一个maven项目

然后新建一个类,名字随便啦。。。我这里叫QnloftCommentGenerator,上代码

package org.mybatis.generator

import org.mybatis.generator.api.IntrospectedColumn

import org.mybatis.generator.api.IntrospectedTable

import org.mybatis.generator.api.dom.java.Field

import org.mybatis.generator.internal.DefaultCommentGenerator

/**

* User: R&M www.rmworking.com/blog

* Date: 16/6/20

* Time: 00:56

* mybatis-generator-increase

* org.mybatis.generator

*/

public class QnloftCommentGenerator extends DefaultCommentGenerator {

@Override

public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

// 添加字段注释

StringBuffer sb = new StringBuffer()

field.addJavaDocLine("/**")

field.addJavaDocLine(" *")

if (introspectedColumn.getRemarks() != null)

field.addJavaDocLine(" * " + introspectedColumn.getRemarks())

sb.append(" * 表字段 : ")

sb.append(introspectedTable.getFullyQualifiedTable())

sb.append('.')

sb.append(introspectedColumn.getActualColumnName())

field.addJavaDocLine(sb.toString())

field.addJavaDocLine(" * ")

field.addJavaDocLine(" * ")

// addJavadocTag(field, false)

field.addJavaDocLine(" */")

}

}

主要就是继承DefaultCommentGenerator,重写addFieldComment方法。

在对应的.xml中添加insert标签,换掉中间的insert语句insertintouser(userName,userAge,userAddress)values(#{userName},#{userAge},#{userAddress})


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11753622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存