Introdução a Mybatis
O Mybatis foi predecessorado pela IBATIS, que é uma estrutura de mapeamento relacional de persistência de dados baseada em Java (ORM).
MyBatis is an encapsulation of JDBC, allowing developers to only focus on SQL itself without spending too much effort to process JDBC procedural code such as registering drivers, setting parameters, creating Connection/Statement, parsing result sets, etc. MyBatis configures Statement based on XML/annotation, executes SQL, and maps the execution results into Java objects, greatly reducing the difficulty of Desenvolvimento de banco de dados.
O Mybatis é uma estrutura de persistência de primeira classe com suporte para SQL personalizado, procedimentos armazenados e mapeamentos avançados. Mybatis elimina quase todo o código JDBC e a configuração manual de parâmetros e recuperação de resultados. O Mybatis pode usar XML simples ou anotações para configuração e mapa primitivas, interfaces de mapa e pojos java (objetos java antigos simples) para registros de banco de dados.
Endereço do projeto mybatis/documentação online.
Primeiro conheça mybatis
O uso do mybatis requer a adição das seguintes dependências em pom.xml:
<Code> <pendency> <voupid> org.mybatis </frupidId> <TRATIFACTID> mybatis </artifactId> <versão> 3.3.0 </versão </dependency> <peDencency> <pusection> </ssql </groupid> <stifactid> mysql-conconsector-java </artiftid>
Selecione
Configure mybatis/mybatis-configuration.xml
Como o arquivo de configuração global do mybatis, ele é configurado com as informações do ambiente de execução da Mybatis (como fonte de dados/arquivo de mapeador, etc.).
<Code> <code> <!-{cke_protected} {c}%3c!%2d%2d%3fxml%20Version%3d%221,0%22%20 codificação%3d%22utf-8%22%20%3F 2D 2D 2D 3e 3e-> <figuration> id = "Desenvolvimento"> <!-{cke_protected} {c}%3c!%2d 2d%20%E9%85%8d e7%bd%aejdbc%e4%ba%8b 8b%e5%8a a1 e7%ae ae a1%e7%90%8b 8b%2%2%a1 e7%ae a1%e7%1%8B%8b%2%21%ae7%ae-a1 type = "jdbc"> <!-{cke_protected} {c}%3c!%2d%2d%20%E9%85%8d e7%bd%ae%e6%95%B0%e6%8d%ae e6%bE = 90%2d%2D 2D 3eRas-e6%e6%8d%ae e6%bace ba = 90%2d%2D 2D 3eRas-e6%e6%8d%ae e6%bace ba = 90%2d%2D 2D 3eRas-e6%e6%8d%ae e6%b. value = "com.mysql.jdbc.driver"> <propriedade name = "url" value = "jdbc: mysql: // host: port/db? caracterencoding = utf-8"> <nome da propriedade = "nome de usuário"> <nome da propriedade "senha" value = "senha"> </propriedade> </propriedade> </property> </dataSource> </transactionManager> </ambiente> </ambientes> <!-{c ke_protegted} {c}%3c!%2d%2d%20%E5%8A%a0%E8%BD%Bdmapper%E6%98%a0%E5%B0%84%E6%96%87%E4%B6%20%2d%2d 2d 31%-MAPERS <87%e4%B6%20%2d%2d 2d 3e 3 Resource = "mybatis/mapper/userdao.xml"> </mapper> </mappers> </figuration> </code>Escrevendo Userdao (mapeador)
A parte mais central dos Mybatis é configurada com instruções SQL que operam o banco de dados:
<Code> <code> <code> <!-{cke_protected} {c}%3c!%2d%2d%3fxml%20Version%3d%221,0%22%20 codificação%3d%22utf-8%22%20%3%2d 2d 2d%3e-> <namespper 22 ° ParameterType = "java.lang.integer" resultType = "com.fq.domain.user"> selecione * do usuário onde id = #{id}; </select> <select id = "SelectUSerByName" ParameterType = "java.lang.string" Resulttype = "com.fq.fq.domen.dometer =" '%$ {value}%'; </leclect> </mapper> </code> </code> Descrição do atributo
namespace namespace, usado para isolar as instruções SQL
ParameterType define o tipo de mapeamento de entrada SQL, e o mybatis obtém parâmetros do objeto de entrada através do OGNL para passar para as instruções SQL.
ResultType define o tipo de mapeamento de saída SQL. Mybatis mapeia uma linha de registros de resultados de consulta SQL para o tipo especificado pelo resultado.
O nome do arquivo de mapeamento do mapeador inclui userdao.xml/userMapper.xml/user.xml e outros formulários. Eles geralmente são armazenados no diretório de maperes do mesmo nível que Mybatis-configuration.xml. Como sua principal função é definir a relação entre instruções SQL e mapeamento, geralmente é chamado de arquivos de mapeamento de mapero coletivamente.
Defina a classe PO
A principal função da classe PO é o mapeamento SQL (entrada/saída), que geralmente corresponde às tabelas de banco de dados:
<code> <code> <code> <code> <code>/*** @author jifang*@since 15/12/31 14:27 pm.*/public class User {private IDE ID; private string name; private string senha; public user () {} public user (theger idan, nome da string, senha) {this.id = id; {return id;} public void SetId (ID de inteiro) {this.id = id;} public String getName () {Nome de retorno;} public void setName (Nome da String) {this.name = name;} public String getPassword () {Return senha;} public SetPassword (String) {this.dpassword; "Usuário {" + "id =" + id + ", nome = '" + name +'/'' + ", senha = '" + senha +'/'' ' +'} ';}} </code> </code> </code> </code>Userdao (objeto Java)
Obtenha SQLSession, execute as instruções SQL e obtenha o resultado do mapeamento:
<Code> <code> <code> <code> <code> <code> <code>/*** @author jifang*@since 16/2/24 18:15. SqlSessionFactoryBuilder (). Build (Resources.GetResourCeasStream (Recurso));}@testPublic void selectUserById () {try (sqlSession Session = fActory.openssion ()) {user user = session.selectone ("samespace.selectUSTByid", 1)) {user.eser = session.selectone ("samespace.selectUsUsByid", 1). selectUserByName () {Try (SQLSession Session = Factory.opensession ()) {list <suser> users = session.selectList ("namespace.selectUserbyName", "Student"); para (usuário do usuário: usuários) {System.out.println (usuário);}}}} </suser> </code> </code> </code> </code> </code>Inserir
mapeador
<Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <insert id = "insertUser" parametertype = "com.fq.domain.user"> inserir em valores do usuário (nome, senha) ( #{name}, {{senha}); </insert> </code) </code)Userdao
<Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void insertUser () {Try User (); user.setName ("new_name1"); user.setpassword ("new_password"); session.insert ("namespace.insertuser", usuário); session.Commit ();}} </code> </code> </code> </code> </code> </code> Retornar por chave primária de incremento automático
Modifique o arquivo de mapeador e adicione-o, e você pode retornar a chave primária de incremento automático do MySQL (ou seja, o ID gerado quando os dados são apenas inseridos):
<Code> <Code> <Code> <Code> <Code> <Code> <dode> <dode> <code> <code> <code> <code> <code> <code> <code> <insert id = "insertUser" parametertype = "com.fq.domain.user"> <select KeyProperty = "id" ida = "após" " Last_insert_id (); </selectKey> inserir no usuário (nome, senha) valores ( #{name}, #{senha}); </insert> </code> </code> </code> </code> </code>Userdao
<Code> <Code> <Code> <Code> <Code> <dode> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void insertUser () {try (sqlSession Session = factory.openssion ()) {System.out.Println (Session (SESSIONTE) (SSUSTEMUSTEMUSTORY.OPENSESSESSÃO) {SYSTEM.) "new_password"); session.insert ("namespace.insertuser", usuário); // você precisa obter a chave primária de autoinncrement session.commit (); system.out.println (user.getid ();}} </code> </code> </code> </code> </code> </códigoEsta função também pode ser concluída através das propriedades UseGeneratedKeys/KeyProperty, consulte a documentação do Mybatis para obter detalhes.
Atualizar
mapeador
<Code> <Code> <Code> <Code> <Code> <Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <update id = "updateUserById" parametertype = "com comply.fq.domain.user"> atualize o conjunto de usuários = #{name}, senha = #{{{{{{{} #{id}; </atualização> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Userdao
<Code> <Code> <Code> <Code> <Code> <Code> <Code> <code> <code> <code> <dode> <code> <code> <code> <code> <code> <code> <code> @testpublic void updateSerbyId () {try (sqlSession = fatorSession (sometEdErtEdDerBy.d.d () (sqlsession = somety.opensession.d)) {.d.d (shorsession.PensionEd) () 1, shodyUstion.PensionAdEdUshate (shodyUStion.PensionEd) () 1, shodysession.PensionEdEnate.PertyById (), shorsession. "FEIQING", "ICY5YQXZB1UWSWSWCVLSNLCA ==");}} </code> </code> </code> </code> </code> </code> </code> </code> </code>Excluir
mapeador
<Code> <Code> <Code> <Code> <Code> <Code> <Code> <dode> <code> <dode> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <delete id = "DeleteUserbyId" ParameterType = "java.lang.integer"> delates userbyId ", Java.lang.integer"> DeleteUserbyId "ParameterType =" Java.lang.integer " #{id}; </lete> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Userdao
<Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> @testpublic void DeLeteUserById () {Try (SQLSession Sessess = spactory.oprens. {session.delete ("namespace.deleteUserById", 51615);}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>resumo
#{}/$ {}
#{}: Representa um espaço reservado, implementa a definição de um valor para o espaço reservado preparado ( #{} representa um espaço reservado?) E converte automaticamente o tipo Java em tipo JDBC (então #{} pode impedir efetivamente a injeção de SQL). #{} pode receber valores simples de atributo de tipo ou PO. Se o ParameterType transmitir um único valor de tipo simples, o #{} pode ser valor ou outros nomes no #{} aparelho encaracolado. $ {} pode ser usado para unir strings SQL. O conteúdo do ParameterType pode ser unido no SQL sem conversão do tipo JDBC. $ {} pode ser usado para receber valores simples de atributo de tipo ou PO. Se o ParameterType transmitir um único valor de tipo simples, o $ {} poderá ser usado apenas para valorizar os aparelhos $ {} Curly.
Embora $ {} não possa impedir a injeção de SQL, às vezes $ {} é muito conveniente (como a ordem, classificando, os nomes das colunas precisam ser transmitidos para o SQL através dos parâmetros, e a solicitação por $ {coluna} é usada e #{} não pode ser usado para implementar esta função (consulte JDBC Basic Discussion on preparado para detalhes).
SQLSession
Forneça métodos para operar o banco de dados (como: SelectOne/SelectList). No entanto, o SQLSession é inseguro, por isso é melhor defini-lo como uma variável local a ser usada.
Vantagens de Mybatis (em comparação com JDBC)
O SQL está escrito no código Java, o que dificulta a manutenção. O Mybatis escreve SQL no Mapper e XML é separado do código Java. É complicado passar parâmetros para instruções SQL (como: SQL onde as condições são diferentes, os tipos de dados SQL são diferentes do Java). O Mybatis mapeia automaticamente os objetos Java para as instruções SQL através do ParameterType. A análise do conjunto de resultados é problemática (as alterações do SQL levam à análise de alterações do código, os tipos de dados SQL são diferentes do Java). O Mybatis mapeia automaticamente os resultados da execução do SQL em objetos Java através do resultado do resultado.
Anexo: é melhor adicionar uma implementação do sistema de log (logback/log4j) ao pom.xml, para que as informações do log sejam impressas ao depurar o programa, facilitando a verificação de erros. Tome logback como exemplo:
pom.xml
<Code> <Code> <Code> <Code> <Code> <Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <pendency> <puperid> ch.qos.logb ACK </roupidId> Logback-Classic </ArtifactId> <Versão> 1.1.2 </sisters> </dependency> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>
logback.xml
<Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <figuration> <Name = "Logroot" Value = "/Data/Logs" value = " %d {hh: mm: ss.ss} [ %thread] %-5level %logger {0} - %msg %n"> <Appender name = "stdout"> <coder> <pattern> $ {padrony} </satward> </coder> </appênder> <pather> name = "arquivo"> <rollingpolicy> <filenamepattern> $ {Logroot} /common-server.%D {yyyy-mm-dd} .log </filenamepattern <coder> <boder> <sattery> 7 </maxhistory> </} nível = "Debug"> <appender-ref ref = "stdout"> <appender-ref REF = "FILE"> </APPENDER-REF> </APPENDER-REF> </ROOT> </Property> </Property> </Configuration> </Code> </code> </code> </code> </code> </code> </código> </código> </code> </códigoPara outros detalhes sobre os logs do Mybatis, consulte a seção Mybatis Document Log.
DAO Development
Existem duas maneiras de desenvolver o DAO usando o Mybatis, o desenvolvimento original do DAO e o mapeamento de mapeamento do desenvolvimento da DAO.
Desenvolvimento da DAO original Desenvolvimento DAO Exige que os desenvolvedores escrevam interfaces DAO e implementações DAO, como consultar informações do usuário com base no ID:
mapeador (o mesmo de antes)
<Code> <Code> <Code> <dode> <dode> <dode> <code> <code> <code> <code> <dode> <code> <code> <code> <code> <code> <code> <code> <dode> <code> <code> <dode> <dode> <code> <code> <select id = "selectyanger" parametertypela = java> <dode> <code> <select Id = "selectyanger" ParameterTypen ResultType = "com.fq.domain.user"> selecione * do usuário onde id = #{id}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Interface do userdao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>/*** @author jifang* @since 16/2/22 10:20 am.*/public interface UserDAO {User SelectUSerById (ID do número inteiro) lança Exception;} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Implementação do userdao
<Code- Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code> <Code-SerstF. Factory; Public UserdaoImpl (SQLSessionFactory Factory) {this.Factory = Factory;}}@SubsterPublic User SelectUSerById (ID inteiro) lança exceção {SQLSession Session = Factory.oPensession (); Usuário = User = Session.selectone ("SamesCace.SelectSerby", isto,,,); User = User = session.selectone ("SameSace.setSerBid",, isto,, isto); user;}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> Cliente
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>public class MyBatisClient {@Testpublic void originalclient () lança exceção {userdao dao = new userdaoimpl (new sqlSessionFactoryBuilder (). Dao.SelectUserById (1); System.out.println (Usuário);}} </code> </code> </code> </code> </code> </code> </code> <//code> </code> </código> </código> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </códigoProblemas no desenvolvimento original da DAO:
1) Existem muitos códigos processuais no corpo do método de implementação DAO.
2) Chamar o método SQLSession (selecionar/inserir/atualizar) requer a especificação do ID da instrução, que é codificada, que não é propícia à manutenção do código.
Desenvolvimento de mapeamento do mapeador
O método de desenvolvimento de mapeamento de mapeador requer apenas a gravação de uma interface Dao, e o Mybatis cria dinamicamente uma implementação de interface com base na definição da interface e nas instruções SQL no arquivo mapeador.
mapeador
<Code> <Code> <Code> <Code> <Code> <Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <!-? xml> <code> namespace = "com.fq.mybatis.userdao"> <select id = "selectUSerById" parameterType = "java.lang.integer" resultType = "com.fq.Domain.User"> selecione * do usuário onde ID = #{id}; </select> </mapper> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>NOTA: Neste momento, o espaço para nome deve ser o mesmo que o nome totalmente qualificado da interface Userdao.
A interface Userdao é a mesma de antes, mas o cliente do userdaoImpl não é mais usado.
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>/*** @author jifang* @since 16/2/22 2:57 PM.*/Classe pública MybatSclient {Sessão privada de SQLSession; fábrica privada sqlSessionFactory; @BeforePublic void setup () {Factory = new SQLSessionFactoryBuilder (). Factory.oPensession ();}@testPublic void MappPperclient () lança Exceção {userdao dao = session.getmapper (userdao.class); usuário user = dao.selectUserById (1); System.out.println (usuário);}@após o deverpublic e a desvantagem (1); {session.close ();}} </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <//code> </code> </code> </code> </code> </code> </code> </code> </code>Os métodos de desenvolvimento de mapeamento de mapeadores precisam seguir as seguintes especificações:
O espaço para nome no arquivo mapeador é o mesmo que o nome totalmente qualificado da interface Dao; O ID da instrução no arquivo mapeador é o mesmo que o nome do método da interface Dao; O ParameterType/ResultType da instrução no arquivo Mapper é o mesmo que o parâmetro/resultado do método Dao.
Mapeamento do mapeador
A principal função dos arquivos de mapeamento do mapeador (como o userdao.xml) é definir instruções SQL (cada SQL é uma instrução), que é o núcleo do Mybatis.
Mybatis recomenda oficialmente o uso do método de mapeamento de mapeador para desenvolver o DAO, por isso não apresentaremos muito sobre o desenvolvimento do DAO original no futuro.
Mapeamento de entrada
Vários parâmetros formais
O exemplo anterior de passagem de tipos simples foi usado, então não o repetirei aqui. Quando vários parâmetros formais precisam ser passados, o parâmetro ParameterType não é mais necessário:
mapeador
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><update id="updateUserById">UPDATE user SET name = #{1}, password = #{2} WHERE id = #{0};</update></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>Userdao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>void updateUserById(Integer id, String name, String password) throws Exception;</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>
Po
Mybatis usa a expressão de Ognl para analisar valores do atributo de objeto:
mapeador
<Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "SelectUserByNamePassword" ParameterType = "com.fq.domain.user" resulttype = "com.fq.domain.user"> selecione *do userwhere name = #{name} e senha = #{senha}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </códigoUserdao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>User SelectUserByNamePassword (usuário do usuário) lança Exception; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <//code> <//code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </Code> </code> </Code> </code> </Code> </Code> </code </Code> </Code> </code>
mapeador
<Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co de> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "selectUserByMap" parameterType = "java.util.map" resultype = "com.fq.domain.user"> selecione *do userwhere name = #{name} e senha = #{senha}; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <//code> <//code> <//code> <//code> </code> </code> </code> </code> <//code> </code> </code> </code> </código#{} A chave correspondente do mapa nos aparelhos encaracolados.
Userdao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>User SelectUserByMap (map <string, object = ""> map) lança Exception; </string,> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <//code> <//code> <//code> <//code> </code> </code> </code> </code> <//code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </Code> </code> </Code> </code> </Code> </code </code </code </Code
Mapeamento de saída
Saída do tipo simples
mapeador
<Code> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <co de> <Code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <code> <select id = "SelectUserCount" ParameterType = "java.lang.string" resultType = "java.lang.integer"> selecione count (*) do nome do usuário como '%$ {value}%'; </select> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code > </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code>Userdao
<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>Integer selectUserCount(String name) throws Exception; </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> <//code> <//code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </code> </Code> </code> </code> </code> </code> </Code> </code </code> theyCcode
O retorno de um tipo simples deve garantir que o resultado da consulta tenha apenas uma linha de registros e o valor do primeiro campo seja finalmente convertido no tipo de saída.
Saída PO objeto/lista
Dois tipos de saída foram demonstrados antes (selectUserById/SelectUserByName usou o método de desenvolvimento da DAO original naquele momento, mas o formulário de definição do mapeador era semelhante), então farei apenas um resumo simples aqui:
O resultado definido no mapeador ao emitir um único objeto PO é o mesmo que o resultado definido no mapeador; O resultado da consulta SQL deve ser garantido como uma única peça de dados e é chamado internamente usando o método SelectOne; A lista PO da saída indica que o resultado da consulta pode ser múltiplo e é chamado internamente usando o método SelectList, e o valor de retorno da interface pode ser hospedado por lista/set.
Mapa de saída
O objeto PO da saída pode ser usado para usar a saída do mapa, com o nome do campo como chave e o valor do campo como valor.
mapeador
<Code> <select id = "selectUserlikename" resultType = "java.util.map"> selecione *do nome do userwhere como '%$ {value}%'; </select> </code>Userdao
<Code> <code> List <map <string, object = "" >> selectUserlikename (nome da string) lança exceção; </map <string,> </code> </code>
ResultMap
ResultType pode mapear o resultado da consulta para PO, mas a premissa é que o nome da propriedade PO e o nome do campo SQL devem ser os mesmos. Se for inconsistente, o mapeamento correspondente pode ser feito através do resulteMap:
mapeador
<Code> <Code> <code> <resultMap id = "userMap" type = "com.fq.domain.user"> <id column = "user_id" Property = "id"> <resultado column = "user_name" property = "name"> <resultado column = "user_password" = "idious_name" </ida </id " ParameterType = "java.lang.string" resultMap = "userMap"> selectId user_id, nome user_name, senha user_passwordfrom userwhere name = #{name}; </select> </code> </code> </code>A interface do userdao é a mesma de antes.