O artigo anterior "Javaweb Practical Mall Project Development (i)" criou classes de entidade e ferramentas de paginação. Este artigo usa Mybatis para criar camadas DAO.
Além disso, a documentação da API mybatis pode ser usada como referência
1. O uso de mybatis
1. Introduzir um pacote de prateleira
Aqui eu apresento pacotes mybatis e mysql na lib
2. Escreva config.xml para configurar o ambiente do banco de dados
Publique o código primeiro e depois explique um por um
<? xml versão = "1.0" Encoding = "utf-8"?> <! Doctype Configuration public "-// mybatis.org//dtd Config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtdiS" <TytEAlIaSes> <pacote name = "com.model"/> </typeAliases> <ambientes default = "desenvolvimento"> <ambiente id = "desenvolvimento"> <transação name = "Nome de usuário" value = "$ {nome de usuário}"/> <propriedade name = "senha" value = "$ {senha}"/> </dataSource> </ambientalA primeira etapa é introduzir o formato de arquivo XML, ou seja, o DTD, que precisa ser copiado diretamente do modelo fornecido pelo Mybatis.
<! Doctype Configuration public "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd">
Pergunta 1
A função de propriedades é configurar o arquivo de propriedades correspondentes, o recurso especifica a rota correspondente e podemos configurar o driver de banco de dados, URL, nome de usuário, senha etc. no arquivo de propriedades. Consulte o seguinte. Dessa forma, o Mybatis lerá automaticamente os seguintes parâmetros e você poderá usar $ {} para referenciá -lo no XML.
driver = com.mysql.jdbc.driver url = jdbc: mysql: // localhost: 3306/shop userName = root senha = 123456
Pergunta 2
TypeAliases configura o alias sob o caminho especificado. Podemos configurar um único nome de alias <typeAlias type = "com.model.user" alias = "user"/> dessa maneira, com.model.user é alterado para o alias. Não há necessidade de escrever todos os nomes mais tarde. Você precisa apenas do usuário para substituir a modificação do lote <name do pacote = "com.model"/>. Dessa forma, você pode modificar todas as classes de um pacote, e o alias padrão é o nome da classe da entidade.
Pergunta 3
Os ambientes são usados para configurar o ambiente do banco de dados e podem configurar vários ambientes, como ambiente de desenvolvimento e ambiente de liberação, o padrão refere -se ao ambiente padrão
Observe que não há s no ambiente, o que representa um ambiente em ambientes. É distinguido por ID, então o ID deve ser único.
TransactionManager representa o tipo de banco de dados de conexão, o JDBC se conecta ao Java
DataSource Configura o modo de fonte de dados, agrupado é o modo de pool de conexão. Para outros modos, você pode ir ao documento oficial para conferir e escolher de acordo com suas necessidades.
A propriedade deve configurar a conexão do banco de dados. Não mova o nome, modifique o valor = "driver". Aqui está o uso de {} para ler a configuração no arquivo de propriedades superiores. Preste atenção à combinação do nome para lê -lo.
3. Declaração de mapeamento de mapeamento de gravação
Aqui, escrevo o método de carga do userdao, ou seja, leia um usuário com base no ID. O código a seguir é equivalente à função de carga pública do usuário (int id). Para o Mybatis, existem dois tipos de substituição #{}, será citado automaticamente de acordo com o tipo, como o tipo de string #{nome} substituído pelo 'nome'. O outro é a substituição $ {}, que é substituída diretamente no formato original e não adicionará outras coisas.
<? xml versão = "1.0" coding = "utf-8"?> <! ResultType = "Usuário"> Selecione * do Usuário WHERE ID =#{ID} </select> </Mapper>O primeiro passo é introduzir o arquivo de cabeçalho do DTD e formular as regras para o arquivo XML
Selecione a tag, indicando que atualmente é uma instrução SELECT
O atributo de identificação é equivalente ao nome da função, referenciado pelo ID
O atributo ParameterType, que representa o tipo de parâmetro recebido, pode especificar o tipo básico ou um tipo personalizado. Se for um tipo personalizado, seu método GET será automaticamente chamado para obter seus atributos.
A propriedade ResultType, Tipo de Valor de Retorno, pode personalizar diretamente o tipo e chamará automaticamente o método Definir para definir os parâmetros de consulta e usar mais propriedades nos artigos subsequentes.
4. Mapeador de chamada Mapa
Antes de ligar, você precisa configurar o mapeamento no config.xml primeiro. Observe que o XML configurado aqui é o caminho do arquivo.
<Mappers> <Mapper Resource = "com/model/user.xml"/> </mappers>
Em seguida, escreva uma aula de teste
public static void main (string [] args) {try {inputStream is = Resources.getResourCeasStream ("config.xml"); // leia o arquivo de configuração sqlsessionFactory Factory = new SQLSessionFactoryBuilder (). session.SelectOne (user.class.getName ()+". load", 1); // Chame o sistema de carga System.out.println (user.getnickname ()); // Opiname de apelido session.close (); // sessão de feche} catch (ioexception e) {e.printsttacktrace ();); }} resultado:
5. Classe de ferramentas de sqlsession
Escrever aulas de teste como o acima é muito problemático, então eu encapsulei o SQLSession para facilitar o uso da camada dao
pacote com.util; importar org.apache.ibatis.io.resources; importar org.apache.ibatis.session.sqlSession; importar org.apache.ibatis.session.sqlSessionFactory; importar orgache.apache.ibatis.session.Session.SessFactory; java.io.ioException; importar java.io.inputStream;/*** Criado por NL101 em 2016/2/23. */public classe sessionUtil {private static sqlSessionFactory Factory = null; static {try {inputStream is = Resources.getResourceasStream ("config.xml"); // Leia o arquivo de configuração Factory = new SQLSessionFactoryBuilder (). Build (IS); Crie Factory usando o arquivo de configuração} Catch (IOException E) {E.PrintStackTrace (); }} / ** * Get Session * @return * / public static sqlSession getSession () {return factory.openssion (); } / ** * Fechar sessão * @param session * / public static void Closesession (SqlSession Session) {if (session! = Null) session.close (); sessão = nulo; }}O exposto acima é o uso básico de mybatis, e agora começa a encapsular a camada dao
2. Encapsular Dao
1.Userdao.java
Carga pública de usuário (int id) Obtenha um usuário baseado no ID
Foi escrito acima
public boolean add (usuário do usuário) Adicionar um usuário
Código XML
<!-Adicione um usuário-> <insert id = "add" parametertype = "user"> inserir nos valores do usuário (null,#{userrame},#{senha},#{apelido},#{type}) </insert>Código Java
/** /*** Adicione um usuário* @param Usuário O usuário a ser adicionado* @return True Sucenro* /public boolean add (usuário do usuário) {int isadd = 0; SQLSession Session = sessionutil.getSession (); tente {isadd = session.insert (user.class.getName ()+". add", usuário); session.Commit (); // submeter} catch (Exceção e) {session.rollback (); // rolleback se o envio falhar} finalmente {sessionutil.clossession (sessão); } System.out.println (isadd); retornar isadd> 0; } Public boolean Excluir (int id) Exclua um usuárioCódigo XML
<!-Exclua um usuário-> <delete id = "delete" parametertype = "int"> exclua do usuário onde id =#{id} </lete>Código Java
/ ** * Exclua o usuário com base no ID * @param ID para excluir o ID do usuário * @return True Success */ public boolean Delete (int id) {int isDelete = 0; SQLSession Session = sessionutil.getSession (); tente {isDelete = session.Delete (user.class.getName ()+". Delete", id); session.Commit (); } catch (Exceção e) {session.rollback (); // Falha de retorno System.out.println ("excluir falha no usuário"); E.PrintStackTrace (); } finalmente {sessionutil.closesession (sessão); } retornar ISDELETE> 0; } Atualização booleana pública (usuário do usuário) Usuário de atualizaçãoCódigo XML
<!-modifique um usuário-> <update id = "update" parametertype = "user"> update user use definir nome de usuário =#{nome de usuário}, senha =#{senha}, apelido =#{apelido}, type =#{type} where id =#{id} </atualização>Código Java
/ *** Atualize o usuário* @param Usuário O usuário a ser atualizado* @return True sucesso*/ public boolean update (usuário do usuário) {int isupdate = 0; SQLSession Session = sessionutil.getSession (); tente {isupdate = session.delete (user.class.getName ()+". update", usuário); session.Commit (); } catch (Exceção e) {session.rollback (); // Falha de retorno System.out.println ("Atualização falhou"); E.PrintStackTrace (); } finalmente {sessionutil.closesession (sessão); } retornar isupdate> 0; } Login público do usuário (nome de usuário da string, senha da string) determina se o usuário existeCódigo XML
<!-julgamento de login de usuário-> <select id = "login" parametertype = "string" resulttype = "user"> selecione * do usuário onde o nome de usuário =#{nome de usuário} </leclect>Código Java
/ *** Determine se um usuário existe* @param nome de usuário nome de usuário* @param senha senha* @return existência retorna o usuário não existe retornar null*/ public user login (string userName, string senha) {user user = null; SQLSession Session = sessionutil.getSession (); tente {user = session.selectone (sabão.use.class.getName ()+". Login", nome de usuário); // Quando a senha estiver incorreta, defina o usuário como nulo if (! User.getpassword (). Igual (senha)) {user = null; }} finalmente {sessionUtil.Clossession (sessão); } retornar usuário; } public pager encontre (nome da string, classificação da string, ordem de string) Processamento de paginação Código XML:
O SQL dinâmico é usado aqui. Em relação ao SQL dinâmico, é o uso de tags como onde, se, escolher etc., você pode consultar o documento oficial. Além disso, em Mybatis, o conceito de nulo não existe. Por exemplo, você passa pelo usuário = nulo, mas ao substituir, ele é substituído por uma string "nula". Se esse valor não estiver disponível, será nulo.
<!-Código da paginação-> <select id = "encontre" parameterType = "map" resultType = "User"> Selecione * do usuário <se test = "name! dos registros da página-> <select id = "findCount" parametertype = "map" resulttype = "int"> selecione count (*) do usuário <se test = "name!
Código Java: No geral, ainda é baseado na paginação projetada pelo artigo anterior
/*** Consulta de página com base em condições especificadas* @Param Nome Condições de consulta, NULL Representa a condição de classificação de classificação Incondicional* @param, NULL Representa classificar por id* @param order classy condição, nulo representa uma ordem de ascensão* @return*/public pager <usuário> (nome da string, string, string) {intestart = systemTart. SystemContext.getPagesize (); // Pager Pager <suser> pagers = new pager <> (); Mapa <string, objeto> maps = new hashmap <> (); if (nome! = null &&! name.equals ("")) {name = "%"+name+"%"; maps.put ("nome", nome); } if (Sort == NULL || Sort.equals ("" ") {Sort =" Id "; // classificado por ID por padrão} if (order == null || order.equals (" ")) {Order =" ASC "; // Sort} maps.put (" classy ", sort); maps.put ("ordem", ordem); maps.put ("pagestart", pagestart); maps.put ("PageSize", Pagesize); SQLSession Session = sessionutil.getSession (); Lista <suários> dados = null; tente {dados = session.SelectList (user.class.getName ()+". Find", maps); // obtenha registro pagers.setDatas (dados); pagers.SetPagesize (PageSize); pagers.setPagestart (Pagestart); int totalRecord = session.SelectOne (user.class.getName ()+". findCount", maps); // obtenha o número total de registros pagers.setTotalRecord (totalRecord); pagers.setPageIndex (Pagestart/Pagesize+1); } finalmente {sessionutil.closesession (sessão); } retornar páginas; } Estrutura atual do projeto
No próximo artigo, escreverei um General Baseao para facilitar a redação do código. E continue aprendendo o uso de outras propriedades dos Mybatis. Obrigado pela sua leitura.