MyBatis (4)

1. El atributo parameterType en el archivo de mapeo Sql se pasa en el parámetro
[input / update / delete / select element input parameter] El

atributo parameterType se pasa en el parámetro
1. String + tipo básico [String — java.lang.String, int / boolean, java. lang.Integer]
2. Tipo POJO [tipo de objeto] com.wangxing.bean
. Estudiante 3. Tipo de colección [lista, hashMap]
cuando el método de la interfaz de acceso a datos tiene solo un parámetro [Cadena + tipo básico / POJO tipo], cuando hay Cuando se suelen utilizar varios parámetros [tipo de colección]
Por ejemplo:

package com.wangxing.mybatis.mapper;

import com.wangxing.mybatis.bean.Person;

import java.util.List;
import java.util.Map;

public interface PersonMapper {
    void insertPerson(Person person);
    void deletePerson(int perid);
    void deletePersonByName(String pername);
    void deletePersonByAge(int perage);
    List<Person> selectPerson(Map<String,Object> parameter);
}
Sql映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangxing.mybatis.mapper.PersonMapper">
    <!--测试parameterType属性为POJO类型-->
  <insert id="insertPerson" parameterType="com.wangxing.mybatis.bean.Person">
      insert into t_person values(null,#{pername},#{perage},#{peraddress});
  </insert>
    <!--测试parameterType属性为基本类型-->
  <delete id="deletePerson"  parameterType="int">
      delete from  t_person where per_id = #{perid};
  </delete>
    <!--测试parameterType属性为String类型-->
  <delete id="deletePersonByName" parameterType="java.lang.String">
       delete from  t_person where per_name = #{pername};
  </delete>
    <!--测试parameterType属性为基本类型的封装类类型-->
  <delete id="deletePersonByAge" parameterType="java.lang.Integer">
       delete from  t_person where per_age = #{perage};
  </delete>
    <resultMap id="personMap" type="com.wangxing.mybatis.bean.Person">
        <id column="per_id" property="perid"></id>
        <result column="per_name" property="pername"></result>
        <result column="per_age" property="perage"></result>
        <result column="per_address" property="peraddress"></result>
    </resultMap>
    <!--测试parameterType属性为集合类型-->
    <select id="selectPerson" parameterType="hashMap" resultMap="personMap">
        select * from t_person where per_id=#{id} or per_name=#{name} or per_age=#{age};
    </select>
</mapper>
测试类
package com.wangxing.mybatis.test;

import com.wangxing.mybatis.bean.Person;
import com.wangxing.mybatis.mapper.PersonMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.util.HashMap;
import java.util.List;

public class TestMain {
    /**
     * 得到SqlSession
     * @return
     */
    public static SqlSession  getSqlSession()throws  Exception{
        SqlSession sqlSession=null;
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        return sqlSessionFactory.openSession();
    }

    /**
     * 测试parameterType属性为POJO类型
     */
    public static  void testInsertPerson(){
        SqlSession  sqlSession=null;
        try{
            sqlSession=getSqlSession();
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            Person person=new Person();
            person.setPername("java");
            person.setPerage(20);
            person.setPeraddress("西安");
            personMapper.insertPerson(person);
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            sqlSession.close();
        }
    }
    /**
     * 测试parameterType属性为集合类型
     */
    public static  void testSelectPerson(){
        SqlSession  sqlSession=null;
        try{
            sqlSession=getSqlSession();
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            HashMap<String,Object> parameter=new HashMap<String,Object>();
            parameter.put("id",3);
            parameter.put("name","wangwu");
            parameter.put("age",20);
            List<Person> personList=personMapper.selectPerson(parameter);
            sqlSession.commit();
            for(Person person:personList){
                System.out.println(person.getPerid()+"\t"+person.getPername());
            }
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            sqlSession.close();
        }
    }

    /**
     * 测试parameterType属性为String+基本类型
     */
    public static  void testDeletePerson(){
        SqlSession  sqlSession=null;
        try{
            sqlSession=getSqlSession();
            PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
            //personMapper.deletePerson(5);
            //personMapper.deletePersonByName("wangwu");
            personMapper.deletePersonByAge(23);
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            sqlSession.close();
        }
    }
    public static void main(String[] args) {
        //testInsertPerson();
        //testSelectPerson();
        testDeletePerson();
    }
}

2. #{}y ${}uso
en el archivo de mapeo mybatis [archivo de mapeo de sql], los parámetros se pasan de dos formas. Uno es # {} y el otro es $ {}. Hay una gran diferencia entre los dos:
# {} implementa el preprocesamiento de sentencias sql, y ¿se usa en el sql que se ejecuta más tarde? Número en su lugar. No es necesario prestar atención al tipo de datos del parámetro al usarlo. Mybatis implementará automáticamente la conversión de tipos de datos y puede evitar la inyección de SQL.
$ {} implementa la operación de empalme de declaraciones SQL, sin conversión de tipo de datos, debe juzgar el tipo de datos usted mismo y no puede evitar la inyección de SQL.
Resumen: # {} marcador de posición para el paso de parámetros. $ {} se usa para la

prueba de empalme de sql :
Mybatis-config.xml establece la declaración de sql para que se genere en la consola

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
测试#{}的使用
package com.wangxing.mybatis.mapper;

import com.wangxing.mybatis.bean.Person;

import java.util.List;
import java.util.Map;

public interface PersonMapper {
     List<Person> selectPersonByName1(String pername);
}

Archivo de mapeo SQL

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangxing.mybatis.mapper.PersonMapper">
    <resultMap id="personMap" type="com.wangxing.mybatis.bean.Person">
        <id column="per_id" property="perid"></id>
        <result column="per_name" property="pername"></result>
        <result column="per_age" property="perage"></result>
        <result column="per_address" property="peraddress"></result>
    </resultMap>
    <select id="selectPersonByName1" parameterType="java.lang.String" resultMap="personMap">
        select * from t_person where per_name like  #{pername}
    </select>
 </mapper>

Código de prueba

public static  void selectPersonByName1(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        List<Person> personList=personMapper.selectPersonByName1("%j%");
        sqlSession.commit();
        for(Person person:personList){
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

resultado de la operación:
Inserte la descripción de la imagen aquí

Se puede ver que # {} es el preprocesamiento de la ejecución de sentencias SQL. Al usar marcadores de posición para pasar parámetros para ejecutar sentencias SQL, la conversión del tipo de datos se realiza automáticamente y se puede prevenir la inyección SQL.
Pruebe el uso de $ {}

package com.wangxing.mybatis.mapper;
import com.wangxing.mybatis.bean.Person;
import java.util.List;
import java.util.Map;
public interface PersonMapper {
      List<Person> selectPersonByName2(Map<String,Object> pername);
}

Archivo de mapeo SQL

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wangxing.mybatis.mapper.PersonMapper">
    <resultMap id="personMap" type="com.wangxing.mybatis.bean.Person">
        <id column="per_id" property="perid"></id>
        <result column="per_name" property="pername"></result>
        <result column="per_age" property="perage"></result>
        <result column="per_address" property="peraddress"></result>
    </resultMap>
    <select id="selectPersonByName2" parameterType="hashMap" resultMap="personMap">
        select * from t_person where per_name like  ${name};
    </select>
</mapper>

Código de prueba

/**
 * 测试sql语句中通过${}方式接收参数值
 */
public static  void selectPersonByName2(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        HashMap<String,Object> pername=new HashMap<String,Object>();
        pername.put("name","'%j%'");
        List<Person> personList=personMapper.selectPersonByName2(pername);
        sqlSession.commit();
        for(Person person:personList){
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

resultado de la operación
Inserte la descripción de la imagen aquí

Se puede ver que $ {} es la ejecución de empalme de declaraciones SQL, no implementa automáticamente la conversión de tipos de datos y no evita la inyección SQL.
3. ¿Por qué utilizar SQL dinámico?
Si tiene experiencia en el uso de JDBC u otros marcos similares, puede apreciar lo doloroso que es empalmar declaraciones SQL de acuerdo con diferentes condiciones. Al empalmar, asegúrese de no olvidar los espacios necesarios y también preste atención a omitir la coma al final de la lista de nombres de columna.
El uso de la función de SQL dinámico puede eliminar completamente este dolor.
P.ej:

String insertsql="insert into t_user values(null,'"+userbean.getUsername()+
			"',"+userbean.getUserage()+","+userbean.isUsersex()+
			",'"+userbean.getUseraddress()+"','"+userbean.getUserday()+"');";

5. ¿Cuáles son los SQL dinámicos más utilizados y cómo se utilizan?
si
elija (cuando, de lo contrario)
trim (donde, establezca)
foreach
prueba cada elemento para lograr la adición de lote / eliminación
de lote de adición de lote en declaraciones Sql

INSERT INTO `t_person` VALUES (6,'java',20,'西安'),(7,'javaee',21,'西安');

Eliminación de lotes en declaración SQL

delete from t_person where per_id in(6,7);

elemento foreach

 <foreach collection="list【表示需要被遍历的数据结合】" 
item="从collection对应的集合中得到的每一个数据对象【java对象】" 
separator="数据对象【java对象】的分隔符">
	    	每一个具体的数据对象
</foreach>

para cada elemento, realice
la interfaz de acceso de datos de adición por lotes

package com.wangxing.mybatis.mapper;

import com.wangxing.mybatis.bean.Person;

import java.util.List;
import java.util.Map;

public interface PersonMapper {
    void insertPersonForeach(List<Person> personList);
}
SQL映射文件
<insert id="insertPersonForeach" parameterType="java.util.List">
    insert into t_person values
    <foreach collection="list" item="person" separator=",">
        (null,#{person.pername},#{person.perage},#{person.peraddress})
    </foreach>
</insert>

Código de prueba

/**
 * 测试foreach元素,实现批量添加
 */
public static  void insertPersonForeach(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        personMapper.insertPersonForeach(getPersonList());
        sqlSession.commit();
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

Resultados de la prueba

para cada elemento, realice
la interfaz de acceso a datos de eliminación por lotes

package com.wangxing.mybatis.mapper;
import com.wangxing.mybatis.bean.Person;
import java.util.List;
import java.util.Map;
public interface PersonMapper {
        void deletePersonForeach(List<Integer> perids);
}

Archivo de mapeo SQL

<delete id="deletePersonForeach" parameterType="java.util.List">
    delete from t_person where per_id in
    <foreach collection="list" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>

Código de prueba

/**
 * 测试foreach元素,实现批量删除
 */
public static  void deletePersonForeach(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        List<Integer> perids=new ArrayList<Integer>();
        perids.add(8);
        perids.add(9);
        perids.add(10);
        perids.add(11);
        personMapper.deletePersonForeach(perids);
        sqlSession.commit();
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

resultado de la operación
Inserte la descripción de la imagen aquí

Prueba si el elemento

package com.wangxing.mybatis.mapper;
import com.wangxing.mybatis.bean.Person;
import java.util.List;
import java.util.Map;
public interface PersonMapper {
    List<Person> selectPersonByIf(Map<String,Object> pername);
}

<resultMap id="personMap" type="com.wangxing.mybatis.bean.Person">
    <id column="per_id" property="perid"></id>
    <result column="per_name" property="pername"></result>
    <result column="per_age" property="perage"></result>
    <result column="per_address" property="peraddress"></result>
</resultMap>
<select id="selectPersonByIf" parameterType="hashMap" resultMap="personMap">
    select * from t_person where 1=1
    <if test="name !=null and name !=''">
        and  per_name like #{name}
    </if>
</select>

/**
 * 测试if元素,判断是否有用户名,如果有就根据用户名模糊查询,如果没有就查询所有
 */
public static  void selectPersonByIf(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        HashMap<String,Object> pername=new HashMap<String,Object>();
        pername.put("name",null);
        List<Person> personList=personMapper.selectPersonByIf(pername);
        sqlSession.commit();
        for(Person person:personList){
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

En caso afirmativo, consulta aproximada basada en el nombre de usuario
Inserte la descripción de la imagen aquí

Si no, marque todo
Inserte la descripción de la imagen aquí

Prueba elegir (cuando, de lo contrario)
[Solo coincide con una condición a la vez]
Requisitos: Consultar información de usuario, si se ingresa el nombre de usuario, realizar una búsqueda aproximada basada en el nombre de usuario, regresar
Si se ingresa la edad, realizar una búsqueda coincidente según la edad, devuelva
si ingresó Dirección, realice una búsqueda aproximada de acuerdo con la dirección y regrese.
Si las condiciones de la consulta están vacías, consulte todas.
Algo similar a la declaración de Switch

package com.wangxing.mybatis.mapper;

import com.wangxing.mybatis.bean.Person;

import java.util.List;
import java.util.Map;

public interface PersonMapper {
     List<Person> selectPersonByChoose(Map<String,Object> pername);

}

<resultMap id="personMap" type="com.wangxing.mybatis.bean.Person">
    <id column="per_id" property="perid"></id>
    <result column="per_name" property="pername"></result>
    <result column="per_age" property="perage"></result>
    <result column="per_address" property="peraddress"></result>
</resultMap>
<select id="selectPersonByChoose" parameterType="hashMap" resultMap="personMap">
    select * from t_person where 1=1
    <choose>
        <when test="name !=null and name !=''">and  per_name like #{name}</when>
        <when test="age !=0 and age !=null">and  per_age=#{age}</when>
        <when test="address !=null and address !=''">and  per_address like #{address}</when>
        <otherwise></otherwise>
    </choose>
</select>

/**
 * 测试choose (when, otherwise)元素
 */
public static  void selectPersonByChoose(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        HashMap<String,Object> pername=new HashMap<String,Object>();
        pername.put("name",null);
        pername.put("age",24);
        pername.put("address","xian");
        List<Person> personList=personMapper.selectPersonByChoose(pername);
        sqlSession.commit();
        for(Person person:personList){
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

resultado de la operación
Inserte la descripción de la imagen aquí

Prueba donde el elemento

package com.wangxing.mybatis.mapper;
import com.wangxing.mybatis.bean.Person;
import java.util.List;
import java.util.Map;
public interface PersonMapper {
       List<Person> selectPersonByWhere(Map<String,Object> pername);
}

<resultMap id="personMap" type="com.wangxing.mybatis.bean.Person">
    <id column="per_id" property="perid"></id>
    <result column="per_name" property="pername"></result>
    <result column="per_age" property="perage"></result>
    <result column="per_address" property="peraddress"></result>
</resultMap>
<select id="selectPersonByWhere" parameterType="hashMap" resultMap="personMap">
    select * from t_person
    <where>
        <if test="name !=null and name !=''">
            and  per_name like #{name}
        </if>
        <if test="age !=0 and age !=null">
            and  per_age=#{age}
        </if>
        <if test="address !=null and address !=''">
            and  per_address like #{address}
        </if>
    </where>
</select>

/**
 * 测试where元素
 */
public static  void selectPersonByWhere(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        HashMap<String,Object> pername=new HashMap<String,Object>();
        pername.put("name",null);
        pername.put("age",23);
        pername.put("address","xian");
        List<Person> personList=personMapper.selectPersonByWhere(pername);
        sqlSession.commit();
        for(Person person:personList){
            System.out.println(person.getPerid()+"\t"+person.getPername());
        }
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

Elemento del conjunto de prueba

package com.wangxing.mybatis.mapper;

import com.wangxing.mybatis.bean.Person;

import java.util.List;
import java.util.Map;

public interface PersonMapper {
    void updatePerson(Map<String,Object> pername);
}

<update id="updatePerson" parameterType="hashMap">
    update  t_person
    <set>
        <if test="name !=null and name !=''">
            per_name = #{name},
        </if>
        <if test="age !=null and age !=0">
            per_age = #{age},
        </if>
        <if test="address !=null and address !=''">
            per_address = #{address},
        </if>
    </set>
    <where>per_id = #{id}</where>
</update>

/**
 * 测试set元素
 */
public static  void updatePerson(){
    SqlSession  sqlSession=null;
    try{
        sqlSession=getSqlSession();
        PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);
        HashMap<String,Object> pername=new HashMap<String,Object>();
        pername.put("id",12);
        pername.put("name",null);
        pername.put("age",33);
        pername.put("address","西安");
        personMapper.updatePerson(pername);
        sqlSession.commit();
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/guoguo0717/article/details/109582500
Recomendado
Clasificación