Recentemente, devido às necessidades de negócios em um sistema de comércio eletrônico, preciso retornar ao ID do produto após a inserção de informações do produto. No começo, encontrei algumas armadilhas, então tomei anotações aqui para impedir que ela fosse esquecida no futuro.
Obtenha a chave primária inserida como o seguinte código
Usuário do usuário = novo usuário (); user.setUserName ("chenzhou"); user.setPassword ("xxxx"); user.SetComment ("Teste a função de inserir dados para retornar a chave primária"); System.out.println ("A chave primária antes da inserção é:"+user.getUserId ()); userdao.insertandgetId (Usuário); // Insira o Operação System.out.println ("A chave primária após a inserção é:"+user.getUserId ());Depois de consultar informações on -line, descobri que existem aproximadamente duas maneiras.
Método 1:
No arquivo de mapeamento da classe de entidade "*mapper.xml" está escrito assim:
<inserir id = "insertandgetId" usegeneratedkeys = "true" keyproperty = "userId" parameterType = "com.chenzhou.mybatis.user"> inserir no usuário (nome de usuário, senha, comentário) (#{username},#{senha},#{})Pontas:
useGeneratedKeys = "true" significa definir auto-crescimento para a chave primária
keyProperty = "UserID" significa atribuir o ID crescente ao campo UserID na classe Entidade.
ParameterType = "com.chenzhou.mybatis.user" Esta propriedade aponta para a classe de entidade de parâmetro aprovada
Aqui está um lembrete de que não há atributo ResultType em <ret> </insert>; portanto, não adicione -o aleatoriamente.
O UERID na classe de entidade deve ter o getter () e o setter (); método
Como eu já havia configurado a auto-crescimento do campo ao criar mesas no banco de dados MySQL, finalmente escolhi o segundo método.
O segundo método:
Também no arquivo de mapeamento "*mapper.xml" da classe de entidade, mas deve ser escrito assim:
<!-Insira um produto-> <insert id = "insertproduct" parametertype = "domain.model.productbean"> <selectKey resultType = "java.lang.long" order = "após" keyProperty = "productId"> selecione Last_insert_id () </selecty> inserir em T_PRODUCT (Nome do produto, ProductDesrcible, MerchantId) Valores (#{ProductName},#{ProductDesrcible},#{MerchantId}); </insert>Pontas:
Não há atributo ResultType em <ret> </nsert>, mas há uma tag </selectKey> </selectKey>.
Ordem = "After" significa que a instrução INSERT é executada primeiro e, em seguida, a declaração de consulta é executada.
Pode ser definido como antes ou depois.
Se definido como antes, ele selecionará primeiro a chave primária, definirá o KeyProperty e executará a instrução Insert.
Se definido como depois, execute a instrução Inserir primeiro e, em seguida, o elemento selecionKey - semelhante ao banco de dados Oracle, você pode incorporar chamadas de sequência na instrução Insert, como no banco de dados Oracle.
keyProperty = "UserID" significa atribuir o ID crescente ao campo UserID na classe Entidade.
SELECT LAST_INSERT_ID () significa que o ID de auto-crescimento do registro que acabou de ser inserido é consultado na sintaxe do MySQL.
O UERID na classe de entidade deve ter o getter () e o setter (); método
Para atingir os requisitos, o acima é suficiente.
Se você estiver interessado aqui, continue me ouvindo sobre um possível erro em mybatis.
Por que a modificação do método de adição em mybatis tem um valor de retorno, embora solicite que o banco de dados de inserção seja bem -sucedido e os dados inseridos possam ser lidos, mas quando você abrir o banco de dados, não pode ver os dados inseridos?
Se você deseja inserir e retornar a chave primária ao implementar os requisitos acima, lembre -se de não escrever dessa maneira.
@Override Public Long InsertProduct (ProductBean PRODUTBEAN) {// TODO Método Auto-Gerado STUB SQLSESSÃO SESSÃO = MYBATISJDBCUTIL.CURRESSISSÃO (); Productidao ProductIDAO = session.GetMapper (ProductIDAO.class); // aqui *.class // Deve corresponder à camada de interface do Dao Return ProductIDAO.InsertProduct (ProductBean); }Por que?
Porque se você escrever como acima, o retorno do ID da chave principal que você deseja após a execução não é o número de linhas afetadas após a execução da instrução do banco de dados.
Além disso, depois de executar, você descobrirá que o prompt é bem -sucedido na inserção e também pode ler os dados inseridos com o código, mas sempre há apenas um registro.
Além disso, quando você abre o banco de dados, você descobrirá que nenhum dado foi inserido com sucesso no banco de dados.
Fiquei deprimido aqui por um longo tempo e finalmente descobri o ponto -chave.
A diferença entre ter um valor de retorno e não ter um valor de retorno é:
O valor de retorno é apenas para acessar o modo somente leitura do banco de dados e não haverá modificação nos dados do banco de dados, como vários métodos de consulta.
Se não houver valor de retorno, o banco de dados será acessado no modo de leitura e gravação, e os dados no banco de dados serão modificados, como exclusão ou adição.
Além disso, de acordo com o entendimento pessoal, o Mybatis deve primeiro armazená-lo em uma coleção de sessão construída ao executar a instrução Insert e depois ligar para o driver subjacente para operar e modificar o banco de dados.
session.Commit (); Mybatisjdbcutil.clossession ();
As duas instruções acima não são retornadas, o que significa que somente depois que essas duas instruções forem executadas, elas serão realmente executadas e inseridas no banco de dados e modificarão os dados no banco de dados.
Pelo contrário, se houver um valor de retorno, essas duas instruções não serão executadas; portanto, a declaração de adição é executada apenas na sessão construída por si mesma, mas não é enviada ao banco de dados, portanto, não há registro no banco de dados.
Isso explica por que, depois de modificar o método de adição em Mybatis, para ter um valor de retorno, embora solicite que o banco de dados seja inserido com sucesso, você não pode ver os dados inseridos ao abrir o banco de dados.
O método da declaração de inserção em Mybatis não deve ter um valor de retorno, pois escrever como esse está correto.
@Override public void InsertProduct (ProductBean ProductBean) {// TODO Method Auto-Generated Stub SQLSession Session = mybatisjdbcutil.currentSession (); ProductIDAO ProductIDAO = session.getMapper (ProductIDAO.class); // aqui *.class // Deve corresponder à camada de interface do Dao Productidao.insertProduct (ProductBean); session.Commit (); Mybatisjdbcutil.clossession (); }O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.