11.03Mybatis标签
标签内容
select
标签insert
标签update
标签delete
标签
标签的含义:
- 标签定义了
SQL
语句是查询、修改等操作。 - 定义了
Mapper
接口当中方法的返回值类型 - 定义了
Mapper
接口中的参数类型
Mybatis
的组合工作流程:
.xml
文件--->定义SQL
语句、接口调用方法的返回值、参数类型接口
--->定义可执行的方法和接收接口的对象实现类
--->三步走--->SqlSessionFactory
接口获取配置文件(全局的Mybatis
配置文件)、SqlSession
获取接口、调用接口当中的方法
select标签
select
示例:
<select id="selectAllWebsite" resulType="com.junkingboy.bean.website" parameterType="string">
SELECT id, name, url FROM website WHERE `name` LIKE CONCAT('%', #{name}, '%');
</select>
说明:
id
为selectAllWebsite
的映射语句- 参数类型为
string
- 返回值类型为指定路径下的
JavaBean
对象
注意:
- 为了使数据库的查询结果和返回值类型中的属性能够自动匹配,通常会对 MySQL 数据库和 JavaBean 采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射了(数据库表字段名和属性名不一致时需要手动映射)。
- 在
mybatis
中使用#{参数名}
进行参数传递。对于JDBC
会被标识为?
。
String sql = "SELECT id, name, url FROM website WHERE `name` LIKE CONCAT('%', ?, '%')";
Pre
select标签常用属性
属性名称 | 描 述 | 备注 |
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+id不唯一,那么 MyBatis 抛出异常 |
parameterType | 表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
| SQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一 | - |
| 它是映射集的引用,与 | 是 MyBatis 最复杂的元素,可以配置映射规则、级联、typeHandler 等 |
| 用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存 | 默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存 |
| 启动二级缓存的开关,默认值为 true,表示将査询结果存入二级缓存中 | - |
| 用于设置超时参数,单位是秒(s),超时将抛出异常 | - |
| 获取记录的总条数设定 | 默认值是数据库厂商提供的 JDBC 驱动所设置的条数 |
| 告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement)--->通常定义为 | - |
| 这是针对 JDBC 的 | - |
上述是传递一个参数进行查询。如果需要查询多个字段则有三种实现方法:
- 使用
Map
传递参数 - 使用注解传递参数
- 使用
JavaBean
传递参数
使用Map传递参数
Mybatis
框架:
<!--根据name和url进行模糊查询-->
<select id="selectWebsiteByMap" resultType="com.junkingboy.bean.website" paramterType="map">
SELECT id, name, url FROM website
WHERE name LIKE CONCAT('%', #{name}, '%')
AND url LIKE CONCAT('%', #{url}, '%');
</select>
WebsiteMapper
接口:
public List<Website> selectWebsiteByMap(Map<String, String> params);
测试方法:
@Test
public void testGetInformationByName() {
Map<String, String> paramsMap = new HashMap<String, String>();
/*添加参数*/
paramsMap.put("name", "你好");
paramsMap.put("url", "junkingboy.com");
/*调用方法传递参数*/
InputStream is = null;
try {
is = Resources.getResourceAsStream("xml/mybatis-config.xml");
}catch (Exception e) {
e.printStackTrace();
}
//加载配置文件
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//打开连接
SqlSession ss = ssf.openSession();
//获取websiteMapper接口当中的方法
WebsiteMapper wm = ss.getMapper(WebsiteMapper.class);
//执行方法获取结果集
List<Website> websiteList = wm.selectWebsiteByName(paramsMap);
//打印结果集
for (Website wb :
websiteList) {
System.out.println(wb);
}
//提交事务、关闭资源
ss.commit();
ss.close();
}
使用注解传递参数
使用Mybatis
的注解@Param()
传递参数:
<!--使用Mybatis的注解进行参数传递-->
<select id="selectWebsiteByAn" resultType="com.junkingboy.bean.Website">
SELECT id, name, url FROM javawebtest.website
WHERE name LIKE CONCAT('%', #{name}, '%')
AND url LIKE CONCAT('%', #{url}, '%');
</select>
WebsiteMapper
接口:
/*使用注解的方式通过WebsiteMapper接口发送SQL语句*/
public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);
//@Param注解传递字段(对应的查询字段)、参数类型、参数名
//把参数传递给后台时,MyBatis 通过 @Param 提供的名称就会知道 #{name} 代表 name 参数
/*
如果参数过多就会导致代码过于复杂
*/
使用JavaBean传递参数
Mybatis
:
<!--使用JavaBean对象进行参数传递-->
<select id="selectWebsiteByBean" resultType="com.junkingboy.bean.Website">
SELECT id, name, url FROM javawebtest.website
WHERE name LIKE CONCAT('%', #{name}, '%')
AND url LIKE CONCAT('%', #{url}, '%');
</select>
websiteMapper
接口:
/*使用JavaBean对象传递参数*/
public List<Website> selectWebsiteByBean(Website website);
测试方法:
@Test
public void tesgGetInformationByBean() {
//创建对象
Website site = new Website();
site.setName("你好");
site.setUrl("junkingboy.com");
/*调用方法传递参数*/
InputStream is = null;
try {
is = Resources.getResourceAsStream("xml/mybatis-config.xml");
}catch (Exception e) {
e.printStackTrace();
}
//加载配置文件
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//打开连接
SqlSession ss = ssf.openSession();
//获取websiteMapper接口当中的方法
WebsiteMapper wm = ss.getMapper(WebsiteMapper.class);
//执行接口中的方法获取结果集
List<Website> websiteList = wm.selectWebsiteByBean(site);
//打印结果集
for (Website ws :
websiteList) {
System.out.println(ws);
}
//提交事务
ss.commit();
//关闭资源
ss.close();
}
注意:
- 实际应用中不会采用
Map
的方式进行参数传递,因为会丧失业务可读性,导致后续代码难以扩展和维护。 - 参数个数<=5使用注解传参
- 参数个数>5使用
JavaBean
对象进行传参
insert标签
insert
示例:
<!--插入操作-->
<insert id="addWebsite" parameterType="string">
INSERT INTO javawebtest.website(name)
VALUES(#{name});
</insert>
WebsiteMapper
接口定义:
/*参数为 Sting 类型的字符串;返回值为 int 类型*/
/*定义插入操作*/
public int addWebsite(String name);
测试方法:
@Test
public void testInsertInformation() {
String name = "帅气俊";
/*调用方法传递参数*/
InputStream is = null;
try {
is = Resources.getResourceAsStream("xml/mybatis-config.xml");
}catch (Exception e) {
e.printStackTrace();
}
//加载配置文件
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//打开连接
SqlSession ss = ssf.openSession();
//获取websiteMapper接口当中的方法
WebsiteMapper wm = ss.getMapper(WebsiteMapper.class);
//执行接口中的方法获取结果集
int i = wm.addWebsite(name);
System.out.println("共插入了" + i + "条数据!");
}
insert标签常用属性
属性名称 | 描述 | 备注 |
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
keyProperty | 将插入操作的返回值赋给 PO 类的某个属性,通常为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。 | - |
| 设置是否使用 JDBC 提供的 getGenereatedKeys() 方法,获取数据库内部产生的主键并赋值到 keyProperty 属性设置的请求对象的属性中,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。 | 该属性值设置为 true 后,会将数据库生成的主键回填到请求对象中,以供其他业务使用。 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置执行该操作的最大时限,如果超时,就抛异常。 | - |
databaseId | 取值范围 oracle、mysql 等,表示数据库厂家;元素内部可通过 | MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 |
| 设置第几列是主键,当主键列不是表中的第 1 列时,就需要设置该属性。如果是联合主键,可以将多个值用逗号隔开。 | - |
insert标签传递参数的方式
insert
标签传递参数的方式和select
标签传递参数方式一样。不做过多的赘述
主键自动回填
功能描述:
将刚刚生成的主键回填到请求对象当中。
使用属性:
keyProperty
useGeneratedKeys
WebsiteMapper.xml
示例:
<!--添加一个网站信息,回填主键值给id属性-->
<insert id="addWebsite" parameterType="com.junkingboy.bean.Website" keyProperty="id" useGeneratedKeys="true">
INSERT INTO javawebtest.website(name, url)
VALUES(#{name}, #{url});
</insert>
WebsiteMapper
接口:
/*添加网站信息*/
public int addWebsite(Object object);
测试方法:
@Test
public void testInsertInformationGetId() {
/*接口方法为传递一个Object对象*/
Website site = new Website();
site.setName("Lucifer");
site.setAge(22);
site.setCountry("Chinese");
site.setUrl("junkingboy.com");
//执行插入
/*调用方法传递参数*/
InputStream is = null;
SqlSessionFactory ssf = null;
SqlSession ss = null;
WebsiteMapper wm = null;
try {
is = Resources.getResourceAsStream("xml/mybatis-config.xml");
}catch (Exception e) {
e.printStackTrace();
}
try {
//加载配置文件
ssf = new SqlSessionFactoryBuilder().build(is);
//打开连接
ss = ssf.openSession();
//获取websiteMapper接口当中的方法
wm = ss.getMapper(WebsiteMapper.class);
//执行接口中的方法获取结果集
int num = wm.addWebsite(site);
System.out.println("添加了" + num + "条记录!");
System.out.println("回填的主键为:" + site.getId());
}catch (Exception e) {
/*回滚数据*/
ss.rollback();
e.printStackTrace();
}
}
自定义主键
场景:
针对数据库不支持自动递增主键或者取消了主键自动递增的规则的情况
使用属性:
<selectKey>
示例xml
:
添加一个网站,#{name}
为 com.junkongboy.bean.Website
的属性值
<!--插入一个网站数据,#{name}为其属性值-->
<insert id="insertWebsite" parameterType="com.junkingboy.bean.Website">
<!--先使用selectKey标签定义属性,再定义sql-->
<selectKey keyProperty="id" resultType="Integer" order="BEFORE">
SELECT if(max(id) is null, 1, max(id) + 1) as newId
FROM javawebtest.website;
</selectKey>
INSERT INTO javawebtest.website(id, name, url)
VALUES(#{id}, #{name}, #{url});
</insert>
<selectKey>
标签属性说明:
keyProperty:
指定主键值对应的Bean
类的属性order:
BEFORE:
表示先执行<selectKey>
标签内的语句,再执行插入语句。AFTER:
表示先执行插入语句,再执行<selectKey>
标签内的语句。
update标签
update
示例:
<!--修改一个网站的数据-->
<update id="updateWebsite" parameterType="string">
UPDATE javawebtest.website SET name = #{name};
</update>
WebsiteMapper
接口方法:
/*修改网站信息*/
int updateWebsite(String name);
测试方法:
@Test
public void testUpdateInformation() {
String name = "帅气俊";
//获取WebsiteMapper接口当中的方法
InputStream is = null;
SqlSessionFactory ssf = null;
SqlSession ss = null;
WebsiteMapper wm = null;
try {
is = Resources.getResourceAsStream("xml/mybatis-config.xml");
}catch (Exception e) {
e.printStackTrace();
}
try {
//加载配置文件
ssf = new SqlSessionFactoryBuilder().build(is);
//打开连接
ss = ssf.openSession();
//获取WebsiteMapper接口当中的方法
wm = ss.getMapper(WebsiteMapper.class);
/*
getMapper是一个泛型方法,获取到WebsiteMapper的泛型
*/
//执行方法
int i = wm.updateWebsite(name);
System.out.println("修改了" + i + "条数据!");
}catch (Exception e) {
/*数据回滚*/
ss.rollback();
e.printStackTrace();
}
}
update标签常用属性
属性名称 | 描述 | 备注 |
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。 | - |
statementType | 执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。 | - |
update标签传递参数的方式
update
标签传递参数的方式和select
标签传递参数方式一样。
delete标签
delete
标签示例:
<!--删除一个正规的网站-->
<delete id="deleteWebsite" parameterType="string">
DELETE FROM javawebtest.website
WHERE name = #{name};
</delete>
WebsiteMapper
接口内容:
/*删除网站信息*/
int deleteWebsite(String name);
方法测试类:
@Test
public void testDeleteInformation() {
String name = "帅气俊";
//获取WebsiteMapper接口当中的方法
InputStream is = null;
SqlSessionFactory ssf = null;
SqlSession ss = null;
WebsiteMapper wm = null;
try {
is = Resources.getResourceAsStream("xml/mybatis-config.xml");
}catch (Exception e) {
e.printStackTrace();
}
try {
//加载配置文件
ssf = new SqlSessionFactoryBuilder().build(is);
//打开连接
ss = ssf.openSession();
//获取WebsiteMapper接口当中的方法
wm = ss.getMapper(WebsiteMapper.class);
/*
getMapper是一个泛型方法,获取到WebsiteMapper的泛型
*/
//执行方法
int i = wm.deleteWebsite(name);
System.out.println("删除了" + i + "条数据!");
}catch (Exception e) {
/*数据回滚*/
ss.rollback();
e.printStackTrace();
}
}
delete标签常用属性
属性名称 | 描述 | 备注 |
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。 | - |
statementType | 执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。 | - |
delete标签传递参数的方式
delete
标签传递参数的方式和select
标签传递参数方式一样。