Revisão do Mybatis (incluindo aplicativos básicos, proxy dinâmico do Mapper, várias condições de consulta, SQL dinâmico, consulta de relacionamento, cache)

1. Aplicação básica

1.1 Importar pacotes jar relacionados ou importações Maven

Observe que a versão do MySQL precisa corresponder ao pacote jar.
mysql-connector-java-8.0.17.jar corresponde a MySQL8.0 e superior, e 5.7 corresponde a 5.7.
Ao mesmo tempo, 8.0.17 precisa prestar atenção ao driver e ao serverTimezone

 jdbc.driver=com.mysql.cj.jdbc.Driver 
 ?serverTimezone=UTC

insira a descrição da imagem aqui

1.2 Definir Classes de Entidade

@Data
public class Student {
    
    
	private Integer id;
	private String name;
	private int age;
	private double score;
	private String time;
}

1.3 Banco de Dados

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `score` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

1.4 Definir interface e arquivo de mapeamento

public interface IStudentDao {
    
    
	void insertStu(Student student);
}
<?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="test">
	<!-- parameterType属性可以省略 -->
	<insert id="insertStudent" parameterType="Student">
		insert into student(name,age,score,time) values(#{name}, #{age}, #{score},#{time,jdbcType=DATE})
	</insert>
</mapper>

1.5 Definir o arquivo de configuração

<?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>
	<!-- 注册DB连接四要素属性文件 -->
	<properties resource="jdbc_mysql.properties"/>
	<!-- 定义类型别名 -->
	<typeAliases>
		<!-- <typeAlias type="com.rose.beans.Student" alias="Student"/> -->
		<!-- 将指定包中所有类的简单类名当作其别名 -->
		<package name="com.rose.beans"/>
	</typeAliases>
	
	<!-- 配置运行环境 -->
	<environments default="testEM">
		<environment id="testEM">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.user}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>
		</environment>
	</environments>
	
	<!-- 注册映射文件 -->
	<mappers>
		<mapper resource="com/rose/dao/mapper.xml"/>
	</mappers>
	
</configuration>

1.6 Defina a classe de implementação de Dao e teste

public class StudentDaoImpl implements IStudentDao {
    
    

	private SqlSession sqlSession;

	@Override
	public void insertStu(Student student) {
    
    
		try {
    
    
			sqlSession = MyBatisUtils.getSqlSession();
			sqlSession.insert("insertStudent", student);
			sqlSession.commit();
		} finally {
    
    
			if(sqlSession != null) {
    
    
				sqlSession.close();
			}
		}
	}
}
public class MyTest {
    
    
	private IStudentDao dao;

	@Before
	public void before() {
    
    
		dao = new StudentDaoImpl();
	}
	
	@Test
	public void testInsert() {
    
    
		Student student = new Student("rose3", 23, 93.5);
		dao.insertStu(student);
	}
	
}

2. A diferença entre $ e #

# é um espaço reservado e $ é um caractere de emenda de string.
A emenda de string é emendar diretamente o valor do parâmetro na instrução SQL de maneira codificada. String splicing causará dois problemas: injeção de SQL e baixa eficiência de execução causada por não usar pré-compilação

3. Proxy dinâmico do mapeador

No exemplo anterior, foi descoberto um problema ao implementar a classe de interface Dao: a classe de implementação de Dao não fez nenhum trabalho substantivo, apenas localiza a instrução SQL correspondente ao id no mapeador de arquivo de mapeamento por meio da API relevante de SqlSession. As operações são feitas através do SQL do Mapper.
Portanto, Mybatis pode abandonar a classe de implementação do Dao e usar o proxy dinâmico diretamente sem escrever a classe de implementação do Dao.
Simplificando, localize o arquivo de mapeamento pelo nome da interface

<mapper namespace="com.rose.dao.IStudentDao">
</mapper>
	

4. Múltiplas condições de consulta

4.1 Encapsular vários parâmetros em um mapa

List<Student> selectStudentByMap(Map<String,object> map);

4.2 Vários parâmetros são aceitos um por um

List<Student> selectStudentByConditions(String name,int age);

5. SQL dinâmico

SQL dinâmico é usado para resolver a situação onde a consulta é difícil ou incerta; durante a execução do programa, a consulta é realizada de acordo com as condições de consulta submetidas pelo usuário. As condições de consulta enviadas são diferentes e as instruções SQL executadas são diferentes. Se você escrever sql para cada caso separadamente, a carga de trabalho será pesada. SQL dinâmico pode ser usado.
As tags SQL dinâmicas comuns são

public interface IStudentDao {
    
    
	List<Student> selectStudentsByIf(Student student);
	List<Student> selectStudentsByWhere(Student student);
	List<Student> selectStudentsByChoose(Student student);
	List<Student> selectStudentsByForeach(int[] ids);
	List<Student> selectStudentsByForeach2(List<Integer> ids);
	List<Student> selectStudentsByForeach3(List<Student> ids);
	List<Student> selectStudentsBySqlFragment(List<Student> ids);
}
<mapper namespace="com.rose.dao.IStudentDao">
	
	<select id="selectStudentsByIf" resultType="Student">
		select id,name,age,score 
		from student 
		where 1 = 1
		<if test="name != null and name != ''">
			and name like '%' #{name} '%'
		</if>
		<if test="age > 0">
			and age > #{age}
		</if>
	</select>
	
	<select id="selectStudentsByWhere" resultType="Student">
		select id,name,age,score 
		from student 
		<where>
			<if test="name != null and name != ''">
				and name like '%' #{name} '%'
			</if>
			<if test="age > 0">
				and age > #{age}
			</if>
		</where>
	</select>
	
	<select id="selectStudentsByChoose" resultType="Student">
		select id,name,age,score 
		from student 
		<where>
			<choose>
				<when test="name != null and name !=''">
					and name like '%' #{name} '%'
				</when>
				<when test="age > 0">
					and age > #{age}
				</when>
				<otherwise>
					1 = 2
				</otherwise>
			</choose>
		</where>
	</select>
	
	<select id="selectStudentsByForeach" resultType="Student">
		<!-- select id,name,age,score from student where id in (1,3,5) -->
		select id,name,age,score 
		from student 
		<if test="array.length > 0">
			where id in 
			<foreach collection="array" item="myid" open="(" close=")" separator=",">
				#{myid}
			</foreach>
		</if>
	</select>
	
	<select id="selectStudentsByForeach2" resultType="Student">
		<!-- select id,name,age,score from student where id in (1,3,5) -->
		select id,name,age,score 
		from student 
		<if test="list.size > 0">
			where id in 
			<foreach collection="list" item="myid" open="(" close=")" separator=",">
				#{myid}
			</foreach>
		</if>
	</select>
	
	<select id="selectStudentsByForeach3" resultType="Student">
		<!-- select id,name,age,score from student where id in (1,3,5) -->
		select id,name,age,score 
		from student 
		<if test="list.size > 0">
			where id in 
			<foreach collection="list" item="stu" open="(" close=")" separator=",">
				#{stu.id}
			</foreach>
		</if>
	</select>
	
	<select id="selectStudentsBySqlFragment" resultType="Student">
		<!-- select id,name,age,score from student where id in (1,3,5) -->
		select <include refid="selectColumns"/>
		from student 
		<if test="list.size > 0">
			where id in 
			<foreach collection="list" item="stu" open="(" close=")" separator=",">
				#{stu.id}
			</foreach>
		</if>
	</select>
	
	<sql id="selectColumns">
		id,name,age,score 
	</sql>
	
</mapper>

6. Consulta de relacionamento

6.1 Um-para-muitos

A consulta de associação um-para-muitos vale a pena consultar uma parte e, ao mesmo tempo, consultar todos os objetos de várias partes associados a ela. O que se segue é uma demonstração um-para-muitos entre o País e o Ministro.

public class Country {
    
    
	private Integer cid;
	private String cname;
	// 关联属性
	private Set<Minister> ministers;
}
public class Minister {
    
    
	private Integer mid;
	private String mname;
}

Use a coleção resultMap para colocar várias partes na coleção

<mapper namespace="com.rose.dao.ICountryDao">
	
	<resultMap type="Country" id="countryMapper">
		<id column="cid" property="cid"/>
		<result column="cname" property="cname"/>
		<collection property="ministers" ofType="Minister">
			<id column="mid" property="mid"/>
			<result column="mname" property="mname"/>
		</collection>
	</resultMap>
	
	<select id="selectCountryById" resultMap="countryMapper">
		select cid,cname,mid,mname
		from country,minister
		where countryId=cid and cid=#{xxx} 
	</select>
	
</mapper>

6.2 Muitos para um

public class Minister {
    
    
	private Integer mid;
	private String mname;
	// 关联属性
	private Country country;
}

usar associação

<mapper namespace="com.rose.dao.IMinisterDao">
	
	<resultMap type="Minister" id="ministerMapper">
		<id column="mid" property="mid"/>
		<result column="mname" property="mname"/>
		<association property="country" javaType="Country">
			<id column="cid" property="cid"/>
			<result column="cname" property="cname"/>
		</association>
	</resultMap>
	
	<select id="selectMinisterById" resultMap="ministerMapper">
		select mid,mname,cid,cname
		from minister, country
		where countryId=cid and mid=#{xxx}
	</select>
	
</mapper>

7. Cache

7.1 Cache nível 1

O cache de consulta de nível 1 do Mybatis é essencialmente um cache local baseado em HashMap e seu escopo é SqlSession. Execute a mesma instrução de consulta sql duas vezes na mesma SqlSession. Após a primeira execução, o resultado da consulta será gravado no cache e os dados serão obtidos diretamente do cache pela segunda vez. não consultar o banco de dados.

Quando uma sqlsession termina, a consulta de primeiro nível na sqlsession não existe mais. O cache de primeiro nível de mybatis é ativado por padrão e não pode ser desativado.

Adicionar, excluir e modificar operações, independentemente de sqlSession.commit() ser enviado, limpará o cache de consulta de primeiro nível e fará com que a consulta seja selecionada no banco de dados novamente.

7.2 Cache L2

(1) As classes de entidade envolvidas são necessárias para implementar a interface java.io.Serializable
(2) Adicionar rótulos ao mapa do mapeador

<cache/>  

Acho que você gosta

Origin blog.csdn.net/qq_21561833/article/details/124767454
Recomendado
Clasificación