Índice
2.2. Importar dependências pom relacionadas
2.3. Importe arquivos de configuração relacionados
2.4. Instalação do plug-in relacionado ao Mybatis
2.5. Configuração Mybatis.cfg.xml
3. Uso de engenharia reversa baseada em ssm (IDEA)
3.1. Instale o plugin gerador Mybatis
3.2. Configurar geradorConfig.xml
4. Combinando Mybatis para gerar código para completar adições, exclusões, modificações e consultas
Quinto, o papel das perguntas da entrevista SQLSession
I. Introdução
1.1 Conceito MyBatis
MyBatis é uma estrutura de camada de persistência que oferece suporte a consultas SQL comuns, procedimentos armazenados e mapeamento avançado. Ele elimina quase todas as configurações manuais de códigos e parâmetros JDBC e recuperação de conjuntos de resultados e usa XML simples ou anotações para configuração e mapeamento original. mapear interfaces e POJOs Java em bancos de dados.
Os principais recursos do MyBatis incluem:
- Suporta SQL personalizado, procedimentos armazenados e mapeamento avançado.
- Evita quase todo o código JDBC, configuração manual de parâmetros e obtenção de conjuntos de resultados.
- XML simples ou anotações podem ser usadas para configurar e mapear tipos nativos, interfaces e POJOs Java como registros no banco de dados.
1.2. Por que usar MyBatis
As principais vantagens de usar MyBatis são:
1. Por meio de XML simples ou configuração de anotação, você pode mapear facilmente objetos Java e registros de banco de dados, evitando códigos JDBC complicados.
2. MyBatis suporta mapeamento avançado e procedimentos armazenados, tornando as operações de banco de dados mais fáceis e eficientes.
3. MyBatis pode mapear automaticamente conjuntos de resultados para objetos Java, reduzindo a quantidade de código para processar manualmente conjuntos de resultados.
4. MyBatis oferece suporte ao gerenciamento de transações para garantir consistência e integridade dos dados.
5. MyBatis tem boa escalabilidade e mais funções podem ser realizadas por meio de plug-ins ou interceptadores personalizados.
Tomemos como exemplo uma operação de consulta simples: quando não estivermos usando MyBatis, precisamos escrever o seguinte código JDBC:
String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, userId);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
// ...其他属性设置
}
Ao usar MyBatis, precisamos apenas escrever a seguinte configuração XML e objetos Java:
<select id="getUserById" parameterType="int" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
User user = sqlSession.selectOne("getUserById", userId);
Percebe-se que após usar o MyBatis, o código fica mais conciso e claro.
2. Construir ambiente Mybatis
2.1. Crie um projeto Maven
Primeiro, criamos um projeto maven básico antes de aprender mybatis
Clique com o botão direito no nome do projeto ➡new➡module
Selecione o projeto maven ➡ selecione a versão do jdk ➡ selecione webapp
Digite o nome do projeto
Selecione o local do arquivo do projeto maven ➡ clique no botão adicionar ➡ configure os parâmetros
2.2. Importar dependências pom relacionadas
① Basta substituir o conteúdo das tags <properties> e <dependencies>.
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- ********************** junit单元测试依赖 ********************** -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- ********************** Java Servlet API ********************** -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<!-- ********************** Mybatis依赖 ********************** -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- ********************** Mysql JDBC驱动 ********************** -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- ********************** 日志配置 ********************** -->
<!--记得修改mybatis.cfg.xml添加如下内容-->
<!--<setting name="logImpl" value="LOG4J2"/>-->
<!--核心log4j2jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.1</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
</dependency>
</dependencies>
②Na tag <build>, exclua a tag <pluginManagement> (desbloqueie a versão) e adicione <resources>.
Ele pode garantir que o mybatis-generator-maven-plugin possa copiar corretamente os arquivos necessários para a pasta de destino em tempo de execução, evitando o problema de arquivos ausentes ou erros de configuração.
<resources>
<!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>jdbc.properties</include>
<include>*.xml</include>
</includes>
</resource>
</resources>
③Configuração do plug-in Maven para usar o plug-in MyBatis Generator
Você pode usar o plug-in MyBatis Generator durante o processo de construção do Maven para gerar código Java, incluindo interface Mapper e arquivos de mapeamento XML, para simplificar o processo de desenvolvimento de operações de banco de dados.
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
</dependencies>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
2.3. Importe arquivos de configuração relacionados
Sabemos que Mybatis é um framework relacionado a banco de dados, então também precisamos importar arquivos de configuração sobre conexões de banco de dados
jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
Modifique o arquivo web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"></web-app>
2.4. Instalação do plug-in relacionado ao Mybatis
Um total de quatro plug-ins precisam ser instalados
Plug-in mybatis grátis
Geração Mybatis ou
ferramentas mybatis
ajudante especialista
Pontas:
Plugin MyBatis gratuito: Este plugin realiza principalmente o salto rápido entre mapeador e xml, sem ter que pesquisar globalmente toda vez que você pesquisa por sql. A segunda função é comumente usada: pular rapidamente do código xml para o arquivo mapeador e do arquivo mapeador para o código xml.
Gerador Mybatis: Este plug-in pode gerar automaticamente classes de entidade correspondentes, interfaces Mapper e arquivos de mapeamento XML de acordo com a estrutura da tabela do banco de dados. Isso pode reduzir bastante a carga de trabalho dos desenvolvedores e melhorar a eficiência do desenvolvimento.
Ferramentas Mybatis: Este plugin fornece algumas ferramentas relacionadas ao MyBatis, como geradores de código, analisadores de código e muito mais.
Ajudante Maven: Este plugin é usado principalmente para resolver conflitos maven. Após a conclusão da instalação, abra o arquivo pom.xml e haverá uma guia adicional do Analisador de Dependência. O item de conflito é selecionado por padrão e a lista de conflitos é exibida à esquerda, basta clicar em um e exibir o botão vermelho direito para excluí-lo. Em seguida, clique no botão Atualizar UI no canto superior esquerdo para ver se ela foi excluída e o código de exclusão será adicionado automaticamente ao pom.
2.5. Configuração Mybatis.cfg.xml
Como todos sabemos, um framework deve ter seu próprio arquivo de configuração, e Mybatis também possui um arquivo de configuração
Mybatis.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="jdbc.properties"/>
<settings>
<setting name="logImpl" value="LOG4J2"/>
</settings>
<!-- 别名 -->
<typeAliases>
<!--<typeAlias type="com.javaxl.model.Book" alias="Book"/>-->
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="jdbc"/>
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type="POOLED">
<property name="driver"
value="${jdbc.driver}"/>
<property name="url"
value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="com/javaxl/mapper/BookMapper.xml"/>-->
</mappers>
</configuration>
3. Uso de engenharia reversa baseada em ssm (IDEA)
O uso de engenharia reversa baseada em SSM (IDEA) refere-se ao uso da ferramenta MyBatisGenerator no ambiente de desenvolvimento integrado do IntelliJ IDEA para gerar automaticamente classes de entidade correspondentes, interfaces Mapper e arquivos de mapeamento XML de acordo com a estrutura da tabela do banco de dados. Isso pode reduzir bastante a carga de trabalho dos desenvolvedores e melhorar a eficiência do desenvolvimento.
3.1. Instale o plugin ou gerador Mybatis
Já concluímos esta etapa e a pulamos diretamente
3.2. Configurar geradorConfig.xml
geradorConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<!-- 引入配置文件 -->
<properties resource="jdbc.properties"/>
<!--指定数据库jdbc驱动jar包的位置-->
<classPathEntry location="D:\\initPath\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
<!-- 一个数据库一个context -->
<context id="infoGuardian">
<!-- 注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
<property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
</commentGenerator>
<!-- jdbc连接 -->
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
<!-- 类型转换 -->
<javaTypeResolver>
<!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 01 指定javaBean生成的位置 -->
<!-- targetPackage:指定生成的model生成所在的包名 -->
<!-- targetProject:指定在该项目下所在的路径 -->
<javaModelGenerator targetPackage="com.javaxl.model"
targetProject="src/main/java">
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="false"/>
<!-- 是否对model添加构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 是否针对string类型的字段在set的时候进行trim调用 -->
<property name="trimStrings" value="false"/>
<!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
</javaModelGenerator>
<!-- 02 指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.javaxl.mapper"
targetProject="src/main/java">
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 03 生成XxxMapper接口 -->
<!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
<!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
<!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
<javaClientGenerator targetPackage="com.javaxl.mapper"
targetProject="src/main/java" type="XMLMAPPER">
<!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 配置表信息 -->
<!-- schema即为数据库名 -->
<!-- tableName为对应的数据库表 -->
<!-- domainObjectName是要生成的实体类 -->
<!-- enable*ByExample是否生成 example类 -->
<!--<table schema="" tableName="t_book" domainObjectName="Book"-->
<!--enableCountByExample="false" enableDeleteByExample="false"-->
<!--enableSelectByExample="false" enableUpdateByExample="false">-->
<!--<!– 忽略列,不生成bean 字段 –>-->
<!--<!– <ignoreColumn column="FRED" /> –>-->
<!--<!– 指定列的java数据类型 –>-->
<!--<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>-->
<!--</table>-->
<table schema="" tableName="t_mvc_Book" domainObjectName="Book"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
<!-- 忽略列,不生成bean 字段 -->
<!-- <ignoreColumn column="FRED" /> -->
<!-- 指定列的java数据类型 -->
<!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
</table>
</context>
</generatorConfiguration>
Precauções:
① Modifique a localização do driver Mysql
Copie para o local <classPathEntry>, observe que uma barra precisa ser adicionada.
②Modifique o local onde o JavaBean é gerado
③ Modifique o endereço de geração do arquivo de configuração correspondente ao SQL
④ Modifique o endereço gerado do endereço do código da camada Dao
⑤Modificação especifica que uma tabela correspondente à adição, exclusão, modificação e código de consulta precisa ser gerada
Se quiser gerar várias tabelas de uma vez, você pode copiar várias tabelas.
Clique duas vezes no plug-in que baixamos para executar o código gerado
Neste ponto o código é gerado
4. Combinando Mybatis para gerar código para completar adições, exclusões, modificações e consultas
①Crie um pacote utilitário e uma classe SessionUtil
package com.csdn.xw.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SessionUtil {
private static SqlSessionFactory sessionFactory;
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
static {
sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml"));
}
public static SqlSession openSession() {
SqlSession session = threadLocal.get();
if (null == session) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void main(String[] args) {
SqlSession session = openSession();
System.out.println(session.getConnection());
session.close();
}
}
Pontas:
- A função desta classe de ferramenta é criar e gerenciar o objeto SqlSession do MyBatis. Ele inicializa um SqlSessionFactory lendo o arquivo de configuração mybatis.cfg.xml e, em seguida, usa essa fábrica para criar um SqlSession. O objeto SqlSession é usado para realizar operações de banco de dados como consulta, inserção, atualização e exclusão.
- No método openSession(), primeiro verifique se o thread atual já possui um objeto SqlSession, caso contrário, crie um novo SqlSession e configure-o para o thread atual. Se já existir um objeto SqlSession, basta retornar esse objeto diretamente.
- No método main(), chame o método openSession() para obter um objeto SqlSession, imprima as informações de conexão desse objeto e, finalmente, feche o objeto SqlSession.
②Crie a camada de negócios e a interface do BookBiz (basta copiar aquela gerada pelo mapeador)
package com.csdn.xw.biz;
import com.csdn.xw.model.Book;
public interface BookBiz {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
}
③Criar camada impl e implementar BookBiz com bookbizimpl
package com.csdn.xw.biz.Impl;
import com.csdn.xw.biz.BookBiz;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.model.Book;
/**
* @author Java方文山
* @compay csdn_Java方文山
* @create 2023-08-19-13:41
*/
public class BookBizImpl implements BookBiz {
private BookMapper bookMapper;
public BookMapper getBookMapper() {
return bookMapper;
}
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
@Override
public int deleteByPrimaryKey(Integer bid) {
return bookMapper.deleteByPrimaryKey(bid);
}
@Override
public int insert(Book record) {
return bookMapper.insert(record);
}
@Override
public int insertSelective(Book record) {
return bookMapper.insertSelective(record);
}
@Override
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
@Override
public int updateByPrimaryKeySelective(Book record) {
return bookMapper.updateByPrimaryKeySelective(record);
}
@Override
public int updateByPrimaryKey(Book record) {
return bookMapper.updateByPrimaryKey(record);
}
}
Nota: Os métodos set e get do bookMapper precisam ser fornecidos
④ teste
As tags Junit de anotação <scope>
são usadas para especificar o escopo de uma dependência para indicar que a dependência é válida na compilação, teste e tempo de execução.
package demo;
import com.csdn.xw.biz.Impl.BookBizImpl;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.util.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author Java方文山
* @compay csdn_Java方文山
* @create 2023-08-19-13:46
*/
public class demo1 {
private BookBizImpl bookBiz = new BookBizImpl();
SqlSession sqlSession;
@Before
public void setUp() throws Exception {
System.out.println("初始换方法。。。");
//工具类中获取session对象
sqlSession = SessionUtil.openSession();
//从session对象中获取mapper对象
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
bookBiz.setBookMapper(mapper);
}
@After
public void tearDown() throws Exception {
System.out.println("方法测试结束。。");
}
@Test
public void deleteByPrimaryKey() {
System.out.println("测试删除业务方法");
System.out.println(bookBiz.deleteByPrimaryKey(1));
}
@Test
public void selectByPrimaryKey() {
System.out.println("测试的查询业务方法。。。");
//System.out.println(bookBiz.getBookMapper());
System.out.println(bookBiz.selectByPrimaryKey(44));
}
}
Duas coisas representativas são testadas aqui, uma exclui uma consulta
Foi reportado um erro durante a execução, informando que getMapper não tem valor, neste momento lembramos que como o código não havia sido gerado antes, comentamos o conteúdo do arquivo de mapeamento de configuração em <mappers> para evitar erros, e agora mudamos de volta.
Consultar resultados do teste:
Excluir resultados de teste:
Excluímos os dados numerados 1
O valor de retorno aqui é 1, indicando que a exclusão foi bem-sucedida, mas voltamos ao banco de dados para verificar se os dados ainda estão lá, por que isso acontece?
Como nosso Mybatis não tem a capacidade de enviar itens automaticamente, podemos escrever os itens enviados no método de teste @After
Depois de escrever, estamos testando e nossos dados são excluídos neste momento.
Quinto, o papel das perguntas da entrevista SQLSession
SQLSession é uma interface do framework MyBatis e sua principal função é executar instruções SQL e gerenciar transações. No MyBatis, uma instância SqlSessionFactory cria uma instância SqlSession, e cada instância SqlSession tem sua própria transação para executar operações SQL. Quando várias instâncias de SqlSession são executadas simultaneamente, elas compartilham a mesma transação, o que pode garantir a consistência dos dados.
Resumindo, a função do SQLSession é a seguinte:
- Executar instruções SQL;
- assuntos de gestão;
- Operações simultâneas são suportadas.
- sqlsession pode obter o objeto mapeador
- Usado como cache, o cache de primeiro nível, o cache que será habilitado por padrão,
- Por questões de desempenho, o cache de segundo nível será usado e o cache de segundo nível precisa ser habilitado manualmente
Meu compartilhamento está aqui, bem-vindo à área de comentários para discutir e comunicar! !
Se você achar útil, por favor, dê um joinha ♥ ♥