一、select 标签
select标签是最常用也是功能最强大的 SQL 语言,用于执行查询操作。select 标签中常用的属性。
例如以下id 为 selectAllWebsite 的映射语句,parameterType参数类型为 string,resultType返回结果类型为 Website
该语句中参数的传递使用#{参数名}
,相当于告诉 MyBatis 生成 PreparedStatement 参数。对于 熟悉JDBC 技术的人来说,PreparedStatement 参数非常熟悉,它是预编译,该参数会被标识为“?”。以上 SQL 语句可以使用 JDBC 实现,实现代码如下。
二、传递多个参数
给映射器传递多个参数分为以下三种方法。使用Map传递参数,使用注解传递参数,使用JavaBean传递参数
2.1. 使用Map传递参数
1》复制【mybatis映射器】这节的项目全部代码,生成新的项目mybatisDemoA3,打开项目中的WebsiteMapper.xml文件 ,在原来文件内容的基础上,添加以下内容 :
<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByMap" resultType="net.biancheng.po.Website"
parameterType="map">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>
2》打开net.biancheng.mapper包下的WebsiteMapper.java类文件 ,向其中增加以下方法:
public List<Website> selectWebsiteByMap(Map<String, String> params);
3》在net.biancheng.test包中创建测试类testmap,代码如下:
package net.biancheng.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.biancheng.mapper.WebsiteMapper;
import net.biancheng.po.Website;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class testMap {
public static void main(String[] args) {
InputStream config;
try {
//读取配置文件
config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
.build(config);
//创建sqlsession对象
SqlSession ss = ssf.openSession();
WebsiteMapper websiteMapper = ss.getMapper(WebsiteMapper.class);
//创建map对象
Map<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put("name","编程");
paramsMap.put("url","biancheng");
//执行指定方法
List<Website> list= websiteMapper.selectWebsiteByMap(paramsMap);
if(list.size()!=0){
for (Website site : list) {
System.out.println(site.show());
}
}else{
System.out.println("没有查到符合条件的记录.");
}
ss.commit();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行程序,结果如下:
因数据库确定没有满足name和url条件的记录,所以显示没有找到。
使用 Map 传递参数虽然简单易用,但是由于这样设置参数需要键值对应,业务关联性不强,开发人员需要深入到程序中看代码,造成可读性下降
2.2 使用注解传递参数
这是使用 MyBatis 的注解 @Param() 传递参数
1》打开项目中的WebsiteMapper.xml文件 ,在原来文件内容的基础上,添加以下内容
<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByAn" resultType="net.biancheng.po.Website">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>
2》打开net.biancheng.mapper包下的WebsiteMapper.java类文件 ,向其中增加以下方法:
public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);
最后文件内容如图:
3》在net.biancheng.test包中创建测试类testByAn,代码如下:
package net.biancheng.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import net.biancheng.mapper.WebsiteMapper;
import net.biancheng.po.Website;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class testByAn {
public static void main(String[] args) {
InputStream config;
try {
//读取配置文件
config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
.build(config);
//创建sqlsession对象
SqlSession ss = ssf.openSession();
WebsiteMapper websiteMapper = ss.getMapper(WebsiteMapper.class);
//执行指定方法,并传递2个参数name及url的值
List<Website> list= websiteMapper.selectWebsiteByAn("太空","https://www.tm.net/");
if(list.size()!=0){
for (Website site : list) {
System.out.println(site.show());
}
}else{
System.out.println("没有查到符合条件的记录.");
}
ss.commit();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行程序,结果显示如下:
在此找到了符合条件name和url的记录
注意:当我们把参数传递给后台时,MyBatis 通过 @Param 提供的名称就会知道 #{name} 代表 name 参数,提高了参数可读性。但是如果这条 SQL 拥有 10 个参数的查询,就会造成可读性下降,增强了代码复杂性。
2.3 使用JavaBean传递参数
在参数过多的情况下,MyBatis 允许组织一个 JavaBean,通过简单的 setter 和 getter 方法设置参数,提高可读性
1》打开项目中的WebsiteMapper.xml文件 ,在原来文件内容的基础上,添加以下内容:
<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByBean" resultType="net.biancheng.po.Website">
SELECT
id,NAME,url,country FROM website
WHERE name LIKE CONCAT
('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>
2》打开net.biancheng.mapper包下的WebsiteMapper.java类文件 ,向其中增加以下方法:
public List<Website> selectWebsiteByBean(Website website);
最后WebsiteMapper.java文件内容如下:
3》在net.biancheng.test包中创建测试类testByBean,代码如下:
package net.biancheng.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import net.biancheng.mapper.WebsiteMapper;
import net.biancheng.po.Website;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class testByBean {
public static void main(String[] args) {
InputStream config;
try {
//读取配置文件
config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
.build(config);
//创建sqlsession对象
SqlSession ss = ssf.openSession();
WebsiteMapper websiteMapper = ss.getMapper(WebsiteMapper.class);
//执行指定方法,并传递Website这个对象
Website ws=new Website();
ws.setName("太空");
ws.setUrl("https://www.tm.net/");
List<Website> list= websiteMapper.selectWebsiteByBean(ws);
if(list.size()!=0){
for (Website site : list) {
System.out.println(site.show());
}
}else{
System.out.println("没有查到符合条件的记录.");
}
ss.commit();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
项目结构如图:
注意:以上都没有更改项目中的mybatis-config.xml文件
程序运行的结果如下:
下节继续