1. Construir un entorno de desarrollo
1.1. Crea un proyecto web con Maven
Ejecutar el siguiente comando:
Copie el código de la siguiente manera: MVN Archetype: CREATE -DGROUPID = ME.GACL -DARTIFACTID = Spring4 -Mybatis3 -DarchetyPeartifactId = maven -archetype -webapp -dinteractivEmode = false
Como se muestra en la figura a continuación:
El proyecto creado es el siguiente:
Editar archivo pom.xml
<Project xmlns = "http://maven.apache.org/pom/ .." xmlns: xsi = "http://www.w.org//xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/ .. .. http://maven.apache.org/maven-v__.xsd "> <modelVersion> .. </modelversion> <MoupRupid> me.gacl </groupid> <artifactid> spring-mybatis </arfactid> <compagument> war </paquete> <versión> .- instantánea </spersion> <name> <Ull> http://maven.apache.org </sl> <pendencies> <pendency> <MoupRoMID> Junit </proupid> <artifactid> Junit </artifactid> <versión> .. </sione> <opepe> test </cope> </dependency> </dependencias> <17 final> <finalname> spring-mybatis </cope>
Modifique la sección <Name> Spring4-Mybatis3 Maven WebApp </name> y elimine el contenido que contiene espacios en la "Maven WebApp". De lo contrario, cuando Maven compila el proyecto, se producirán algunos errores inexplicables debido a los espacios, y modificarlos a: <name> Spring4-Mybatis3 </name> .
Además, elimine lo siguiente:
<Spendency> <MoupRoD> Junit </GroupId> <ArfactId> Junit </artifactId> <versión> .. </versión> <AcPePE> test </cope> </dependence>
Esta parte es la información de dependencia del paquete JAR de JUNIT. Esta versión es demasiado baja. No usamos esta versión de prueba Junit. El contenido modificado de pom.xml es el siguiente:
<Project xmlns = "http://maven.apache.org/pom/ .." xmlns: xsi = "http://www.w.org//xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/ .. .. http://maven.apache.org/maven-v__.xsd "> <modelVersion> .. </modelversion> <grupo> me.gacl </groupid> <artifactid> spring-mybatis </arfactid> <compaingo> war </apackaging> <versión> .- instantánea </versever> <name> <URL> http://maven.apache.org </sl> <pendencies> </pendencies> <eded> <finalName> Spring-Mybatis </ finalName> </struct> </proyecto>
1.2. Importar el proyecto creado en myeclipse
Los pasos de operación específicos se muestran en la figura a continuación:
Cree manualmente tres carpetas de origen: [src/main/java], [src/test/recursos] y [src/test/java], como se muestra en la figura a continuación:
En este punto, se ha completado todos los trabajos de construcción del proyecto.
2. Cree bases de datos y tablas (para MySQL)
El script SQL es el siguiente:
Crear base de datos Spring4_mybatis3; use spring4_mybatis3; table de caída si existe t_user; crea tabla t_user (user_id char (32) no null, user_name varchar (30) NULL NULL, user_birthday date predeterminado, user_salary doble predeterminado NULL, clave primaria (user_id)) Engine = inNOnB predeterminado = inhalado = utf8 de fecha predeterminado, NULL, user_salary predeterminado NULL, clave primaria (user_id)) Engine = innOnB predeterminado = USTF8 DEFETH SED EUTF8;
La base de datos y la tabla creadas son los siguientes:
3. Use la herramienta Generator para generar código
Encontré una herramienta de generador en línea que puede generar clases de entidad, archivos de mapeo SQL y DAO correspondiente a la tabla MyBatis basada en la tabla de base de datos creada, y busque el archivo generador.xml en el directorio raíz de la herramienta Generator. Este archivo se utiliza para configurar las reglas de generación de código, como se muestra en la figura a continuación:
Editar el archivo generador.xml, el contenido es el siguiente:
<? xml versión = "." encoding = "utf-"?> < ubicación = "e:/repository/mysql/mysql-connector-java /..../ mysql-connector-java -... jar"/> <!-<classpathEntry ubicación = "c:/oracle/producto /..../ db_/jdbc/lib/ojdbc.jar"/>-> <contexti = "dBtable" TargetReMeMe " <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- Database Link URL, Username, Password--> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:/spring_mybatis" userId="root" contraseña = "xdp"> <!-<jdbcconnection driverClass = "oracle.jdbc.driver.oracledriver" ConnectionUrl = "jdbc: oracle: Thin: @LocalHost :: Orcl" userId = "msa" contraseña = "msa">-> </jdbcconnection> <javatyperesOlver> <product name = "contraseña =" mSa ">-> </jdbcconnection> <javatyperesOlver> <sperty name =" contraseña = "msa">-> </jdbcconnection> <javatyperesOlver> valor = "falso" /> < /javatyperesolver> <!- Genere el nombre y la ubicación del paquete de la clase de entidad. Here the generated entity class is placed under the package me.gacl.domain--> <javaModelGenerator targetPackage="me.gacl.domain" targetProject="C:/Users/gacl/spring-mybatis/src/main/java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javamodelGenerator> <!- El nombre y ubicación del paquete de archivo de mapa SQL generado. Aquí, coloque el archivo de mapa SQL generado en el paquete me.gacl.mapping-> <sqlmapGenerator TargetPackage = "me.gacl.mapping" targetProject = "c:/users/gacl/spring-mybatis/src/main/java"> <name de property = "endablesubpackages" valor = "verdadero"/> </sqlMapGenerator "! Nombre y ubicación del DAO. Here, place the generated dao class under the package me.gacl.dao--> <javaClientGenerator type="XMLMAPPER" targetPackage="me.gacl.dao" targetProject="C:/Users/gacl/spring-mybatis/src/main/java"> <property name="enableSubPackages" value="true" /> < /javaclientGenerator> <!-para generar esas tablas (cambiar tableName y domingoObjectName)-> <table tableName = "t_user" domainObjectName = "user" enableCountByExample = "false" EntableUpDateByExample = "false" EnsleteByExample = "false" AableLectByExample = "false" selectbyExampleMample " </context> </GeneratorConfiguration>
Abra la ventana Línea de comando, cambie al directorio raíz de la herramienta Generador y ejecute el siguiente comando:
java -jar mybatis -generador -core -1.3.2.jar -configfile generador.xml -verwrite
Como se muestra en la figura a continuación:
Justo ahora, configuramos el código generado y el archivo de asignación SQL en el archivo generador.xml para poner el código generado y el archivo de asignación SQL en el directorio "c:/users/gaCl/spring4-mybatis3/src/main/java". Este directorio es el directorio donde se encuentra nuestro proyecto Spring4-Mybatis3. Actualizamos el directorio SRC/Main/Java y puede ver el código generado y el archivo de asignación, como se muestra en la figura a continuación:
El código generado y el archivo de asignación no necesitan cambiarse en una línea, y se pueden aplicar directamente al proyecto. Echemos un vistazo al código y los archivos de mapeo generados por la herramienta Generador:
1. Clase DAO generada
paquete me.gacl.dao; importame.gacl.domain.user; interfaz pública usermapper {int deletyByPrimaryKey (string userId); int Insert (registro de usuario); int Insertselective (registro de usuario); Usuario selectbyprimarykey (string userId); int updateByPrimaryKey (registro de usuario); }El Usermapper generado es una interfaz que define algunos métodos para agregar, eliminar, modificar y buscar la tabla T_USER.
2. La clase de entidad generada
paquete me.gacl.domain; import java.util.date; Usuario de clase pública {private String UserId; nombre de usuario de cadena privada; Fecha privada de usuario de usuario; Doble usuarios privados; public String getUserID () {return userId; } public void setUserID (String UserId) {this.userID = userId == null? nulo: userId.trim (); } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username == null? nulo: username.trim (); } fecha pública getUserBirthday () {return userBirthday; } public void setUserBirthday (fecha userbirthday) {this.userBirthday = userBirthday; } public Double GetUsersAlary () {return UserSalary; } public void setUsersalary (doble usuarios de usuarios) {this.usersalary = Usersalary; }}La clase de usuario es la clase de entidad correspondiente de la tabla T_user. Los atributos definidos en la clase de usuario corresponden a los campos en la tabla t_user uno por uno.
3. Archivo de mapeo SQL generado
<? xml versión = "." encoding = "utf-"?> <! Doctype mapper público "-// mybatis.org//dtdd type = "me.gacl.domain.user"> <id columna = "user_id" propiedad = "userId" jdbctype = "char" /> <resultado columna = "user_name" Property = "usame" jdbctype = "varchar" /> <resultado columna = "user_birthay" Propiedades "Propiedad =" userbirthday "jdbctype =" date "" date "date" "date" /"result" columna = "user_salary" Property = "Usersalary" jdbctype = "double"/> </resultmap> <sql id = "base_column_list"> user_id, user_name, user_birthay, user_salary </sql> <select ID = "selectbyparykey" resultMap = "BaseSultMap" "" " parametertype = "java.lang.string"> select <include refid = "base_column_list" /> de t_user donde user_id = #{userId, jdbctype = char} < /select> <delete id = "deletebyprimarykey" parametertype = "java.lang.string" #{userId, jdbctype = char} </eletete> <insert id = "insertar" parametertype = "me.gacl.domain.user"> insertar en t_user (user_id, user_name, user_birtayday, user_salary) valores ( #{userID, jdbctype = char}, #{usame, jdbtype). #{userbirthday, jdbctype = date}, #{usersalary, jdbctype = double}) </sert> <insert id = "insertselective" parametertype = "me.gacl.domain.user"> insertar en t_user <tripler <tripler = "(" Suffix = ")" sufixoverrides = "," if "Test =" User "User". user_id, </if> <if test = "username! = null"> user_name, </if> if test = "userbirthday! = null"> user_birthay, </if> <if test = "usersalary test = "userId! = null"> #{userId, jdbctype = char}, </if test = "username! = null"> #{username, jdbctype = varchar}, </if> <if test = "userbirthday test = "Usersalary! = Null"> #{Usersalary, jdbctype = double}, </if> </trom> </sert> <update id = "updateByPrimaryKeySelective" parametertype = "Me.gacl.domain.user"> update t_user <set> <if test = "usame! = null"> us_name = = = #{username, jdbctype = varchar}, </if> <if test = "userbirthday! = null"> user_birthday = #{userbirthday, jdbctype = date}, </if> <if test = "usersaltary! = null"> user_sallary = #{usersalario, jdbctype </set> donde user_id = #{userId, jdbctype = char} </palate> <update id = "updateByPrimaryKey" parametertype = "me.gacl.domain.user"> update t_user set user_name = #{username, jdbcype = varChar}, user_birthay = #{userbirthday, jdbctype = date}, user_salary = #{usersalary, jdbctype = double} donde user_id = #{userId, jdbctype = char} </update> </mapper>El contenido del archivo usermapper.xml es escribir declaraciones SQL que operen la tabla T_user. Centrémonos en algunos pequeños detalles a los que deben prestarse atención en la configuración usermapper.xml:
1. El espacio de nombres de la etiqueta <mapper> de usermapper.xml debe ser el nombre de clase completa de la interfaz Usermapper, es decir, <mapper namespace = "me.gacl.dao.usermapper">
2. Usermapper.xml Definición El valor del atributo de identificación de la base de datos de operación debe ser consistente con el nombre del método definido por la interfaz Usermapper, como se muestra en la figura a continuación:
La razón de los dos requisitos anteriores es que MyBatis puede implementar automáticamente los métodos relevantes definidos en la interfaz Usermapper en función de la interfaz Usermapper y el archivo usermapper.xml, de modo que ya no necesitamos escribir un código de implementación específico para la interfaz Usermapper.
4. Integración de la primavera y mybatis
Primero, necesitamos agregar los paquetes JAR relevantes que necesitamos al proyecto. Podemos ir al repositorio central de Maven: http://search.maven.org/ para encontrar los paquetes JAR relevantes que queremos, como se muestra en la siguiente figura:
Solo necesitamos ingresar el nombre del paquete JAR que estamos buscando en el cuadro de búsqueda y hacer clic en el botón [Búsqueda] para encontrar el paquete JAR que estamos buscando.
4.1. Agregar paquetes de jarra relacionados con Spring y MyBatis
1. Agregue el núcleo de primavera, ingrese la palabra clave Spring-Core para buscar, como se muestra en la figura a continuación:
Encuentre la información de descripción de dependencia sobre Spring-Core, como se muestra en la siguiente figura:
Voluntad
<Spendency> <ProupId> org.springframework </groupid> <artifactid> spring-core </artifactid> <verserse> 4.1.4.release </versión> </dependencia>
Copiar al archivo pom.xml del proyecto de la siguiente manera:
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. http://maven.apache.org/maven-v4_0_0.xsd "> <modelVersion> 4.0.0 </modelversion> <MoupRupid> me.gacl </groupid> <artifactid> spring4-mybatis3 </artifactid> <calleging> war </compackaging> <lansione 1.0-snapshot </versión> <name> spring4-mybatis3 </name> <url> http://maven.apache.org </sl> <pendencies> <!-Agregar Spring4.1.4 paquete central-> <pendency> <proupid> org.springframework </groupid> <sartifactid> spring-core </artifactid> <verSersion> 4.1.4.release </versión </versión </arthifence> </dependencias> <struct> <finalName> spring4-mybatis3 </finalName> </build> </proyecto>
De esta manera, Maven nos ayudará automáticamente a descargar el paquete JAR de Spring-Core desde el repositorio central de Maven a nuestro repositorio local, y luego agregará el paquete JAR de Spring-Core y sus dependencias relacionadas a nuestro proyecto, como se muestra a continuación:
Los paquetes JAR relacionados requeridos por Spring4.x y MyBatis3.x se pueden buscar en el método anterior y luego agregar al proyecto. Después de agregar los paquetes JAR relacionados relacionados con Spring4.x y MyBatis3.x, el contenido del archivo pom.xml es finalmente el siguiente:
<Project xmlns = "http://maven.apache.org/pom/ .." xmlns: xsi = "http://www.w.org//xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/ .. .. http://maven.apache.org/maven-v__.xsd "> <modelVersion> .. </modelversion> <grupo> me.gacl </groupid> <artifactid> spring-mybatis </arfactid> <compaingo> war </apackaging> <versión> .- instantánea </versever> <name> <Url> http://maven.apache.org </sl> <pendencies> <!-Agregar paquete Spring-Core-> <Spendency> <MoupRoD> org.springframework </proupid> <artifactID> spring-core </artifactid> <versión> ... versión </persion> </dependencia> <! <MoupRid> org.springframework </groupid> <artifactid> spring-Context </artifactid> <versions> ... Release </Version> </Dependency> <!-Agregar paquete Spring-TX-> <Spendency> <ProupID> org.springframework </groupid> <arfactID> spring-tx </artifactid> <versers paquete Spring-JDBC-> <pendency> <MoupRid> org.springframework </groupid> <artifactid> spring-jdbc </artifactid> <version> ... versión </versión> </pendency> <!-Agregar el paquete Spring-JDBC-> <Spendency> <MoupRid> org.springFramework </groupid> <artifactid> <Versión> ... Release </Version> </Dependency> <!-Para facilitar las pruebas unitarias, agregue el paquete Spring-TEST-> <Spendency> <MoupRoMID> org.springframework </groupid> <artifactid> spring-test </artifactid> <versión> ... versión> </dependency> <!-Agregar el paquete Spring-Web-> <pendency> <MoupRoMID> org.sg.ssworks <artifactId>spring-web</artifactId> <version>...RELEASE</version> </dependency> <!--Add aspectjweaver package --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>..</version> </dependency> <!-- Add mybatis core package --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>..</version> </dependency> <!-- Add mybatis core packages integrated with Spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>..</version> </dependency> < <Persion> ..- b </verse> </dependence> <!-jstl-> <pendency> <MoupRid> javax.servlet </proupid> <artifactid> jstl </artifactid> <versión>. </versión> </pendency> <!-Agregar paquete de controladores MySQL-> <Spendency> <MoupRid> mysql </proupid> <artifactid> mysql-confonector-java </artifactid> <verserse> .. </versión> </pendency> <!-Agregar paquete de grupo de conexión Druid-> <pendency> <proupid> com.alibaBa </groupid> <artifactid> druid </artfactid> <versewers> .. </sione> </pendency> <!-ADD JUNIT TEST PAWA <MoupRid> Junit </groupid> <artifactid> Junit </artifactid> <verSerse>. </verse> <cope> test </scope> </pendency> </pendencs> <eding> <dinalName> Spring-Mybatis </finalName> </build> </jection>
4.2. Escribe archivos de configuración relevantes
1. Dbconfig.properties
Cree un archivo dbconfig.properties en el directorio SRC/main/recursos para escribir información relevante sobre la conexión a la base de datos MySQL. El contenido de dbconfig.properties es el siguiente:
conductorClassName = com.mysql.jdbc.drIrvalidationQuery = select 1jdbc_url = jdbc: mysql: // localhost: 3306/spring4_mybatis3? UseUnicode = true & caracterSencoding = utf-8 & ZeroDatetimeBehavior = ConverttonullJDBC_USERNAME = roadjdbc_password = XDP
2. Spring.xml (archivo de configuración de Spring Framework)
Cree un archivo Spring.xml en el directorio SRC/Main/Resources. El archivo Spring.xml es el archivo de configuración central escrito para el marco de Spring. El contenido de Spring.xml es el siguiente:
<? xml versión = "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" xsi: schemalocation = "http://www.springframework.org/schema/beansshttp://www.springframework.org/sche ma/beans/spring-beans-3.0.xsdhttp: //www.springframework.org/schema/context/spring-context-3.0.xsd "> < Todas las clases anotadas con @Service Annotation of the Class-> <Context: Component-scan Base-Package = "me.gacl.service" /> < /beans>
La configuración de nuestro archivo Spring.xml es muy simple, solo hay dos configuraciones.
3. Spring-mybatis.xml (archivo de configuración integrado con Spring y MyBatis)
Cree un archivo Spring-Mybatis.xml en el directorio SRC/Main/Resources. El archivo Spring-Mybatis.xml es un archivo de configuración escrito para la integración de Spring Framework y MyBatis Framework. El contenido de Spring-Mybatis.xml es el siguiente:
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation http://www.springframework.org/schema/Beans/spring-Beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> < id = "DataSource"> <Property name = "jndiname" value = "$ {jndiname}"> </property> </bean>-> <!- ============================================================= ============================================================= ============================================================= ============================================================== ============================================================= ============================================================== ============================================================= ============================================================== name = "username" value = "$ {jdbc_username}" /> <propiedad name = "contraseña" value = "$ {jdbc_password}" /> <!-Inicializar el tamaño de conexión-> <Property Name = "InitialSize" Value = "0" /> <!-Máximo de las conexiones utilizadas por el grupo de conexión-> <Nombre de propiedad = "MAXACTIVE" Value "Value" 20 "20" connections free --> <property name="maxIdle" value="20" /> <!-- Minimum number of connections free --> <property name="minIdle" value="0" /> <!-- Get the maximum waiting time for connections--> <property name="maxWait" value="60000" /> <!-- <property name="poolPreparedStatements" value="true" /> <property name = "maxPoolPreparedStatEmentPonConnectionsize" value = "33" /> -> <Property name = "ValidationQuery" value = "$ {ValidationQuery}" /> <Property Name = "testOnBorrow" valor = "false" /> <Property name = "testonBorrow" value = "false" /> <name de la propiedad = "testonreturn" value = "false" /<> <> <> <>> <sperty "testEdle" testEdle " value="true" /> <!-- Configure how long it takes to perform a detection interval to detect the idle connection that needs to be closed, in milliseconds --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- Configure the minimum time for a connection to survive in the pool, in milliseconds --> <property name="minEvictableIdleTimeMillis" value = "25200000" /> <!-activar la función de removeAbandoned-> <propiedad name = "removeAbaBaBaLEd" value = "true" /> <!-1800 segundos, es decir, 30 minutos-> <Property name = "removeAbaBaBaBaBaUnEdTimeOut" valor = "1800" /> <!-Error de salida LOG Base de datos-> <!-<Property Name = "Filters" Value = "STAT" />-> <Property Name = "Filters" Value = "Mergestat" /> < /Bean> <!- ==================================================================================================================================================================================================================================================================================================. ========================================================================================================== ========================================================================================================== ========================================================================================================== ================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== Guardar el valor de configuración manual = "classpath: me/gacl/mapping/*. Xml" en configuration.xml se refiere a todos los archivos XML en el paquete me.gacl.mapping en classpath (classpath) en usermapper.xml se encuentra en el paquete de me.gacl.mapping, por lo que ese USERMAPPER.xMLL puede ser automáticamente sanneded sanneded -n. value = "classpath: me/gacl/mapping/*. xml"/> </bean> <!-escáner de configuración-> <ruye> <!-escanea el paquete me.gacl.dao y todas las clases de interfaz de asignación en su subpackage-> <name de propiedad = "Basepackage" value = "me.gacl.dao"/> <name de propiedad = "sqlsessession" value = "SQLSessionFactory" /> < /bean> <!- ============================================================= ============================================================= ============================================================= ============================================================= ============================================================= ============================================================= ============================================================= ============================================================== Transaction-Manager = "TransActionManager" />-> <!-Configuración del interceptor-> <tx: consejo id = "transaccionAdVice" transaction-manager = "transaccionManager"> <tx: atributes> <tx: método name = "add*" propagation = "requerido" /> <tx: método name = "append*" propagation = "requerido" /> <tx: name = "insertar" "" "". propagation = "requerido" /> <tx: método name = "salvar*" propagation = "requerido" /> <tx: name = "update*" propagation = "requerido" /> <tx: método name = "modificar*" propagation = "requerido" /> <tx: método name = "editar*" propagation = "requerido" /> <tx: método name = "delete*" propagation "propagation" name = "remove*" propagation = "requirido" /> <tx: método name = "reparar" propagation = "requerido" /> <tx: método name = "delandrepair" propagation = "requerido" /> <tx: name = "delandrepair" propagation = "requerido" /> <tx: name de método = "get*" propagation = "admite" /> <tx: name*"encontrar*" encontrar*"encontrar*" encontrar*"encontrar" "encontrar" "encontrar" "encontrar" "encontrar" "encontrar" "encontrar" "encontrar" "encontrar" "encontrar" "encontrar" "encontrar". propagation = "admite" /> <tx: método name = "load*" propagation = "admite" /> <tx: name = "search*" propagation = "admite" /> <tx: método name = "dataGrid*" propagation = "admite" /> <tx: método name = "*" propagation = "admite" /> <tx: name = "*"*"*" propagation " </tx: atributes> </tx: consejo> <aop: config> <aop: pointCut id = "transaccionPointCut" Expression = "Ejecution (*me.gacl.service ..*impl.*(..))"/> <aop: asesor pointcut-ref = "transaccionPointcut" access-ref = "transaccionAdvice"/> </aOp: Configure SPRIGURE SPRIGURE jdbc-> <bean id = "druid-stat-interceptor"> </bean> <bean id = "druid-sat-pintcut" scope = "prototype"> <propiedad name = "patrones"> <list> <valor> me.gacl.service.*</valor> </list> </propiedad> </ bean> <aop: config> <aop: asesor: asesor. consejo-ref = "Druid-Stat-Interceptor" PointCut-Ref = "Druid-Stat-PointCut"/> </aop: config> </strans>En este punto, se han escrito los archivos de configuración relevantes, como se muestra en la figura a continuación:
4.3. Realizar pruebas unitarias
Después de los dos pasos anteriores, se ha completado la integración de Spring 4 y MyBatis3. La siguiente tarea que debemos hacer es realizar pruebas unitarias para probar si la integración de Spring4 y MyBatis3 es exitosa.
1. Cree un paquete ME.GACL.Service en el directorio SRC/Main/Java, y luego cree una interfaz UserServicei en el paquete Me.Gacl.Service, como se muestra a continuación:
paquete me.gacl.service; importame.gacl.domain.user; Interfaz pública UserServicei { / *** Agregar usuario* @param user* / void adduser (usuario de usuario); / ** * Obtenga el usuario en función de la ID de usuario * @param UserId * @return */ user getUserByid (string userId); }2. Cree un paquete me.gacl.service.impl en el directorio src/main/java, y luego cree una clase de implementación para la interfaz UserServicei en el paquete me.gacl.service.impl: UserServiceImpl, como se muestra a continuación:
paquete me.gacl.service.impl; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.stereotype.service; import me.gacl.dao.usermapper; importame.gacl.domain.user; importame.gacl.service.userservicei; /** * @author gaCl * use @Service Annotation para anotar la clase UserServiceImpl como un servicio * La ID de servicio es UserService */@Service ("UserService") Class pública UserServiceImpl implementa UserServicei {/** * Usar anotación de @autewired para anotar el USERMapper variable cuando debe usar Usermappers de USMapper, Spring, Spring Automater * Spring automáticamente, Spring automáticamente, Spring automáticamente, Spring automáticamente, Spring automáticamente, Spring automáticamente. @AUtowired private usermapper usermapper; // inyect dao @override public void adduser (usuario de usuario) {usermapper.insert (usuario); } @Override Public User GetUserById (String UserId) {return Usermapper.SelectByPrimaryKey (userId); }}Las dos clases creadas son las siguientes:
3. Escriba una clase de prueba unitaria en el directorio SRC/Test/Java, cree un nuevo paquete ME.GACL.TEST y luego cree una clase MyBatistest en este paquete. El código es el siguiente:
paquete me.gacl.test; import java.util.date; import java.util.uuid; importame.gacl.domain.user; importame.gacl.service.userservicei; // Importarme.gacl.service.userservicei; importar org.junit.before; importar org.junit.test; importar org.springframework.context.applicationContext; importar org.springframework.context.support.classpathxmlaPplicationContext; clase pública myBatistest {private UserServicei UserService; /*** Esto antes del método se ejecuta antes de todos los métodos de prueba y solo se ejecuta una vez que* todos los trabajos de inicialización durante la prueba unitaria JUnit se pueden realizar en este método* Por ejemplo, inicializando la aplicación y el servicio de usuarios en el método anterior*/@bebefore public void antes () {// Cree contexto de primavera utilizando los dos archivos de configuración "Spring.xml" y "Spring-Mybatis.xml" Aplicación "APLICTEXT AC = Nueva ClasspathxmLapplicationContext (new String [] {"Spring.xml", "Spring-Mybatis.xml"}); // Obtener el objeto UserService que queremos usar en función de la ID de Bean del contenedor Spring UserService = (UserServicei) ac.getBean ("UserService"); } @Test public void testAdDuser () {// ApplicationContext AC = new ClassPathXMLApPlicationContext (new String [] {"Spring.xml", "Spring-Mybatis.xml"}); // UserServiceI UserService = (UserServicei) AC.getBean ("UserService"); Usuario user = nuevo usuario (); user.setUserId (uuid.randomuuid (). toString (). reemplazar ("-", "")); user.setUsername ("White Tiger Dios Emperador XDP"); user.setUserBirthday (nueva fecha ()); user.setUsersalary (d); UserService.adduser (usuario); }}Al ejecutar el código de prueba unitario, se informará el siguiente error:
El mensaje de error es que no se encontró la clase "me.gacl.test.mybatistest", porque no usamos Maven para compilar la clase en el proyecto.
A continuación, usamos Maven para compilar el proyecto, seleccione el archivo pom.xml del proyecto → 【depuración como】 → 【instalación maven】, como se muestra a continuación:
Los resultados de la compilación son los siguientes:
Aquí hablaré sobre los problemas que encontré después de ejecutar la instalación de Maven. Cuando ejecuté por primera vez el comando de instalación Maven, vi los siguientes errores desordenados:
Más tarde, eliminé el proyecto, volví a importar el proyecto y luego ejecuté la operación limpia del proyecto, como se muestra en la siguiente figura:
Puedo compilarlo y pasarlo normalmente después de ejecutar la operación de instalación de Maven, lo que me deprimió durante mucho tiempo. Esta no debería ser la razón de la configuración de mi proyecto, sino la razón de Maven. No sé por qué este es el caso. De todos modos, esta es una solución. Si se encuentra con una situación en la que la operación de instalación de Maven no se puede compilar normalmente: puede intentar usar los tres pasos: Maven Clean → Clean Project → Instalar Maven para resolver el problema.
Además de las pruebas unitarias con JUnit regular, también podemos usar el marco de prueba JUnit proporcionado por Spring para pruebas unitarias, y crear una nueva clase MyBatistestBySpringTestFramework bajo yo.gacl.test, con el código de la siguiente manera:
paquete me.gacl.test; import java.util.date; import java.util.uuid; importame.gacl.domain.user; importame.gacl.service.userservicei; importar org.junit.test; importar org.junit.runner.runwith; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.test.context.contextConfiguration; importar org.springframework.test.context.junit.springjunitclassrunner; @RunWith (SpringJunitClassRunner.class) // después de la anotación de @ContextConfiguration está y el atributo de ubicaciones de la anotación se especifica con el archivo Spring y Configuración, @ContextConfiguration (ubicaciones = {"Classpath: Spring.xml", "Classpath: Spring-Mybatis.xml"}) MyBatistestBySpringTestFramework {// inyect UserService @aUtowired private UserServicei UserService; @Test public void testAdDuser () {user user = new user (); user.setUserId (uuid.randomuuid (). toString (). reemplazar ("-", "")); user.setUsername ("xdp_gacl_white tiger dios emperador"); user.setUserBirthday (nueva fecha ()); user.setUsersalary (d); UserService.adduser (usuario); } @Test public void testgetuserById () {string userId = "fbcebfdada"; Usuario usuario = UserService.GetUserById (UserId); System.out.println (user.getUsername ()); }}Realice estos dos métodos de prueba y pase la prueba normal, como se muestra a continuación:
到此,我们框架的整合测试工作就算是全部通过了,整合成功。
4.4、在web服务器中进行测试
1、编辑web.xml文件,添加spring监听器配置项,内容如下:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <description>Spring监听器</description> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- ContextLoaderListener初始化Spring上下文时需要使用到的contextConfigLocation参数--> <context-param> <param-name>contextConfigLocation</param-name> <!-- 配置spring.xml和spring-mybatis.xml这两个配置文件的位置,固定写法--> <param-value>classpath:spring.xml,classpath:spring-mybatis.xml</param-value> </context-param></web-app>
2、在UserMapper接口中添加一个获取所有用户信息的getAllUser()方法,如下所示:
package me.gacl.dao; import java.util.List; import me.gacl.domain.User; public interface UserMapper { int deleteByPrimaryKey(String userId); int insert(User record); int insertSelective(User record); User selectByPrimaryKey(String userId); int updateByPrimaryKeySelective(User record); int updateByPrimaryKey(User record); /**Get all user information* @return List<User> */ List<User> getAllUser(); }3、在UserMapper.xml文件中编写getAllUser()方法要执行的SQL语句,如下所示:
<?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="me.gacl.dao.UserMapper" > <resultMap id="BaseResultMap" type="me.gacl.domain.User" > <id column="user_id" property="userId" jdbcType="CHAR" /> <result column="user_name" property="userName" jdbcType="VARCHAR" /> <result column="user_birthday" property="userBirthday" jdbcType="DATE" /> <result column="user_salary" property="userSalary" jdbcType="DOUBLE" /> </resultMap> <sql id="Base_Column_List" > user_id, user_name, user_birthday, user_salary </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" > select <include refid="Base_Column_List" /> from t_user where user_id = #{userId,jdbcType=CHAR} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.String" > delete from t_user where user_id = #{userId,jdbcType=CHAR} </delete> <insert id="insert" parameterType="me.gacl.domain.User" > insert into t_user (user_id, user_name, user_birthday, user_salary) values (#{userId,jdbcType=CHAR}, #{userName,jdbcType=VARCHAR}, #{userBirthday,jdbcType=DATE}, #{userSalary,jdbcType=DOUBLE}) </insert> <insert id="insertSelective" parameterType="me.gacl.domain.User" > insert into t_user <trim prefix="(" suffix=")" suffixOverrides="," > <if test="userId != null" > user_id, </if> <if test="userName != null" > user_name, </if> <if test="userBirthday != null" > user_birthday, </if> <if test="userSalary != null" > user_salary, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="userId != null" > #{userId,jdbcType=CHAR}, </if> <if test="userName != null" > #{userName,jdbcType=VARCHAR}, </if> <if test="userBirthday != null" > #{userBirthday,jdbcType=DATE}, </if> <if test="userSalary != null" > #{userSalary,jdbcType=DOUBLE}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="me.gacl.domain.User" > update t_user <set > <if test="userName != null" > user_name = #{userName,jdbcType=VARCHAR}, </if> <if test="userBirthday != null" > user_birthday = #{userBirthday,jdbcType=DATE}, </if> <if test="userSalary != null" > user_salary = #{userSalary,jdbcType=DOUBLE}, </if> </set> where user_id = #{userId,jdbcType=CHAR} </update> <update id="updateByPrimaryKey" parameterType="me.gacl.domain.User" > update t_user set user_name = #{userName,jdbcType=VARCHAR}, user_birthday = #{userBirthday,jdbcType=DATE}, user_salary = #{userSalary,jdbcType=DOUBLE} where user_id = #{userId,jdbcType=CHAR} </update> <!-- ==============以下内容是根据自身业务扩展的内容======================= --> <!-- select标签的id属性与UserMapper接口中定义的getAllUser方法要一模一样--> <select id="getAllUser" resultMap="BaseResultMap"> select user_id, user_name, user_birthday, user_salary from t_user </select></mapper>4、在UserServiceI接口中也添加一个getAllUser()方法,如下:
package me.gacl.service; import java.util.List; import me.gacl.domain.User; public interface UserServiceI { /** * Add user* @param user */ void addUser(User user); /** * Get user based on user id* @param userId * @return */ User getUserById(String userId); /** Get all user information* @return List<User> */ List<User> getAllUser(); }5、在UserServiceImpl类中实现getAllUser方法,如下:
package me.gacl.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import me.gacl.dao.UserMapper; import me.gacl.domain.User; import me.gacl.service.UserServiceI; /** * @author gacl * 使用@Service注解将UserServiceImpl类标注为一个service * service的id是userService */ @Service("userService") public class UserServiceImpl implements UserServiceI { /** * 使用@Autowired注解标注userMapper变量, * 当需要使用UserMapper时,Spring就会自动注入UserMapper */ @Autowired private UserMapper userMapper;//注入dao @Override public void addUser(User user) { userMapper.insert(user); } @Override public User getUserById(String userId) { return userMapper.selectByPrimaryKey(userId); } @Override public List<User> getAllUser() { return userMapper.getAllUser(); } }6、在src/main/java目录下创建一个me.gacl.web.controller包,然后在me.gacl.web.controller下创建一个UserServlet,如下:
package me.gacl.web.controller; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import me.gacl.domain.User; import me.gacl.service.UserServiceI; /** * @author gacl * @WebServlet是Servlet.提供的注解,目的是将一个继承了HttpServlet类的普通java类标注为一个Servlet * UserServlet使用了@WebServlet标注之后,就不需要在web.xml中配置了*/ @WebServlet("/UserServlet") public class UserServlet extends HttpServlet { //处理业务逻辑的userService private UserServiceI userService; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取所有的用户信息List<User> lstUsers = userService.getAllUser(); request.setAttribute("lstUsers", lstUsers); request.getRequestDispatcher("/index.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } public void init() throws ServletException { //在Servlet初始化时获取Spring上下文对象(ApplicationContext) ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); //从ApplicationContext中获取userService userService = (UserServiceI) ac.getBean("userService"); } }7、编辑index.jsp页面,用于展示查询到的用户信息,内容如下:
<%@ page language="java" pageEncoding="UTF-8"%><%--引入JSTL核心标签库--%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPE html><html> <head> <title>显示用户信息</title> <style type="text/css"> table,td{ border: 1px solid; border-collapse: collapse; } </style> </head> <body> <table> <tr> <td>用户ID</td> <td>用户名</td> <td>用户生日</td> <td>工资</td> </tr> <%--遍历lstUsers集合中的User对象--%> <c:forEach var="user" items="${lstUsers}"> <tr> <td>${user.userId}</td> <td>${user.userName}</td> <td>${user.userBirthday}</td> <td>${user.userSalary}</td> </tr> </c:forEach> </table> </body></html>8、执行maven install命令编译项目,然后将项目部署到tomcat服务器中运行,注意,由于要使用Servlet3.0,所以必须将项目部署到tomcat7.x以上的服务器中去运行,如下所示:
输入地址:http://localhost:8080/spring4-mybatis3/UserServlet访问UserServlet,访问结果如下:
可以看到,t_user表中的用户信息全部查询出来显示到页面上了。这样在web服务器中的测试也正常通过了。
以上就是Spring4.x与MyBatis3.x整合的全部内容了。编写这个整合例子花了不少时间,使用Maven编译时总是出现莫名其妙的问题,有时候成功,有时候失败,反正很莫名其妙。如果遇到执行Maven install操作不能正常编译通过的情况:可以尝试采用:Maven clean→Clean项目→Maven install这三个步骤去解决问题