Operación CRUD de Mybatis_day2_Mybatis

Mybatis realiza operaciones CRUD basadas en proxy dinámico

  • Requisitos de uso:
  1. La configuración de mapeo de la interfaz de la capa de persistencia (UserDao) y la interfaz de la capa de persistencia deben estar en el mismo paquete
  2. El valor del atributo de espacio de nombres de la etiqueta del mapeador en la configuración de mapeo de la capa de persistencia debe ser el nombre de clase completo de la interfaz de la capa de persistencia
  3. <select>,<insert>,<delete>,<update>El atributo id de la etiqueta de configuración de la instrucción SQL debe ser el mismo que el nombre del método de la interfaz de la capa de persistencia.



Consulta por ID

  1. Agregue el método findById en la interfaz de la capa de persistencia
/**   * 根据 id 查询   * @param userId 
  * @return 
  */  
  User findById(Integer userId);

  1. Configurado en el perfil de mapeo del usuario
<!-- 根据 id 查询 --> 
<select id="findById" resultType="cn.myp666.domain.User" parameterType="int">
	select * from user where id = #{uid} 
</select> 

Detalles:

  • Atributo resultType: se utiliza para especificar el tipo de conjunto de resultados.

  • Parámetro atributo: se utiliza para especificar el tipo del parámetro entrante.

  • El carácter # {} se usa en la instrucción sql:

    • Representa un marcador de posición, equivalente a jdbc ?, Que se utilizan para reemplazar los datos reales cuando se ejecuta la instrucción.
    • Los datos específicos están determinados por el contenido en # {}.
  • Cómo escribir contenido en # {}:

    • Como el tipo de datos es básico, puede escribirlo aquí a voluntad.

  1. Agregar prueba en clase de prueba
/**
* 
* <p>Title: MybastisCRUDTest</p>
* <p>Description: 测试 mybatis 的 crud 操作</p>
*
*/
public class MybastisCRUDTest {
private InputStream in ;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;

@Test
public void testFindOne() {
//6.执行操作
	User user = userDao.findById(41);
	System.out.println(user);
}


@Before//在测试方法执行之前执行
public void init()throws Exception {
//1.读取配置文件
	in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建构建者对象
	SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建 SqlSession 工厂对象
	factory = builder.build(in);
//4.创建 SqlSession 对象
	session = factory.openSession();
//5.创建 Dao 的代理对象
	userDao = session.getMapper(IUserDao.class);
}

@After//在测试方法执行完成之后执行
public void destroy() throws Exception{
	session.commit();
//7.释放资源
	session.close();
	in.close();
}
}



Guardar operación

  1. Agregue nuevos métodos en la interfaz de la capa de persistencia
/**
* 保存用户
* @param user
* @return 影响数据库记录的行数
*/
int saveUser(User user);

  1. Configurado en el perfil de mapeo del usuario
<!-- 保存用户-->
<insert id="saveUser" parameterType="cn.myp666.domain.User">
	insert into user(username,birthday,sex,address) 
values(#{username},#{birthday},#{sex},#{address})
</insert>

Detalles:

  • Atributo parámetroType:
    representa el tipo del parámetro, porque estamos pasando un objeto de una clase, por lo que el tipo se escribe con el nombre completo de la clase.

  • El carácter # {} se usa en la instrucción sql:
    representa un marcador de posición, equivalente a jdbc?, Y se usa para reemplazar los datos reales al ejecutar la declaración.
    Los datos específicos están determinados por el contenido en # {}.

  • Cómo escribir contenido en # {}:
    Dado que el parámetro de nuestro método de guardado es un objeto Usuario, necesitamos escribir el nombre del atributo en el objeto Usuario.
    Utiliza expresiones ognl.

  • expresión ognl:

    • Es un lenguaje de expresión proporcionado por Apache, el nombre completo es:
      Lenguaje de navegación gráfica de objetos Lenguaje de navegación gráfica de objetos
      Obtiene datos de acuerdo con cierto formato gramatical.
    • El formato de sintaxis es usar # {
      object.object} # {user.username} Primero encontrará el objeto de usuario, luego encontrará el atributo de nombre de usuario en el objeto de usuario y llamará al
      método getUsername () para recuperar el valor. Pero especificamos el nombre de la clase de entidad en el atributo parameterType, por lo que podemos omitir el usuario
      y escribir el nombre de usuario directamente.

  1. Agregar método de prueba en clase de prueba
@Test
public void testSave(){
	User user = new User();
	user.setUsername("modify User property");
	user.setAddress("北京市顺义区");
	user.setSex("男");
	user.setBirthday(new Date());
	System.out.println("保存操作之前:"+user);
//5.执行保存方法
	userDao.saveUser(user);
	System.out.println("保存操作之后:"+user);
}

Abra la base de datos Mysql y descubrió que no se han agregado registros, ¿cuál es la razón?
Esto es lo mismo que jdbc. Debemos controlar el envío de transacciones al implementar adiciones, eliminaciones y cambios, entonces, ¿cómo controlar el
envío de transacciones en mybatis ?
Puede usar: session.commit();para lograr la confirmación de la transacción. El código después de unirse a la transacción es el siguiente:

@After//在测试方法执行完成之后执行
public void destroy() throws Exception{
	session.commit();
//7.释放资源
	session.close();
	in.close();
}
Extensión del problema: agregue el valor de retorno del ID de usuario
  • Después de agregar un usuario, también se devuelve el valor de identificación del nuevo usuario agregado. Debido a que el crecimiento automático de la base de datos realiza la identificación, es
    equivalente a devolver el valor de auto_increment después del nuevo aumento.
<insert id="saveUser" parameterType="USER">
<!-- 配置保存时获取插入的 id -->
<selectKey keyColumn="id" keyProperty="id" resultType="int">
	select last_insert_id();
</selectKey>
	insert into user(username,birthday,sex,address) 
values(#{username},#{birthday},#{sex},#{address})
</insert>



Actualización del usuario

  1. Agregar método de actualización en la interfaz de la capa de persistencia
/**
* 更新用户
* @param user
* @return 影响数据库记录的行数
*/
int updateUser(User user);

  1. Configurado en el perfil de mapeo del usuario
<!-- 更新用户 -->
<update id="updateUser" parameterType="cn.myp666.domain.User">
	update user set username=#{username},birthday=#{birthday},sex=#{sex},
address=#{address} where id=#{id}
</update>

  1. Agregar método de prueba actualizado
@Test
public void testUpdateUser()throws Exception{
//1.根据 id 查询
	User user = userDao.findById(52);
//2.更新操作
	user.setAddress("北京市顺义区");
	int res = userDao.updateUser(user);
	System.out.println(res);
}



Eliminar usuario

  1. Agregar y eliminar métodos en la interfaz de la capa de persistencia
/**
* 根据 id 删除用户
* @param userId
* @return
*/
int deleteUser(Integer userId);

  1. Configurado en el perfil de mapeo del usuario
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
	delete from user where id = #{uid}
</delete>

  1. Agregar eliminar método de prueba
@Test
public void testDeleteUser() throws Exception {
//6.执行操作
	int res = userDao.deleteUser(52);
	System.out.println(res);
}



Consulta difusa del usuario

  1. Agregar método de consulta difusa en la interfaz de la capa de persistencia
/**
* 根据名称模糊查询
* @param username
* @return
*/
List<User> findByName(String username);

  1. Configurado en el perfil de mapeo del usuario
<!-- 根据名称模糊查询 -->
<select id="findByName" resultType="cn.myp666.domain.User" parameterType="String">
	select * from user where username like #{username}
</select>

  1. Método de prueba con consulta difusa
@Test
 
public void testFindByName(){
//5.执行查询一个方法
 
	List<User> users = userDao.findByName("%王%");
 
	for(User user : users){
 
	System.out.println(user);
 
	}
	 
}

La salida de la instrucción SQL ejecutada en la consola es la siguiente:
Inserte la descripción de la imagen aquí

  • No agregamos% al archivo de configuración como condición para la consulta difusa, por lo tanto, al pasar el argumento de cadena, debemos proporcionar el identificador de consulta difusa%. # {Nombre de usuario} en el archivo de configuración también es solo un marcador de posición, por lo que la instrucción SQL se muestra como "?".

Otro método de configuración de consulta difusa
  • El primer paso: modificar la configuración de la instrucción SQL, la configuración es la siguiente:
<!-- 根据名称模糊查询 -->
<select id="findByName" parameterType="string" resultType="cn.myp666.domain.User">
	select * from user where username like '%${value}%'
</select>
  • Cambiamos el marcador de posición original # {} a $ {value} arriba. Tenga en cuenta que este tipo de enfoque si la consulta difusa, entonces la ${value}escritura
    método es fijo y no se puede escribir otros nombres.

  • Paso 2: prueba, como sigue:
@Test
public void testFindByName(){
 
//5.执行查询一个方法
	List<User> users = userDao.findByName("王");
	for(User user : users){
		System.out.println(user);
	}
}
  • La salida de la instrucción SQL ejecutada en la consola es la siguiente:
    Inserte la descripción de la imagen aquí
    • Se puede encontrar que no necesitamos agregar el% de caracteres coincidentes de la consulta difusa en el código del programa. El efecto de los dos métodos es el mismo, pero la instrucción ejecutada es diferente. Recomiende la primera forma

La diferencia entre # {} y $ {}:

  • # {} Representa un marcador de posición
    • El # {} se puede usar para establecer el estado de preparación en un marcador de posición y convertir automáticamente el tipo de Java y el tipo jdbc.
      # {} Puede prevenir efectivamente la inyección de SQL.
    • # {} Puede recibir valores de tipo simple o valores de atributo pojo. Si parameterType transmite un solo valor de tipo simple, # {} puede estar entre paréntesisvalue 或其它名称。
  • $ {} Indica empalmar cadena sql
    • A través de $ {}, el contenido pasado en parameterType se puede empalmar en sql sin conversión de tipo jdbc,
    • $ {} Puede recibir valores de tipo simple o valores de atributo pojo, si parameterType transmite un solo valor de tipo simple, entre paréntesis $ {}只能是 value。



Consulta usando funciones agregadas

  1. Agregar método de consulta difusa en la interfaz de la capa de persistencia
/**
* 查询总记录条数
* @return
*/
int findTotal();

  1. Configurado en el perfil de mapeo del usuario
<!-- 查询总记录条数 -->
<select id="findTotal" resultType="int">
	select count(*) from user;
</select>

  1. Método de prueba para agregar consultas agregadas
@Test
public void testFindTotal() throws Exception {
//6.执行操作
	int res = userDao.findTotal();
	System.out.println(res);
}
Publicado 94 artículos originales · elogiado 0 · visitas 2097

Supongo que te gusta

Origin blog.csdn.net/qq_16836791/article/details/104757487
Recomendado
Clasificación