Processo de execução da estrutura Mybatis:
1. Configure o arquivo de configuração mybatis, sqlmapconfig.xml (o nome não é corrigido)
2. Carregue o ambiente Mybatis Excluste através de arquivos de configuração e crie a fábrica de sessão SQLSessionFactory
O SQLSessionFactory é usado de maneira singleton quando realmente usado.
3. Crie sqlSession através do SQLSessionFactory
O SQLSession é uma interface orientada ao usuário (fornecendo métodos de banco de dados operacional). O objeto de implementação é inseguro. Recomenda -se que o cenário de aplicação da SQLSession esteja dentro do corpo do método.
4. Chame o método SQLSession para manipular dados.
Se você precisar cometer uma transação, precisará executar o método Commit () de SQLSession.
5. Recursos de liberação e fechar o SQLSession
Método de Desenvolvimento do Agente Mapper (recomendado)
Somente os programadores precisam escrever a interface do mapeador (ou seja, interface Dao)
Os programadores precisam seguir uma especificação de desenvolvimento ao escrever mapper.xml (arquivos de mapeamento) e mapper.java:
1. Namespace no mapper.xml é o caminho completo da classe Mapper.java.
2. O ID da instrução em Mappper.xml é o mesmo que o nome do método no mappper.java.
3. O parameterType da instrução no mapper.xml especifica o tipo do parâmetro de entrada e o tipo do parâmetro de entrada do método mapper.java.
4. O resultado da instrução no mapper.xml especifica o tipo de saída e o tipo de valor de retorno do método mapper.java.
Conteúdo deste artigo:
Analise o modelo de dados do produto do pedido.
Mapeamento avançado: (aprenda)
Implementar consulta individual, uma consulta individual e muitos para muitos.
Carregamento de atraso
Cache de consulta
Cache de Nível 1
Cache de nível 2 (compreenda os cenários de uso do cache do Mybatis Nível 2)
Mybatis e Integração Spirng (mestre)
Engenharia reversa (pode usar)
Encomende o modelo de dados do produto
Idéias de análise de modelo de dados
1. Conteúdo de dados registrado em cada tabela
Estar familiarizado com o conteúdo registrado em cada tabela por módulo é equivalente ao processo de requisitos do sistema de aprendizagem (funções).
2. Configurações importantes de campo para cada tabela
Campos não vazios, campos de chave estrangeira
3. A relação entre tabelas no nível do banco de dados
Relacionamento de chave estrangeira
4. Relacionamento comercial entre tabelas
Ao analisar o relacionamento comercial entre tabelas, é necessário analisá -lo com base em um certo significado comercial.
Análise do modelo de dados
Usuário da tabela de usuários:
Registre as informações do usuário do produto comprado
Tabela de pedidos: pedidos
Registra o pedido criado pelo usuário (ordem para comprar itens)
Detalhes do pedido: OrderDetail:
Registre as informações detalhadas do pedido, a saber, as informações da compra
Lista de produtos: itens
Informações registradas do produto
Relacionamento comercial entre tabelas:
Ao analisar o relacionamento comercial entre tabelas, é necessário analisá -lo com base em um certo significado comercial.
Primeiro analise a relação comercial entre tabelas que têm relacionamentos entre os níveis de dados:
USRE e ordens:
Usuário ―-> pedidos: um usuário pode criar vários pedidos, um a muitos
Pedidos -> Usuário: um pedido é criado por apenas um usuário, um a um
Ordens e OrderDetail:
Pedidos> OrderDetail: Um pedido pode incluir vários detalhes do pedido, porque um pedido pode comprar vários itens, e as informações de compra de cada item são registradas no relacionamento de encomenda, um relacionamento
OrderDetail> Ordens: Um detalhe do pedido só pode ser incluído em uma ordem, um para um
OrderDetail e ItensMM:
OrderDetail-> itens SMS: um pedido de pedido corresponde apenas a um produto de informações, um para um
Itens> OrderDetail: Um produto pode ser incluído em vários detalhes do pedido, um a muitos
Em seguida, analise se existe uma relação comercial entre tabelas que não estão relacionadas ao nível do banco de dados:
Pedidos e itens:
A relação entre pedidos e itens pode ser estabelecida através da tabela OrderDetail.
Usuário e itens: constituem um relacionamento de muitos para muitos através de outras tabelas
Consulta individual
Requisitos: Informações sobre pedidos de consulta e associar as informações do usuário da consulta para criar pedidos
Use ResultType para consultar
Consideração sobre o uso de declarações SQL
Determine a tabela primária da consulta: Tabela de pedidos
Determine a tabela de associação para a consulta: tabela de usuários
A consulta da associação usa um link interno ou um link externo?
Como existe uma chave estrangeira (user_id) na tabela de pedidos, apenas um registro pode ser encontrado consultando a tabela de usuários por meio de associação de chaves estrangeiras e links internos podem ser usados.
Selecione pedidos.
Crie pojo (orderscustom.java)
Mapeie os resultados da consulta SQL acima no POJO, que deve incluir todos os nomes de colunas de consulta.
Os pedidos originais.
Crie uma classe PO que herda uma classe PO que inclua muitos campos de consulta.
OrdensMapperCustom.xml
OrdensMapperCustom.java
Escreva aulas de teste
Clique com o botão direito do mouse no arquivo OrdersMapPerCustom.java> Selecione Novo> Others> Junit Test Case> Selecione a função para testar
Escreva o seguinte código em ordersmappercustomtest.java:
public class OrdersMapperCustomTest {private SQLSessionFactory SQLSessionFactory; // Este método é para executar @beforepublic void setup () lança excepção {// criar sqlSessionFigMactory // mybatis Configuration file string = "sqlmapconfig.xmling"; Resources.GetResourCeasStream (Recurso); // Crie uma fábrica de sessão e passa em informações de arquivo de configuração mybatis SQLSessionFactory = new SQLSessionFactoryBuilder (). Build (inputStream);}@testpublic void testFindserSUser () Exception {sqlSess sqsess sqlSess. Objeto OrdersMapperCustom OrdersMapperCustom = SQLSession.GetMapper (OrderMapPerCustom.class); // Lista de métodos do mapeador de chamada <OrdersCustom> List = OrdersMapperCustom.findordersUser ();Use ResultMap para consultar
Declaração SQL: SQL implementado no mesmo resultado
Idéias para usar o mapeamento do resultado
Use ResultMap para mapear as informações do pedido no resultado da consulta ao objeto Ordens, adicione o atributo do usuário na classe Orders e mapeie as informações do usuário da consulta associada ao atributo do usuário no objeto Ordens.
Adicione o atributo do usuário à classe de pedidos
OrdensMapperCustom.xml
Defina o ResultMap
TYEP: significa mapear os resultados de toda a consulta para uma determinada classe, por exemplo: cn.itcast.mybatis.po.orders
ID: representa o identificador exclusivo da coluna de consulta na tabela de banco de dados, o identificador exclusivo nas informações do pedido. Se houver várias colunas que formam um identificador exclusivo, configure vários IDs.
Coluna: Uma coluna de identificação exclusiva para informações de pedido na tabela de banco de dados
Propriedade: Qual propriedade é mapeada para ordens pela coluna de identificação exclusiva das informações do pedido?
Associação: Usado para mapear informações para consultar objetos individuais
propriedade: qual propriedade em ordens para mapear as informações do usuário da consulta associada a
Javatype: qual propriedade mapeada para o usuário
<!-o mapa resultante do usuário associado mapeia o resultado de toda a consulta para cn.itcast.mybatis.po.orders-> <resultMap type = "cn.itcast.mybatis.po.orders" id = "orderSuSerResultMap"> <!-Configure as informações da ordem-> <! encomendar informações. Se houver várias colunas para formar um identificador exclusivo, configure múltiplos Idcolumn: coluna de identificação exclusiva da propriedade Informações da ordem: Qual propriedade em ordens é mapeada pela coluna de identificação exclusiva da informação do pedido-> <id column = "id (" result = "id"/> resulte column = "user_id" norde = "userId"/> <> < Property = "CreateTime" /> <Result Column = "Note" Property = Note /> <!-Configure as informações do usuário associadas mapeadas-> <!-Associação: Informações usadas para mapear a consulta associada Propriedade de objeto único: Qual propriedade em pedidos para mapear as informações do usuário da consulta associada a-> <Association = "user" Coluna: Especifique a coluna que identifica exclusivamente as informações do usuário javatype: qual propriedade mapeada para o usuário -> <id column = "user_id" propriedade = "id"/> <resultado column = "username" propriedades = "nome do usuário"/> <resultado column = "sexo" = "sexo"/> <resultado column = "endereço" "Definição da declaração
OrdensMapperCustom.java
Código de teste
@Testpublic void testFindordersUserResultMap () lança exceção {sqlSession sqlSession = sqlSessionFactory.opensssion (); // Crie proxy Object OrderMapPerCustom OrdersMapperCustom = sqlSession.GetMapper (OrdesmapperCustom.cl); OrdersMapperCustom.FindordersUserResultMap (); System.out.println (List); sqlsession.close ();}Resultype e ResultMap Implemente o resumo de consulta individual
ResultType: é relativamente simples de implementar usando o resultType. Se o nome da coluna de consulta não estiver incluído no Pojo, você precisará adicionar os atributos correspondentes do nome da coluna para concluir o mapeamento.
Se não houver requisitos especiais para resultados de consultas, é recomendável usar o ResultType.
ResultMap: O resultado precisa ser definido separadamente, o que é um pouco problemático. Se houver requisitos especiais para os resultados da consulta, o uso do ResultMap poderá preencher os atributos do Pojo de mapeamento de consulta associado.
O ResultMap pode implementar o carregamento preguiçoso, o resultado não pode implementar o carregamento preguiçoso.
Consulta individual
Requisitos: Consulta Ordens e o pedido de informações sobre detalhes.
Declaração SQL
Determine a tabela de consulta principal: Tabela de pedidos
Determine a tabela de consulta associada: Tabela de detalhes do pedido
Basta adicionar Detalhes da Lista de Detalhes da Ordem com base na consulta individual.
Selectorders.
Análise: Use ResultType para mapear os resultados da consulta acima no POJO, e as informações do pedido são duplicação.
Requisito: os registros duplicados não podem ocorrer para o mapeamento de pedidos.
Adicione a lista de propriedades <OrderDetail> OrderDetails na classe Ordens.java.
Finalmente, as informações do pedido serão mapeadas para os pedidos, e os detalhes do pedido correspondentes ao pedido são mapeados na propriedade OrderDetails em pedidos.
O número de pedidos registrados no mapeado é duas (informações de pedidos não são repetidas)
A propriedade OrderDetails em cada pedidos armazena os detalhes do pedido correspondentes ao pedido.
Adicionar atributo de detalhes da ordem da lista em pedidos.java
OrdensMapperCustom.xml
Definição de Map Result
O uso estende a herança sem configurar o mapeamento das informações do pedido e das informações do usuário em
Coleção: consulta vários registros para mapear para o objeto de coleção para a consulta da associação
Propriedade: Mapeie a consulta da Associação para vários registros para CN.itcast.mybatis.po.orders Qual propriedade é mapeada para cn.itcast.mybatis.po.orders
OFTYPE: Especifica o tipo que mapeia para Pojo no atributo de coleção de listas
<!-O resultado resultante para pedidos e detalhes do pedido é herdado usando estendências e não precisa configurar o mapeamento das informações do pedido e das informações do usuário nele-> <resultMap type = "cn.itcast.mybatis.po. A herdeira, não precisa configurar o mapeamento das informações do pedido e das informações do usuário-> <!-Detalhes do pedido Informações A uma consulta de associação de pedidos tem vários detalhes. Para usar a coleção para mapear a coleção: mapeie vários registros para a propriedade de objeto de coleção: mapa a consulta de associação para vários registros para cn.itcast.mybatis.po.orders Qual propriedade oftype: especifique o tipo de mapa de pojo para listar propriedades de coleta-> <coleção de propriedades = "orderDetails" oftype = "cn.itcast.mybatis.patis.patis.ponders.ponder.perdDetails" oftype = "cn.itcast.mybatis.patis.patis.ponder.Per. O identificador exclusivo dos detalhes do pedido para cn.itcast.mybatis.po.ordedEtail-> <id column = "orderDetail_id" Property = "id"/> <Result Column = "Itens_id" Property = "Itensid"/> <Result Column = "itens_ itens" = "itens"/> <Result "/> Property = "OrdersId"/> </coletor> </resultMap>
OrdensMapperCustom.java
Código de teste:
@Testpublic void testFindordersArderDetailResultMap () lança exceção {sqlSession sqlSession = sqlSessionFactory.opensssion (); // crie proxy objeto ordersmpperCustom.cormsppercustom = sqlSession.GeTperMper (OrdersMpperCerCustom.Cl); OrdensMapPerCustom.findordersandOrderDetailResultMap (); System.out.println (list); sqlSession.Close ();}resumo
O Mybatis usa a coleção do ResultMap para mapear vários registros da consulta associada em uma propriedade de coleção de listas.
Implementação usando o resultado resultante:
Mapeando os detalhes da ordem dos pedidos em pedidos, você precisa lidar com isso sozinho, usar um loop duplo para atravessar, remover registros duplicados e colocar detalhes do pedido em encomendas.
Muitos para muitos
Requisitos: Usuários de consulta e informações de compra do usuário.
Declaração SQL
A tabela principal de consulta é: Tabela de usuários
Tabela de associação: Como o usuário e o produto não estão diretamente relacionados, eles estão relacionados por meio de pedidos e detalhes do pedido; portanto, a tabela de associação: pedidos, ordem de ordem, itens
Selecione pedidos. orders.user_id = user.id e orderdetail.orders_id = ordens.id e orderdetail.items_id = items.id
Idéias de mapeamento
Mapeie as informações do usuário no usuário.
Adicione a lista de atributos da Lista de pedidos <Orders> OrdersList na classe de usuário para mapear os pedidos criados pelo usuário para a lista de pedidos
Adicionar detalhes da lista Lista de propriedades Lista de propriedades <OrderDetail> OrderDetials em ordens para mapear o OrderDetials
Adicione a propriedade de itens em OrderDetail para mapear os itens correspondentes aos detalhes do pedido aos itens
OrdensMapperCustom.xml
Definição de Map Result
<!-consulte o usuário e os produtos adquiridos-> <resultMap type = "cn.itcast.mybatis.po.user" id = "userAnditemsResultMap"> <!-Informações do usuário-> <id column = "user_id" property = "id"/> resultado column = "username") column = "endereço" propriedade = "endereço"/> <!-encomendar informações que um usuário corresponde a vários pedidos e usa o mapeamento de coleções-> <coleção de propriedade = "orderslist" oftype = "cn.itcast.mybatis.po.orders"> <id column = "id)/" id "/> <resultado column =" user_Id ""> <id column = "id"/"id"/> <resultado propriedades = "número"/> <resultado column = "createTime" propriedade = "createTime"/> <resultado column = "note" property = "note"/> <!-Detalhes do pedido Um pedido inclui vários detalhes-> <coleção de propriedades = "orderDetails" ofttype = "cn.itcast.mybatis.po.oDerDEtail"> <idtype = column = "column] column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/><!-- Product information An order detail corresponds to a product --><association property="items" javaType="cn.itcast.mybatis.po.Items"><id column="items_id" propriedade = "id"/> <resultado colun = "itens_name" propriedade = "name"/> <resultado colun = "itens_detail" propriedade = "detalhe"/> <resultado column = "itens_price" property = "price"/> </associatom
OrdensMapperCustom.java
Código de teste:
@Testpublic void testFindUSERAndItemSResultMap () lança exceção {sqlSession sqlSession = sqlSessionFactory.opensssion (); // Crie proxy Object OrdensMpperCustom.clresmapperCustom = sqlSession.GeTperMper (OrdesMpperCustom.cl); OrdensMapPerCustom.FindUserAnditemSResultMap (); System.out.println (list); sqlsession.close ();} Resumo da consulta muitos para muitos
A lista detalhada das informações do produto adquirida pelo usuário será verificada (nome de usuário, endereço do usuário, nome do produto, hora da compra, quantidade de compra)
Em resposta aos requisitos acima, usamos o ResultType para mapear os registros de consulta em um pojo estendido, que é muito simples de implementar a função de uma lista detalhada.
Um para muitos é um caso especial de muitos para muitos, como segue:
Ao consultar as informações do produto adquiridas pelos usuários, o relacionamento entre o usuário e o produto é um relacionamento de muitos para muitos.
Requisito 1:
Campos de consulta: conta de usuário, nome de usuário, gênero do usuário, nome do produto, preço do produto (mais comum)
Listas detalhadas comuns no desenvolvimento corporativo, listas detalhadas de produtos comprados por usuários,
Use ResultType para mapear a coluna de consulta acima para a saída POJO.
Requisito 2:
Campos de consulta: conta de usuário, nome de usuário, quantidade de itens adquiridos, detalhes do produto (mouse para exibir detalhes)
Use ResultMap para mapear a lista de detalhes do produto comprada pelo usuário no objeto do usuário.
Resumir:
O uso do ResultMap é para as funções que possuem requisitos especiais para o mapeamento de resultados de consultas, como mapear requisitos especiais em listas, incluindo várias listas.
Resumo do ResultType e ResultMap
ResultType:
efeito:
Mapeie os resultados da consulta em POJO de acordo com o nome da coluna SQL POJO Nome do atributo Consistência.
ocasião:
Exibição comum de registros detalhados, como quando os usuários adquirem detalhes do produto e exibem todas as informações de consulta associadas na página, você pode usar diretamente o ResultType para mapear cada registro.
Atire no Pojo e atravesse a lista (Pojo na lista) na página front-end.
ResultMap:
Use a Associação e a Coleção para concluir o mapeamento avançado individual e um para muitos (existem requisitos de mapeamento especiais para os resultados).
associação:
efeito:
Mapeie as informações de consulta associadas em um objeto Pojo.
ocasião:
Para facilitar as informações associadas à consulta, você pode usar a associação para mapear as informações da ordem associada nos atributos POJO de objetos de usuário, como: consulta de pedidos e informações associadas ao usuário.
O uso do resultado do resultado não pode mapear os resultados da consulta para o atributo pojo do objeto Pojo. Escolha se deve usar o resultado resultante ou o resultado de acordo com as necessidades de atravessar a consulta do conjunto de resultados.
Coleção:
efeito:
Mapeie as informações de consulta associadas em uma coleção de listas.
ocasião:
Para facilitar as informações de associação de travessia de consulta, você pode usar a coleção para mapear as informações da associação para a coleção de listas, como: consultar o módulo de escopo de permissão do usuário e o menu no módulo, você pode usar a coleção para mapear a lista de módulos para mapear os atributos da lista de menus do objeto Module. O objetivo disso também é facilitar o Traversal consulta o conjunto de resultados da consulta.
Se você usar o ResultType, não poderá mapear os resultados da consulta para a coleção de listas.
Carregamento de atraso
O ResultMap pode implementar o mapeamento avançado (usando associação e coleção para implementar o mapeamento individual e um para muitos). A associação e a coleção têm funções de carregamento preguiçoso.
precisar:
Se o pedido for consultado e as informações do usuário estiverem associadas. Se primeiro consultar as informações do pedido para atender aos requisitos, consultaremos as informações do usuário quando precisarmos consultar as informações do usuário. A consulta de informações do usuário sob demanda está atrasada no carregamento.
Carregamento de atraso: a primeira consulta de uma única tabela e, em seguida, da tabela associada quando necessário, melhorando bastante o desempenho do banco de dados, porque a consulta de uma única tabela é mais rápida do que consultar várias tabelas.
Use a associação para implementar o carregamento preguiçoso
Requisitos: Consulta Ordens e Associar Informações do Usuário de Consulta
Ordresmappercustom.xml
É necessário definir a instrução correspondente aos dois métodos de mapeador.
1. Somente informações sobre pedidos de consulta
Selecione * de pedidos
Use a associação para atrasar o carregamento (execute) a seguinte satisfação (Informações do usuário da consulta da associação) na declaração do pedido de consulta
2. Informações relacionadas ao usuário da consulta relacionada
User_id é usado para consultar as informações do usuário seguindo o user_id na consulta de informações do pedido acima
Use FindUserById em UsermApper.xml
O primeiro executa primeiro a FindorderSUserLazyLoading e, quando você precisa consultar o usuário, executa o FindUserById, e o carregamento e a execução atrasados são configurados através da definição de SultMap.
Atraso carregando o resulteMap
Use selecionar na associação para especificar o ID da instrução a ser executado pelo carregamento preguiçoso.
<!-Lazy carregado resultante carregado-> <ResultMap type = "cn.itcast.mybatis.po.orders" id = "ordensuserLazyloadingResultmap"> <!-mapeamento de configuração de informações do pedido-> <id column = "id"/"id"/> <resultado column = "user_id_id-> Usuário-> <id column =" id "=" id "/> <resultado column =" User_id_id-Usuário-> propriedades = "número"/> <resultado column = "createTime" propriedade = "createTime"/> <resultado column = "note" property = "note"/> <!-mapeando a configuração das informações do pedido-> <id column = "iD" property = "user_id" property = "userid"/> <resultado colun = "number" ") Property = "Note"/> <!- Implementar o carregamento de atraso das informações do usuário
Selecione: Especifique o ID da instrução a ser executada para carregamento preguiçoso (a instrução que consulta as informações do usuário com base em user_id)
Para usar o FindUserById em UserMApper.xml para concluir a consulta com base no ID do usuário (user_id) Informações do usuário. Se o FindUserById não estiver neste mapeador, você precisa adicionar namespace antes dele.
Coluna: A coluna na informação do pedido associada à consulta de informações do usuário é user_id
A consulta SQL for Association é entendida como:
Selecione Ordens. Column = "user_id"> <!-Implementar o carregamento preguiçoso das informações do usuário-> </supliation> </resultmap>
OrderesMapPerCustom.java
Idéias de teste:
1. Execute o método do mapeador acima (FindorderSuserLazyLoading) e ligue para FindorderSuserLazyLoading em cn.itcast.mybatis.mapper.ordersMapperCustom para consultar apenas informações de ordem (tabela única).
2. No programa, atravesse a lista <ordens> consultada na etapa anterior. Quando chamamos o método getUser em ordens, começamos a carregar preguiçosas.
3. Carregamento de atraso, ligue para o método findUserbyId em UserMApper.xml para obter informações do usuário.
Configuração de carga preguiçosa
O Mybatis não permite o carregamento preguiçoso por padrão e precisa ser configurado no sqlmapconfig.xml.
Configure no arquivo de configuração do Mybatis Core:
Definir item Descrição Valor permitido Valor padrão
LazyloadingEnabled Globalmente define o carregamento preguiçoso. Se definido como 'false', todos os associados serão inicializados e carregados. verdadeiro ou falso
Agressiva -ladrão quando definido como 'True', os objetos de carregamento preguiçosos podem ser carregados por todas as propriedades preguiçosas. Caso contrário, cada propriedade é carregada conforme necessário. verdadeiro ou falso verdadeiro
Config em sqlmapconfig.xml:
Código de teste
Pensando em carregar atrasado
Como alcançar o carregamento preguiçoso sem usar a associação e a coleção fornecidas pela Mybatis?
O método de implementação é o seguinte:
Defina dois métodos de mapeador:
1. Consulta a lista de pedidos
2. Informações do usuário de consulta com base no ID do usuário
Ideias de implementação:
Primeiro verifique o primeiro método do mapeador e obtenha a lista de informações do pedido
No programa (serviço), ligue para o método do segundo mapeador, conforme necessário para consultar as informações do usuário.
Em resumo: use o método de carregamento preguiçoso para consultar o SQL simples (de preferência uma única tabela, você também pode associar consultas) e, em seguida, carregue outras informações das consultas associadas, conforme necessário.
Cache de consulta
O Mybatis fornece caches de consulta para reduzir a pressão de dados e melhorar o desempenho do banco de dados.
O MyBaits fornece cache de primeiro nível e cache de segundo nível.
O cache de nível 1 é um cache no nível do SQLSession. Ao operar o banco de dados, você precisa construir o objeto SQLSession e há uma estrutura de dados (hashmap) no objeto para armazenar dados em cache. As áreas de dados em cache (hashmaps) entre diferentes SQLSessions não afetam um ao outro.
O cache secundário é um cache no nível do mapeador. Várias SQLSessions operam as instruções SQL do mesmo mapeador. Múltiplas sqlsessions podem compartilhar o cache secundário. O cache secundário é o cruzamento cruzado.
Por que usar cache?
Se houver dados no cache, você não precisará obtê -los no banco de dados, o que melhora bastante o desempenho do sistema.
Cache de Nível 1
Princípio de trabalho de cache de primeiro nível
Na primeira vez em que iniciei uma consulta sobre as informações do usuário com o ID do usuário 1, procure primeiro se há informações do usuário com informações do usuário com ID 1 no cache. Caso contrário, consulta as informações do usuário do banco de dados.
Obtenha informações do usuário e armazenar as informações do usuário em um cache de primeiro nível.
Se o SQLSession executar operações de confirmação (executar a inserção, atualizar e excluir), limpa o cache de primeiro nível em SQLSession. O objetivo disso é tornar o cache armazenar as informações mais recentes e evitar a leitura suja.
Na segunda vez que iniciei uma consulta sobre as informações do usuário com o ID do usuário 1, procure primeiro se há informações do usuário com informações do usuário com ID 1 no cache. Se houver um no cache, obterei diretamente as informações do usuário do cache.
Teste de cache de nível 1
O Mybatis suporta o cache de primeiro nível por padrão e não precisa ser configurado no arquivo de configuração.
Siga as etapas do princípio do cache do nível um acima para testar.
//Ordersmappercusntomtest.java@testpublic void testcache1 () lança exceção {sqlSession sqlSession = sqlSessionFactory.opension (); // cria um proxy objeto usermApper = sqlsesser.getmapper (usapper.classans); ID 1 é usuário do usuário1 = UserMApper.FindUserById (1); System.out.println (user1); // Se o SQLSession executar operações de comércio (executa a inserção, atualização e exclusão), limpa o cache de primeiro nível em SQLSession. O objetivo disso é tornar o cache armazenar as informações mais recentes e evitar a leitura suja. // Atualize as informações do usuário1 User1.setUserName ("Test User22"); UsermApper.UpDateUser (User1); // Execute a operação de comprometimento para limpar o cache sqlsession.Commit (); // Inicie a segunda solicitação e consulte o usuário com ID 1 Usuário2 = UsermApper.findUserbyid (1); System.out.println (User2); sqlsess.close ();Aplicação de cache de nível 1
O desenvolvimento formal é integrar Mybatis e primavera, e as transações são controladas em serviço.
Um método de serviço inclui muitas chamadas de método de mapeador.
Serviço {// Ao iniciar a execução, inicie a transação e crie o objeto SQLSession // Chame o método de mapeador pela primeira vez findUserbyId (1) // célula do método de mapeador para a segunda vez FinduserById (1), buscando dados do cache de primeiro nível // os finais do método, o SQLSession está fechado}Se você executar duas chamadas de serviço para consultar as mesmas informações do usuário, não acesse o cache de primeiro nível, porque o método da sessão termina, a SQLSession será fechada e o cache de primeiro nível será limpo.
Cache de nível 2
princípio
Primeiro, ative o cache de segundo nível de Mybatis.
O SQLSession1 consulta as informações do usuário com o ID do usuário 1. Ao consultar as informações do usuário, os dados da consulta serão armazenados no cache secundário.
Se o SQLSession3 executar o SQL no mesmo mapa, executará o envio e limpa os dados na área de cache secundária sob o mapeador.
O SQLSession2 consulta as informações do usuário com o ID do usuário 1 e descobre se existem dados no cache. Se existir, os dados serão recuperados diretamente do cache.
A diferença entre o cache secundário e o cache primário é maior. O alcance do cache secundário é maior. Várias SQLSessions podem compartilhar a área de cache secundária de um UserMApper.
O UserMApper possui uma área de cache secundária (subdividida por namespace), e outros mapppers também têm sua própria área de cache secundário (subdividida por namespace).
Cada mapeador de namespace tem uma segunda área de cache. Se o espaço para nome dos dois mapeadores for o mesmo, os dois mapeadores terão a mesma segunda área de cache quando os dados forem executados pelo SQL.
Ative o cache do nível 2
O cache de segundo nível dos MyBaits é o nível da faixa de mapero. Além de definir a chave principal do cache de segundo nível em sqlmapconfig.xml, o cache de segundo nível também deve ser ativado no mapper.xml específico.
Adicionado ao arquivo de configuração do núcleo sqlmapconfig.xml
<Configuração name = "Cacheenabled" value = "true"/>
Descrição Valor permitido Valor padrão
Cacheenabled globalmente ON/OFF Configurações para todos os caches neste arquivo de configuração. verdadeiro ou falso
Ligue o cache secundário em UserMapper.xml, e a execução do SQL sob UserMapper.xml será armazenada em sua área de cache (Hashmap).
Ligue para a classe Pojo para implementar a interface de serialização
Para extrair dados em cache, são realizadas operações de desserialização, porque os meios de armazenamento de dados em cache secundários são diversos e diferentes na memória.
Teste de cache de nível 2
@Testpublic void testCache2 () lança exceção {sqlSession sqlSession1 = sqlSessionFactory.opensssession (); sqlSession sqlSession2 = sqlSessionFactory.opensssession (); sqlession SqlSession3 = SQLSessFactory.Opensssion ();); sqlSession1.getMapper (userMApper.class); // inicia a primeira solicitação e consulte o usuário com ID 1 Usuário do usuário1 = UserMApper1.findUserbyId (1); System.out.println (User1); // Execute a operação Fechar aqui e escreva os dados no sqlsession para a área de cache secundário; A Operação () Operação UserMApper UserMApper3 = SQLSession3.GetMapper (UserMApper.Class); Usuário do UserMApper3.FindUserById (1); User.SetUserName ("Zhang Mingming"); UsermApper3.UpDateUser (User); // Executar o submissão e limpar o cache secundário sqlSession3.Commit (); sqlSession3.Close (); UserMApper UserMApper2 = SQLSession2.GetMapper (UserMApper.class); // Envie a segunda solicitação para consultar o usuário com ID 1 User2 = UsermApper2.FindUserBy (1); System.out.Println (User2);Configuração do USECACHE
Configurar USECACHE = FALSE Na instrução pode desativar o cache secundário da instrução Select atual, ou seja, cada consulta emitirá o SQL para consultar. O padrão é verdadeiro, ou seja, o SQL usa cache secundário.
<select id = "findOrderListResultmap" resultmap = "ordesuserMap" usecache = "false">>
Resumo: Para cada consulta, os dados mais recentes são necessários. Defina -o como usecache = false e desative o cache secundário.
Atualizar o cache
Apenas limpe o cache
No mesmo espaço de nome do mapeador, se houver outra inserção, atualização ou excluir dados de operação, o cache precisará ser atualizado e, se o cache não estiver atualizado, a leitura suja ocorrerá.
Defina a propriedade Flushcache = "true" na configuração da instrução. Por padrão, é verdade, o que significa que o cache é atualizado. Se for alterado para falso, não será atualizado. Ao usar o cache, as leituras sujas ocorrerão se você modificar manualmente os dados da consulta na tabela de banco de dados.
<insert id = "insertUser" parametertype = "cn.itcast.mybatis.po.user" flushcache = "true">>
Resumo: Geralmente, depois de executar a operação de confirmação, o cache precisa ser atualizado. Flushcache = true significa refrescar o cache, o que pode evitar a leitura suja do banco de dados.
Mybatis integração ehcache
O Ehcache é uma estrutura de cache distribuída.
Cache distribuído
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)
不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。
整合ehcache方法(掌握)
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
mybatis默认实现cache类是:
加入ehcache包
整合ehcache
配置mapper中cache中的type为ehcache对cache接口的实现类型。
加入ehcache的配置文件(在classpath下配置ehcache.xml)
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="F:/develop/ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。