Tabla de contenido
1. Pasar parámetros a la declaración SQL.
1. Pasar parámetros a la declaración SQL.
1. Uso básico del marco MyBatis
Los paquetes jar utilizados son los siguientes:
<!-- 测试包-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<!-- MyBatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 数据库连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
Para usar MyBatis, debe implementar una clase de entidad correspondiente a una tabla correspondiente a una interfaz comercial correspondiente a un mapeo de asignador.
El mapeo del asignador es equivalente a la clase de implementación de la interfaz empresarial. Es solo que el código Java y el código SQL se distinguen a través del archivo de configuración mapper.xml.
Nota: Los métodos definidos en la interfaz empresarial no se pueden sobrecargar, porque cuando se configura a través de xml, la instrucción SQL para la configuración del método solo mira el nombre del método.
como sigue:
public interface EmployeeMapper {
//通过id查找员工
Employee queryById(Integer id);
//通过id name 查找员工
Employee queryById(Integer id,String name);
}
Debido a que se utiliza el mismo nombre de método, se producirán problemas cuando xml encapsule declaraciones SQL basadas en el nombre del método.
2. Utilice ${ key } y #{ key } para pasar parámetros
Código de caso:
<!-- 通过#{key}传入参数 -->
<select id="queryById" resultType="com.alphamilk.pojo.Employee">
select * from mysqltest.employee where id = #{id}
</select>
<!--通过${key} 传入参数-->
<select id="queryByName" resultType="com.alphamilk.pojo.Employee">
select * from mysqltest.employee where name = ${name}
</select>
la diferencia:
La esencia de #{key} es realizar el procesamiento de marcadores de posición y reemplazar el valor de id en el código. 【Uso recomendado】
La esencia de ${key} es empalmar cadenas, que se encapsulan en una declaración SQL completa en el código del caso.
Nota: Cuando se utiliza el valor de #{key} en su lugar, no se pueden pasar el nombre de la columna y el nombre del contenedor.
3. Implementar la función de prueba MyBatis
Para completar la función de prueba, debe implementar los siguientes pasos:
1. Crear la clase de recurso es de ibatis
2. Cree un objeto SqlSessionFactoryBuilder y realice Build (is) para obtener el objeto SqlSessionFactory
3. Obtenga SqlSession a través del método openSession del objeto SqlSessionFactory
4. Obtenga el objeto Mapper
5.Realizar la operación
6. Confirmar transacciones y cerrar flujos relacionados.
Código de caso:
public class MybatisTest {
@Test
public void Test() throws IOException {
//步骤1,读取资源
InputStream is = Resources.getResourceAsStream("mybatisConfig.xml");
//步骤2,创建sqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//步骤3,创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//步骤4,获取Mapper对象
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
//执行对应操作
Employee employee = employeeMapper.queryById(1);
System.out.println(employee);
//管理事务提交与关闭操作
sqlSession.close();
}
}
2. Entrada de datos
Conceptos de entrada de datos:
La entrada de datos aquí se refiere específicamente a la forma en que se pasan los datos cuando el método de la capa superior (como el método de Servicio) llama a la interfaz Mapper.
- Tipo simple: un tipo de datos que contiene un solo valor
- Tipos de datos básicos: int, byte, short, double,…
- Tipos de empaquetado de tipos de datos básicos: entero, carácter, doble,…
- Tipo de cadena: Cadena
- Tipo complejo: un tipo de datos que contiene múltiples valores
- Tipos de clase de entidad: Empleado, Departamento,…
- Tipos de colección: Lista, Conjunto, Mapa,…
- Tipo de matriz: int[], String[],…
- Tipo compuesto: Lista<Empleado>, la clase de entidad contiene una colección...
1. Un único tipo de datos simple
Dado que solo hay un parámetro simple, la clave en #{key} o ${key} se puede completar con cualquier valor. Por supuesto, se recomienda usar el nombre del parámetro original.
2. Tipo de objeto de entidad
Cuando los datos entrantes son un tipo de objeto de entidad, solo necesita corresponder a sus atributos uno por uno.
Caso:
3. Múltiples tipos de datos simples
Cuando hay varios parámetros en un método comercial, tenga en cuenta que la clave en #{key} o ${key} no se puede escribir aleatoriamente y no se puede ingresar directamente a través de parámetros formales. Hay dos soluciones al problema de ingresar múltiples tipos de datos simples.
3.1 Usar parámetros de anotación para resolver
Necesita usar la anotación @Param
Caso:
3.2 Usar el método secuencial para resolver
Los parámetros también se pueden hacer coincidir en el orden de arg0, arg1...
Código de caso:
4.tipo de mapa
Simplemente pase la clave = mapa
El método abstracto correspondiente a la interfaz.
int updateEmployeeByMap(Map<String, Object> paramMap);
Declaración SQL correspondiente
<update id="updateEmployeeByMap">
update t_emp set emp_salary=#{empSalaryKey} where emp_id=#{empIdKey}
</update>
escenas a utilizar
Hay muchos parámetros dispersos que deben pasarse, pero no se pueden utilizar los tipos de clase de entidad correspondientes. Usar anotaciones @Param para pasarlas una por una es demasiado engorroso. Entonces todos están encapsulados en Map.
3. Salida de datos
Concepto de salida de datos:
La salida de datos generalmente se presenta de dos formas:
- El número de filas afectadas devueltas por las operaciones de adición, eliminación y modificación: simplemente use el tipo int o long para recibirlo directamente
- Consultar resultados de operaciones de consulta.
¡Lo que debemos hacer es especificar el tipo de datos de salida de la consulta!
¡Y en el escenario de inserción, los datos de la clave principal se pueden volver a mostrar!
1. Un solo tipo simple
<!--此处的namespace修改为对应的接口全类名-->
<mapper namespace="com.alphamilk.EmployeeMapper">
<!-- resultType 对应 类型的全限定符-->
<select id="querySalaryById" resultType="java.lang.Integer">
select salary from mysqltest.employee where id = #{id}
</select>
<select id="queryNameById" resultType="java.lang.String">
select name from mysqltest.employee where id=#{id}
</select>
</mapper>
Entre los tipos simples generales, Java tiene abreviaturas correspondientes. Puede usar String int para reemplazar java.lang.String, etc.
2. Devolver objeto de clase de entidad
Devuelve el calificador completo de la clase más el nombre de la clase.
<!--此处的namespace修改为对应的接口全类名-->
<mapper namespace="com.alphamilk.EmployeeMapper">
<!-- resultType 对应 类型的全限定符-->
<select id="" resultType="com.alphamilk.pojo.Employee">
</select>
</mapper>
3. Tipo de mapa de retorno
<!-- Map<String,Object> selectEmpNameAndMaxSalary(); -->
<!-- 返回工资最高的员工的姓名和他的工资 -->
<select id="selectEmpNameAndMaxSalary" resultType="map">
SELECT
emp_name 员工姓名,
emp_salary 员工工资,
(SELECT AVG(emp_salary) FROM t_emp) 部门平均工资
FROM t_emp WHERE emp_salary=(
SELECT MAX(emp_salary) FROM t_emp
)
</select>
4. Tipo de lista de devolución
<!-- List<Employee> selectAll(); -->
<select id="selectAll" resultType="com.atguigu.mybatis.entity.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary
from t_emp
</select>
5. Devolver el valor de la clave principal
<!-- int insertEmployee(Employee employee); -->
<!-- useGeneratedKeys属性字面意思就是“使用生成的主键” -->
<!-- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性 -->
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="empId">
insert into t_emp(emp_name,emp_salary)
values(#{empName},#{empSalary})
</insert>
4. Alias
Dado que el contenido que se debe completar al generar el valor de retorno incluye el calificador completo de la clase, esta operación es problemática, por lo que Java viene con 72 alias predeterminados. Por ejemplo, java.lang.String se puede escribir directamente como String, etc. Pero para los tipos de objetos de entidad generales, no existe
1.xml establecer alias
Configurar en MyBatis-config.xml
alias único
Código de caso:
<typeAliases>
<!-- 单个xml配置-->
<typeAlias type="com.alphamilk.pojo.Employee" alias="Employee"/>
</typeAliases>
alias de envoltura
Cuando se utiliza el alias en un paquete, los alias de todas las clases del paquete corresponden a sus nombres de clase.
<typeAliases>
<!-- 包起别名-->
<package name="com.alphamilk.pojo.Employee"/>
</typeAliases>
2. Anotar alias
Si cree que la configuración en xml es muy problemática y antiestética, puede usar anotaciones para crear alias en la clase de entidad.