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语句的主要内容,如果未能解决你的问题,请参考以下文章