MyBatis——关于SQL语句

Posted 小可爱的大笨蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis——关于SQL语句相关的知识,希望对你有一定的参考价值。

MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。

——摘自 《MyBatis中文手册》

接下来,我们将重点关注MyBatis的Mapper XML文件

首先需要添加mapper的DTD,可以在MyBatis的文档中找到。

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

一、关于Mapper.xml的配置

在配置好DTD后,就可以了使用MyBatis关于Mapper的一些标签。

1. mapper标签

  • mapper标签是最大的标签,用来定义一个mapper。
  • mapper标签只有一个属性,就是 namespace属性,用来负责实现接口绑定,接口绑定是之后的一个话题,目前可以将namespace当做一个工作空间,它由包名+类名构成(有C++的小伙伴可能更了解一点)。
  • 在mapper标签下就是一些常用的标签,比如select,insert,update,delete等。

2. 常用的select标签

select 标签是一个很常用的标签,因为它承担着大量的查询工作,以select标签举例可以更好的理解这些常用的标签。

假设现在我需要查询到数据库中所有的People的信息。那么应该有如下一条查询语句;

select * from person

首先要知道数据库的查询方式是以指针的方式查询的,也就是说在查询的时候它会从头开始往下查询,每次指针都向下移动一下。

在select标签中,提供了很多的属性,像id、resultType、resultMap、parmaterMap、parameterType等等这些属性,以上的属性也是我们会常用到的一些属性。

  • resultType属性:用来指定SQL返回的数据类型,或者说应该用什么去接SQL返回的数据。比如说查询上面的查询,我们应该返回的是一个个People对象。所以这里我们用People对象去接就可以了。
  • parameterType属性:当在查询的时候,大部分时候都是有条件的去查询,比如登录的时候,我们会根据用户输入的账号和密码去查询这个账号是否存在,这个时候就需要用到parameterType这个属性,他可以设置条件语句中使用的是什么类型的数据。可以是常见的数据类型,也可以是对象。MyBatis 提供了一些常见的 Java 类型内建的相应的类型别名。比如int可以写成_int、byte写成_byte等等。
接下来用一个例子来说明:
<?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="xyz.tulling.mapper.PeopleMapper">
	<select id="selAll" resultType="xyz.tulling.pojo.Person">
		select * from person
	</select>
</mapper>

上面是用来完成从person表中查询出所有的结果的mapper。

接下来在mybatis.xml 中进行mapper的映射。

	<mappers>
		<mapper resource="xyz/tulling/mapper/PeopleMapper.xml"/>
	</mappers>

编写一个测试类:

package xyz.tulling.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 xyz.tulling.pojo.Person;

public class Test 

	public static void main(String[] args) throws IOException 
		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		List<Person> list = session.selectList("xyz.tulling.mapper.PeopleMapper.selAll");
		for (Person person : list) 
			System.out.println(person);
		
	

此时就可以了查询到person表的所有数据。

假设现在要查询所有的性别为男的数据,我们需要重新写一个select标签:

	<select id="selBySex" parameterType="string" resultType="xyz.tulling.pojo.Person" >
		select * from person where sex=#sex
	</select>

配置好Mapper后需要重新更改一下测试类,这次加入了一个参数string,查询所有的男性。

		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		List<Person> list = session.selectList("xyz.tulling.mapper.PeopleMapper.selBySex","男");
		for (Person p : list) 
			System.out.println(p);
		

传入的类型是String,所以将parameterType设置为string,然后传入一个参数。就可以了查询到结果,结果如下:

同样的,是可以传入一个对象的,还是查询性别为男的所有Person

  • 将parameterType修改为类:如下:
	<select id="selBySex" parameterType="xyz.tulling.pojo.Person" resultType="xyz.tulling.pojo.Person" >
		select * from person where sex=#sex
	</select>

然后在测试类中新建一个Person对象,将对象作为参数传递过去:

		Person person = new Person();
		person.setSex("男");
		List<Person> list = session.selectList("xyz.tulling.mapper.PeopleMapper.selBySex",person);
		for (Person p : list) 
			System.out.println(p);
		

同样的可以查询到结果:

为了更好的观察SQL语句,我们配置一下log4j。详细看前一章节。
之后观察一下输出结果:

可以看到其实是使用了?号,也就是占位符。

  • 如果是基础数据类型,因为只有一个,所以会直接去取。
  • 如果是对象的话,就会去找这个对象中的属性。例如:使用了#sex后,就会从people这个对象中找sex属性,然后将属性值放到占位符中,之后进行查询。

以上是关于MyBatis——关于SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

mybatis教程3(映射文件)

Mybatis的XML映射文件

关于mybatis我个人的理解

关于mybatis我个人的理解

关于mybatis我个人的理解

关于mybatis我个人的理解