1. Construa um ambiente de desenvolvimento
1.1. Crie um projeto da web com maven
Execute o seguinte comando:
Copie o código da seguinte
Como mostrado na figura abaixo:
O projeto criado é o seguinte:
Editar o arquivo pom.xml
<Projeto xmlns = "http://maven.apache.org/pom/ .." xmlns: xsi = "http://www.w.org//xmlschema-innstance" xsi: esquemalocação " http://maven.apache.org/maven-v__.xsd "> <modelMaversion> .. </modelVersion> <puperid> me.gacl </groupid> </artifactId> spring-mybatis </artifactId> <ningaging> war </packaging> <syeryn>. <url> http://maven.apache.org </url> <pendências> <pendency> <puperid> junit </groupiD> <TRAFACTID> JUNIT </ArtifactId> <BUIRDENS> </Version> Spring-M Spring-M Spring-M Spring-M Springm
Modifique a seção <name> spring4-mybatis3 maven webApp </name> e remova o conteúdo que contém espaços no "Maven WebApp". Caso contrário, quando o Maven compilar o projeto, alguns erros inexplicáveis ocorrerão devido a espaços e os modificará para: <name> spring4-mybatis3 </name> .
Além disso, exclua o seguinte:
<Depencency> <voundid> junit </frugiD> <stifactId> junit </stifactId> <versão> .. </versão> <cope> teste </cope> </pendence>
Esta parte é as informações de dependência do pacote JAR do JUNIT. Esta versão é muito baixa. Não usamos esta versão de teste JUNIT. O conteúdo Pom.xml modificado é o seguinte:
<Projeto xmlns = "http://maven.apache.org/pom/ .." xmlns: xsi = "http://www.w.org//xmlschema-innstance" xsi: esquemalocação " http://maven.apache.org/maven-v__.xsd "> <modelMaversion> .. </modelVersion> <voundid> me.gacl </groupiD> </ArtifactId> spring-mybatis </sutifactid> <backaging> war </packaging> <lingeryyyyyytny-sybatis </versão </stifactId> <backagaging> <sprackagaging> <erpray>. <url> http://maven.apache.org </url> <pendes> </dependências> <fuild> <finname> spring-mybatis </fallname> </fruct> </project>
1.2. Importar o projeto criado para o myeclipse
As etapas de operação específicas são mostradas na figura abaixo:
Crie manualmente três pastas de origem: [src/main/java], [src/test/recursos] e [src/test/java], como mostrado na figura abaixo:
Neste ponto, todo o trabalho de construção do projeto foi concluído.
2. Crie bancos de dados e tabelas (para MySQL)
O script SQL é o seguinte:
Crie banco de dados spring4_mybatis3; use spring4_mybatis3; tabela soltada se existe t_user; crie tabela t_user (user_id char (32) não nulo, user_name varchar (30) null null (userthday date);
O banco de dados e a tabela criados são os seguintes:
3. Use a ferramenta geradora para gerar código
Encontrei uma ferramenta de gerador on -line que pode gerar classes de entidade, arquivos de mapeamento SQL e DAO correspondentes à tabela Mybatis com base na tabela de banco de dados criada e encontre o arquivo generator.xml no diretório raiz da ferramenta gerador. Este arquivo é usado para configurar as regras de geração de código, conforme mostrado na figura abaixo:
Edite o arquivo gerador.xml, o conteúdo é o seguinte:
<? xml versão = "." Encoding = "Utf-"?> <! localização = "e:/repository/mysql/mysql-conector-java /../ mysql-conector-java -... jar"/> <!-<ClassPathentry Location = "c:/oracle/produto /../ db_/jdbc/lib/ojdbc.Jar/>-> <xectlent Id =" <EMPEGGERATER> <propriedade name = "supressorlcomments" value = "true"/> </commentGenerator> <!-Link do banco de dados URL, nome de usuário, senha-> <jdbcconnection driverclass = "com.mysql.jdbc.driver" ConnectionRl = "jiBC: mySql: // Localhbc.driver" senha = "xdp"> <!-<jdbcconnection driverclass = "oracle.jdbc.driver.oracledriver" Connectionurl = "jdbc: oracle: thin: @locAlHost :: orcl" userID = "msa" senha = "msa">-> </jdcconnection> <javater " value = "false" /> < /javatyperesolver> <!- Gere o nome do pacote e o local da classe de entidade. Aqui a classe de entidade gerada é colocada no pacote me.gacl.domain-> <JavamodelGenerator TargetPackage = "me.gacl.domain" TargetProject = "C:/Users/gacl/spring-mybatis/src/main/java" <nome da propriedade = "EnablesubPackages" "" Nome da propriedade = "ENFABLESBPACAGES" </javamodelGenerator> <!- O nome e o local do pacote de arquivo do mapa SQL gerado. Aqui, coloque o arquivo de mapa SQL gerado no pacote me.gacl.mapping-> <sqlmapgenerator TargetPackage = "me.gacl.mapping" TargetProject = "c:/users/gacl/spring-mybatis/src/main/java"> <nome da propriedade = "enableQlqages" Nome e localização do DAO. Aqui, coloque a classe DAO gerada no pacote me.gacl.dao-> <javaclientGenerator type = "xmlmapper" TargetPackage = "me.gacl.dao" TargetProject = "C:/Users/gacl/spring-mybats/src/main/java"> <Names < /javaclientGenerator> <!-Para gerar essas tabelas (altere o nome do quadro e domainObjectName)-> <tabela tablename = "t_user" domainObjectName = "user" enableCountByExample = "falseLect" eNableUpDateByByBySample = "false" (FalseLeTyByExample = "falsEl". </context> </eratoratorConfiguration>
Abra a janela da linha de comando, mude para o diretório raiz da ferramenta do gerador e execute o seguinte comando:
java -Jar mybatis- -core -core -1.3.2.jar -configfile generator.xml -OverWrite
Como mostrado na figura abaixo:
Agora, configuramos o arquivo de código gerado e o arquivo de mapeamento SQL no arquivo generator.xml para colocar o código gerado e o arquivo de mapeamento SQL no diretório "c:/users/gacl/spring4-mybatis3/src/main/java". Este diretório é o diretório em que nosso projeto Spring4-Mybatis3 está localizado. Atualizamos o diretório SRC/Main/Java e você pode ver o código gerado e o arquivo de mapeamento, conforme mostrado na figura abaixo:
O código gerado e o arquivo de mapeamento não precisam ser alterados em uma linha e podem ser aplicados diretamente ao projeto. Vamos dar uma olhada nos arquivos de código e mapeamento gerados pela ferramenta Gerador:
1. Classe Dao gerada
pacote me.gacl.dao; importar me.gacl.domain.user; interface pública UserMApper {int DeLeteByPrimaryKey (String userID); int insert (registro do usuário); int insertSelective (registro do usuário); Usuário SelectByPrimaryKey (String UserID); int updateByPrimaryKey (registro do usuário); }O UserMApper gerado é uma interface que define alguns métodos para adicionar, excluir, modificar e pesquisar a tabela T_USER.
2. A classe de entidade gerada
pacote me.gacl.Domain; importar java.util.date; Public class Usuário {private String UserID; Nome de usuário privado de string; Data privada Usuário Birthday; Salário duplo privado; public String getUserId () {return userID; } public void setUserID (string userID) {this.UserID = userID == null? null: userID.Trim (); } public string getUserName () {return userName; } public void setUserName (string userName) {this.username = nome de usuário == null? nulo: nome de usuário.trim (); } data pública getUserbirthday () {return userBirthday; } public void setUserbirthday (data userBirthday) {this.Userbirthday = userBirthday; } public duplo getUserSalary () {return usersalary; } public void setUserSalary (duplo usuáriosSalary) {this.UserSalary = Usersalary; }}A classe de usuário é a classe de entidade correspondente da tabela T_USER. Os atributos definidos na classe de usuário correspondem aos campos na tabela T_USERE por um.
3. Arquivo de mapeamento SQL gerado
<? xml versão = "." Encoding = "utf-"?> <! type = "me.gacl.domain.user"> <id column = "user_id" propriedade = "userID" jdbctype = "char" /> <resultado column = "user_name" property = "username" jdbctype = "varchar" /> <resultado column = "user_birthday" " column = "user_salary" propriedade = "ususersalary" jdbctype = "double"/> </resultMap> <sql id = "base_column_list"> user_id, user_name, user_birthday, user_salary </sql> <select id = "selectbyPrimarykey "Map, resulte,", "," seletByPriMaryMapyMapyMap, "Basalary </sql> <select ID =" SelectByPrimaryKey "Map, resulte "MertHyMap = User_Salary </sql> <select =" SelectByPrimaryKey "Map, " ParameterType = "java.lang.string"> selecione <incluir refid = "base_column_list" /> de t_user onde user_id = #{userId, jdbctype = char} < /select> <delete id = "DeLeteByPrimaryKey" ParameterType = "java.lanng.nang.nstring.nstring.nstring.nstring.nstring.nstring.nstring.nstring.nstring.nstring.nstring.string" #{userID, jdbctype = char} </lete> <insert id = "insert" parametertype = "me.gacl.domain.user"> inserir em t_user (user_id, user_name, user_birthday, user_salary), valores ( #{{{{ #{nome de usuário, jdbctype = varchar}, #{userBirthday, jdbctype = date}, #{usersalary, jdbctype = duplo}) </insert> <insert id = "insertSelection" parameterType = "me.gacl.domain.ernert"> " sufixoverrides = ","> <if test = "userId! = null"> user_id, </if> <se test = "nome de usuário! = null"> user_name, </if> <se test = "userBirThday! = null"> user_birthday, </se> <se test = "UserTay! ("Suffix =") "sufixoverrides =", "> <se test =" userId! = Null "> #{userID, jdbctype = char}, </if> <if test =" username! = Null "> #{username, jdbctype = varchar}, </se> <se> <fest" #{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 = "nome de usuário! = null"> user_name = #{nome de usuário, jdbctype = varchar}, </if> <se test = "userBirthday! = null"> user_birthday = #{userBirthday, jdbctype = date}, </se> <fSt = {userBirthday, Jdbctype = date}, </se> <se #{usersalary, jdbctype = duplo}, </if> </set> where user_id = #{userID, jdbctype = char} </update> <update id = "updateByPrimaryKey" parametertype = "me.gacl.domer.user"> update t_user star user_Near_Near_Near_Name = user_birthday = #{userBirthday, jdbctype = date}, user_salary = #{usersalary, jdbctype = double} onde user_id = #{userID, jdbctype = char} </atualizeO conteúdo do arquivo UserMApper.xml é escrever instruções SQL que operam a tabela T_USER. Vamos nos concentrar em alguns pequenos detalhes que precisam receber atenção na configuração UserMApper.xml:
1. O espaço para nome da tag <papper> de UserMApper.xml deve ser o nome completo da classe da interface UserMApper, isto é, <mapeador namespace = "me.gacl.dao.usermapper">
2. Definição UserMApper.xml O valor do atributo ID do banco de dados de operação deve ser consistente com o nome do método definido pela interface UserMApper, como mostrado na figura abaixo:
O motivo dos dois requisitos acima é que o MYBATIS pode implementar automaticamente os métodos relevantes definidos na interface UserMApper com base na interface UserMApper e no arquivo UserMApper.xml, para que não precisemos mais escrever um código de implementação específico para a interface UserMApper.
4. Integração de primavera e mybatis
Primeiro, precisamos adicionar os pacotes JAR relevantes necessários ao projeto. Podemos ir ao repositório central do MAVEN: http://search.maven.org/ para encontrar os pacotes de jar relevantes que queremos, como mostrado na figura a seguir:
Só precisamos inserir o nome do pacote JAR que estamos procurando na caixa de pesquisa e clicar no botão [Pesquisar] para encontrar o pacote JAR que estamos procurando.
4.1. Adicionar pacotes de jar da primavera e mybatis
1. Adicione o núcleo da mola, digite a palavra-chave do núcleo da mola para pesquisar, conforme mostrado na figura abaixo:
Encontre as informações de descrição de dependência sobre o núcleo de mola, conforme mostrado na figura a seguir:
Vai
<Depencency> <GrupidId> org.springframework </frugiD> <ArtifactId> Spring-core </ArtifactId> <versão> 4.1.4.release </sipers> </dependency>
Copie o arquivo pom.xml do projeto da seguinte forma:
<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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>me.gacl</groupId> <artifactId>spring4-mybatis3</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name> spring4-mybatis3 </name> <url> http://maven.apache.org </url> <pendences> <!-Adicione Spring4.1.4 Core Package-> dependency> <purfactor> org.springframework </groupid> <TifactId> </core </cotfactId> </dependences> <build> <finname> spring4-mybatis3 </finalName> </fuild> </project>
Dessa forma, o MAVEN nos ajudará automaticamente a baixar o pacote JAR do núcleo de primavera do repositório central do Maven ao nosso repositório local e, em seguida, adicionar o pacote JAR de núcleo de mola e suas dependências relacionadas ao nosso projeto, como mostrado abaixo:
Os pacotes JAR relacionados exigidos por Spring4.x e mybatis3.x podem ser pesquisados no método acima e depois adicionados ao projeto. Depois de adicionar os pacotes JAR relacionados relacionados a Spring4.x e mybatis3.x, o conteúdo do arquivo pom.xml é finalmente o seguinte:
<Projeto xmlns = "http://maven.apache.org/pom/ .." xmlns: xsi = "http://www.w.org//xmlschema-innstance" xsi: esquemalocação " http://maven.apache.org/maven-v__.xsd "> <modelMaversion> .. </modelVersion> <voundid> me.gacl </groupiD> </ArtifactId> spring-mybatis </sutifactid> <backaging> war </packaging> <lingeryyyyyytny-sybatis </versão </stifactId> <backagaging> <sprackagaging> <erpray>. <url> http://maven.apache.org </url> <pendências> <!-Adicione o pacote de coro de primavera-> <pendência> <puperid> org.springframework </fuidid> </dependência> spring-core </stifactId> <versão> </siply> </dependência> <! <PuerpId> org.springframework </frupid> <stifactId> Spring-Context </ArtifactId> <versão> ... Release </versão> </dependency> <!-Adicione Spring-TX Package-> <sipeDency> <sussion> org.springframewil pacote spring-jdbc-> <pendency> <puperiD> org.springframework </groupiD> <TRAFACTID> spring-jdbc </artifactId> <versão> ... liberação </versão </dependency> <!-adicione spring-jdbc package-> <pendência> <purbrougd> org.springframework </springId </springId </springId </springId art. <Version> ... Liberação </seriStle> </dependency> <!-Para facilitar o teste de unidade, adicione o pacote de teste de mola-> <Depency> <PuerpId> org.springframework </groupid> </ArtifactId> spring-test </sutifactId> <berder> ... Release </sipery> </dependency> <!-Add-wid-weby Package-> <TRAFACTID> Spring-web </stutifactId> <versão> ... Release </sipers> </dependency> <!-Adicione Pacote de Aspecimentos de Aspecção-> <Dependency> <GrupidId> org.aspectj </groupid> </dependence> <! <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> <!-Adicionar servlet.core package-> <pendency> <puperiD> javax.servlet </groupiD> <TRORFACTID> javax.servlet-api </artifactId> <versão> .. </version> </dependency> <pendency> <voupid> javax.servlet.jsp </grupo> <burftid> <versão> ..- b </siers> </dependency> <!-jstl-> <pendence> <puperid> javax.servlet </groupiD> <TRARFACTID> jstl </artifactId> <sietrecy>. </sipers> </dependency> <!-Add MySQL Driver Package-> <Peepence> <Grueid> <TarifactId> mysql-conector-java </stifactId> <versão> .. </versão> </dependency> <!-Adicione o pacote do pool de conexão druida-> <pendency> <puridId> com.alibaba </groupid> <stifactId> druid </artifactid> <ipers->-</versão> </dependência> </dependência> </dependência>! <GrupidId> Junit </proupid> <TRAFACTID> Junit </starfactId> <versão>. </version> <cope> test </copo> </pendesicency> </dependences> <fuild> <finallName> spring-mybatis </finalname> </build> </project>
4.2. Escreva arquivos de configuração relevantes
1. Dbconfig.properties
Crie um arquivo dbconfig.properties no diretório SRC/Main/Recursos para escrever informações relevantes sobre a conexão com o banco de dados MySQL. O conteúdo de dbconfig.properties é o seguinte:
driverclassName = com.mysql.jdbc.driverValidationQuery = selecione 1jdbc_url = jdbc: mysql: // localhost: 3306/spring4_mybatis3? Useunicode = true & caracterizador = utf-8 & zerodateTimebehavior = converttonulljdbc_username = rootjdbc_password = xdp
2. Spring.xml (arquivo de configuração da estrutura da mola)
Crie um arquivo spring.xml no diretório SRC/Main/Recursos. O arquivo spring.xml é o arquivo de configuração do núcleo gravado para a estrutura da mola. O conteúdo do spring.xml é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beanshttp://www.springframework.org/sche ma/beans/spring-beans-3.0.xsdhttp: //www.springframework.org/schema/context/spring-context-3.0.xsd "> <!-Introduce dbconfig.properties Propriedade Arquivo-> <Contexto: Property-placeholder Location = "ClassPath: dbconfig.properties" /> <!-Introduce DBConfig.Properties Property File-> <! Pacote e todas as classes anotadas com a anotação @Service da classe-> <Contexto: componente-Scan-Package = "me.gacl.service" /> </ Beans>
A configuração do nosso arquivo spring.xml é muito simples, existem apenas duas configurações.
3. Spring-mybatis.xml (arquivo de configuração integrado ao Spring e Mybatis)
Crie um arquivo Spring-mybatis.xml no diretório SRC/Main/Recursos. O arquivo spring-mybatis.xml é um arquivo de configuração gravado para a integração do Spring Framework e MyBatis Framework. O conteúdo de spring-mybatis.xml é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 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-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/aop/aop/spring-a--3.0.xsdworks " <bean id = "DataSource"> <propriedade name = "jndiname" value = "$ {jndiname}"> </property> </bean>-> <!- ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== name = "nome de usuário" value = "$ {jdbc_username}" /> <propriedade name = "senha" value = "$ {jdbc_password}" /> <!-inicialize o tamanho da conexão-> <propriedades name = "inicialsize" = "0" /> <!-máximo de conexões usadas pelo pool de conexão-> <! livre-> <propriedade name = "maxidle" value = "20" /> <!-Número mínimo de conexões grátis-> <propriedade name = "minidle" value = "0" /> <!-Obtenha o tempo de espera máximo para conexões-> <propriedades name = "maxwait" value = "60000" /> <!-<weead) name = "maxpoolPreparedStatementPerConnectionize" value = "33" /> -> <propriedade name = "validationQuery" value = "$ {validationQuery}" /> <names name = "testOnBorrow" value = "false" /> <nome da propriedade = "TestOnBorRow" = "false> <> <nome" /"name" /"Falsen" /> <nome da propriedade "=" /" /" /" /> <burson" e "name" /" /" /" /" name " /"). value = "true" /> <!-Configure quanto tempo leva para realizar um intervalo de detecção para detectar a conexão ociosa que precisa ser fechada, em milissegundos-> <propriedade name = "timebetweenEvictionRunSmillis" value = "60000" /> <!-Configure o tempo mínimo para uma conexão para sobreviver no pool. Value = "25200000" /> <!-Ligue a função removeabandon-> <Nome da propriedade = "Removeabandon" value = "true" /> <!-1800 segundos, ou seja, 30 minutos-> <Nome da propriedade "RemoveaBaDonedTimeout" Value = "1800" /> <!-Erro de saída ao fechar a conexão "abandonada-> -> <!-<Property name = "filters" value = "stat" />-> <propriedade name = "filters" value = "mergestat" /> < /bean> <!- ========================================================================================================= ========================================================================================================== ========================================================================================================== ========================================================================================================== ================================================================= ================================================================== ================================================================== ================================================================== ================================================================== ================================================================== ================================================================== ================================================================== Salvar o valor da configuração manual = "ClassPath: Me/gacl/mapeamento/*. Xml" em Configuration.xml refere -se a todos os arquivos XML no pacote me.gacl.Mapping em ClassPath (ClassPath) no pacote de nomes (UsermApper.xml está localizado no me.gacl.Mappating, que é o pacote de mapeamento, que), que é o pacote de mapeamento). value = "ClassPath: Me/gacl/mapeamento/*. xml"/> </i bean> <!-Scanner de configuração-> <Bean> <!-Digitalize o pacote me.gacl.dao e todas as classes de interface de mapeamento em sua subpackage-> <nome da propriedade "/basepackage" value = "me.gacl.ancl.a" name = "sqlSessionFactoryBeanName" value = "sqlSessionFactory" /> </i bean> <!- ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== ============================================================== transação-manager = "transactionManager" />-> <!-Configuração do interceptador-> <tx: conselhos id = "transactionAdvice" transação-manager = "transactionManager"> <tx: atributes> <tx: name do método*add*"propagation =" " /> <Tx: methodEn:" Append*"propagação*" propagação "" " /> <T. <T. propagação = "requerir" /> <tx: método name = "save*" propagation = "requerir" /> <tx: método name = "update*" propagation = "requerir" /> <tx: name do método = "modify*" propagation = "requerir" /> <tx: método = "edit*" propagação "" /> <tx ":" /> <tx: método = "edit*" propagation = "requery" /> <t name = "Remover*" propagation "propagation =" requerido " /> <tx: name do método =" delandrepair "propagação =" requerido " /> <tx: método name =" delandrepair "propagação =" requerir " /> <Tx: métod Name =" get*"propagação" " propagation = "suporta" /> <tx: método name = "load*" propagation = "supports" /> <tx: name = "search*" propagation = "suporta" /> <tx: método name = "datagrid*suportes" /"suportes" /> <tx: name = "*" propagation = suportes " /suportes" /" </tx: atributes> </tx: conselhos> <aop: config> <aop: pointcut id = "transactionpointcut" expressão = "Execution (*me.gacl.service ..*implic.*(..))"/> <aOP: consultor pointcut-ref = "TransationPoTCUT": conselhos-refrafing = "ScrustIG) Monitoramento de druid Spring jdbc-> <bean id = "druid-stat-interceptor"> </bean> <bean id = "druid-stat-pointcut" scope = "prototype"> <nome da propriedade = "padrões"> <list> <Value> me.gacl.service. conselhos-ref = "druid-stat-interceptor" pointcut-ref = "druid-stat-pointcut"/> </aop: config> </sheans>Neste ponto, os arquivos de configuração relevantes foram escritos, conforme mostrado na figura abaixo:
4.3. Realizar testes de unidade
Após as duas etapas acima, a integração da primavera 4 e Mybatis3 foi concluída. A próxima tarefa que precisamos fazer é realizar testes de unidade para testar se a integração de Spring4 e MyBatis3 é bem -sucedida.
1. Crie um pacote me.gacl.service no diretório SRC/Main/Java e, em seguida, crie uma interface UserServicei no pacote me.gacl.service, como mostrado abaixo:
pacote me.gacl.service; importar me.gacl.domain.user; interface pública UserServicei { / *** Adicionar usuário* @param usuário* / void adduser (usuário do usuário); / ** * Obtenha o usuário com base no ID do usuário * @param userID * @return */ user getUserById (string userID); }2. Crie um pacote me.gacl.service.impl no diretório src/main/java e, em seguida, crie uma classe de implementação para a interface UserServicei no pacote me.gacl.service.impl: userServiceImpl, como mostrado abaixo:
pacote me.gacl.service.impl; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.tereotype.service; importar me.gacl.dao.userMapper; importar me.gacl.domain.user; importar me.gacl.service.userServicei; /** * @author gacl * use a anotação @service para anotar a classe UserServiceImpl como um serviço * O ID do serviço é usuários service */@Service ("UserService") Public Class UserServiceImpl implementa o Userticei * quando você usa @Autowired AnnoTation to ANSOTATIMATIMATIMAPLIATIVIDO * When When You AnoTermApperAPriceIsApperAPraPermAppers * WhenoTerMApterAppersApperAPricei * WhenoTerMPortApperAPriceIPermApperAPricei * * @Autowired Private UserMApper UserMApper; // injete Dao @Override public void adduser (usuário do usuário) {userMApper.insert (usuário); } @Override Public User GetUserById (String UserID) {return userMApper.SelectByPrimaryKey (UserID); }}As duas classes criadas são as seguintes:
3. Escreva uma classe de teste de unidade no diretório SRC/Test/Java, crie um pacote novo me.gacl.test e crie uma classe MyBatistest mais neste pacote. O código é o seguinte:
pacote me.gacl.test; importar java.util.date; importar java.util.uuid; importar me.gacl.domain.user; importar me.gacl.service.userServicei; // importar me.gacl.service.userServicei; importar org.junit.be antes; importar org.junit.test; importar org.springframework.context.ApplicationContext; importar org.springframework.context.support.classPathXMLApplicationContext; classe pública mybatistest {private UserServiceI UserService; /*** Isso antes do método ser executado antes de todos os métodos de teste e é executado apenas uma vez* Todo o trabalho de inicialização durante o teste de unidade Junit pode ser realizado neste método* Por exemplo, inicializando o ApplicationContext e UserService no método antes*/@Before Public void antes () {// Crie contexto de mola usando os dois arquivos de configuração "spring.xml" e "mira-mybats {// Crie o contexto da mola" Spring.xml "e" ClassPathXMLApplicationContext (new String [] {"spring.xml", "spring-mybatis.xml"}); // busca o objeto UserService que queremos usar com base no ID do feijão do Spring Container UserService = (UserServicei) AC.GetBean ("UserService"); } @Test public void testAddUser () {// ApplicationContext AC = novo ClassPathXMLApplicationContext (new String [] {"spring.xml", "spring-mybatis.xml"}); // UserServicei UserService = (UserServicei) AC.GetBean ("UserService"); Usuário do usuário = novo usuário (); user.setUserID (uuid.randomuuid (). tostring (). replaceall ("-", "" ")); user.setUserName ("Imperador de Deus do Tigre Branco XDP"); user.setUserbirthday (new Date ()); user.setUsersSalary (D); userService.adduser (usuário); }}Ao executar o código de teste da unidade, o seguinte erro será relatado:
A mensagem de erro é que a classe "me.gacl.test.mybatistest" não foi encontrada, porque não usamos o Maven para compilar a classe no projeto.
Em seguida, usamos o Maven para compilar o projeto, selecione o arquivo POM.XML do projeto → 【Debug como】 → 【Maven Install】, como mostrado abaixo:
Os resultados da compilação são os seguintes:
Aqui vou falar sobre os problemas que encontrei depois de executar a instalação do Maven. Quando executei pela primeira vez o comando Maven Install, vi os seguintes erros confusos:
Mais tarde, excluí o projeto, reimportei o projeto e executei a operação do projeto limpo, conforme mostrado na figura a seguir:
Eu posso compilar e passar normalmente depois de executar a operação de instalação do Maven, o que me deixou deprimido por um longo tempo. Este não deve ser o motivo da configuração do meu projeto, mas o motivo do Maven. Não sei por que esse é o caso. Enfim, esta é uma solução. Se você encontrar uma situação em que a operação de instalação do Maven não puder ser compilada normalmente: você pode tentar usar as três etapas: Maven Clean → Clean Project → Maven Install para resolver o problema.
Além dos testes de unidade com o JUNIT regular, também podemos usar a estrutura de teste Junit fornecida pela primavera para testes de unidade e criar uma nova classe MyBatistestByspringTestFramework sob me.gacl.test, com o código da seguinte maneira:
pacote me.gacl.test; importar java.util.date; importar java.util.uuid; importar me.gacl.domain.user; importar me.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) // após a anotação @ContextConfiguration é configurada e o atributo Localizações da anotação é especificado com o arquivo de configuração e configuração, @ContextConfiguration (Locations = {"Classpath: Spring.xml", "Classpath: spring: springsbats (" {"classpath: spring.xml", "Classpath: spring: springbatis (" ClassPath: "ClassPath: Spring-mybats (" Classpath: "Spring.xml", "Classpath: springbatats (" ClassPath: "ClassPath: Spring-Mybat. MybatistestByspringTestFramework {// injetar usuários Service @AUTOWIRED UserServicei UserService; @Test public void testAddUser () {usuário do usuário = new User (); user.setUserID (uuid.randomuuid (). tostring (). replaceall ("-", "" ")); user.setUserName ("xdp_gacl_white tiger deus imperador"); user.setUserbirthday (new Date ()); user.setUsersSalary (D); userService.adduser (usuário); } @Test public void testGetUserById () {String userId = "fbcebfdada"; Usuário do usuário = UserService.getUserById (UserID); System.out.println (user.getUserName ()); }}Execute esses dois métodos de teste e passe no teste normal, como mostrado abaixo:
Nesse ponto, mesmo que todos os testes de integração de nossa estrutura tenham sido aprovados, a integração foi bem -sucedida.
4.4. Teste no servidor web
1. Edite o arquivo web.xml e adicione o item de configuração do ouvinte da mola, o conteúdo é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <web-app xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http:/wwww.w3 xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" versão "3,0"> <lorde> <description>Spring listener</description> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- ContextLoaderListener to use contextConfigLocation parameters that need to be used when initializing Spring context--> <context-param> <param-name>contextConfigLocation</param-name> <!-- Configure the location of spring.xml and spring-mybatis.xml, fixed writing method--> <param-value>classpath:spring.xml,classpath:spring-mybatis.xml</param-value> </context-param></web-app>
2、在UserMapper接口中添加一个获取所有用户信息的getAllUser()方法,如下所示:
package me.gacl.dao; importar 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; importar 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; importar 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 * Use @Service annotation to annotate the UserServiceImpl class as a service * The id of the service is userService */ @Service("userService") public class UserServiceImpl implements UserServiceI { /** * Use @Autowired annotation to annotate the userMapper variable, * When you need to use UserMapper, Spring will automatically inject UserMapper */ @Autowired private UserMapper userMapper;//Inject 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; importar 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 is an annotation provided by Servlet. The purpose is to label a normal java class that inherits the HttpServlet class as a Servlet * After the UserServlet uses the @WebServlet annotation, there is no need to configure it in web.xml */ @WebServlet("/UserServlet") public class UserServlet extends HttpServlet { //UserService private UserServiceI userService; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Get all user information 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 { //Get Spring context object when Servlet initialization (ApplicationContext) ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); //Get userService from ApplicationContext 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这三个步骤去解决问题