mybatis select 返回值long null_Mybatis框架(二)

d49c6ac99d321a1c483027d6c9020e4e.png

【31】

1. <typeAliases>标签

1.1 功能

用于给 java 类型定义别名, 方便在配置文件中使用.

1.2 使用方式

a) 给 User 类型定义别名为 u

<!-- typeAliases给类型起别名 -->
<typeAliases>
<!-- 给User类起别名为u -->
<typeAlias type="com.bjsxt.pojo.User" alias="u" />
</typeAliases>

b)<typeAlias>中, 可以省略 alias 属性, 表示类别名为类名, 大小写不敏感

<typeAliases>
<!-- 给User类起别名, 别名为user -->
<typeAlias type="com.bjsxt.pojo.User" />
</typeAliases>

c)可以通过<package>给整个包下的所有类定义别名为类名

<typeAliases>
<!-- 给包下的所有类定义别名为类名 -->
<package name="com.bjsxt.pojo" />
</typeAliases>

1.3 MyBatis 的内建别名

805012ebd8a85615bf746d69560b18cb.png

1. 带参数的查询

如果执行的是条件查询, 需要在调用方法时传参数进来, 此时, 可以在 select 标签中通过 parameterType 属性指定参数的类型. 而在 SQL 语句中, 可以通过#{}的方式获取参数.

1.1 一个参数的查询

例如, 根据 id 查询用户信息. 当只有一个参数时, #{}中可以任意填写.

<!-- parameterType, 参数类型, 用于参数的传递 -->
<select id="selById" resultType="user" parameterType="int">
<!--
#{}用于获取参数
index, 索引, 从0开始
param+数字, param1, param2
-->
select * from t_user where id=#{param1}
</select>

测试代码:

@Test
public void selById() {
SqlSession session = null;
try {
session = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-cfg.xml"))
.openSession();
User user =
session.selectOne("com.bjsxt.mapper.UserMapper.selById", 2);
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
} finally {
session.close();
}
}

1.2 多个参数的查询

多个参数传递时, 由于 sqlSession 中提供的查询方法只允许传入一个参数, 因此可以对多个参数进行封装. 可以使用对象或 Map 集合.

1.2.1 封装为对象

<select id="sel" resultType="user" parameterType="user">
<!-- 如果参数是对象, 可以通过#{属性名}来获取 -->
select * from t_user where username=#{username} and
password=#{password}
</select>

测试代码:

@Test
public void sel() {
SqlSession session = null;
try {
session = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-cfg.xml"))
.openSession();
User u = new User();
u.setUsername("zhangsan");
u.setPassword("123");
User user =
session.selectOne("com.bjsxt.mapper.UserMapper.sel", u);
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
} finally {
session.close();
}
}

1.2.2 封装为 Map

<select id="sel" resultType="user" parameterType="map">
<!-- 如果参数是map, 可以通过#{key}来获取 -->
select * from t_user where username=#{uname} and password=#{upwd}
</select>

测试代码:

@Test
public void sel() {
SqlSession session = null;
try {
session = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-cfg.xml"))
.openSession();
Map<String, String> map = new HashMap<>();
map.put("uname", "lisi");
map.put("upwd", "123");
User user =
session.selectOne("com.bjsxt.mapper.UserMapper.sel", map);
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
} finally {
session.close();
}
}

1. 事务(Transaction)

  1. 事务是数据库操作的最小单元, 有 ACID 的特性. 应该保证一个事务的的 SQL 语句要么同时成功, 要么都不成功.
  2. MyBatis 中配置了事务管理器, type 属性设置为 JDBC.表示 MyBatis 采用和原生 JDBC 相同的事务管理机制.
  3. 在 MyBatis 执行的开始时,将自动提交功能关闭了.所以,在执行 DML 操作时, 需要手动提交事务.

2. 简单提取工具类

package com.bjsxt.util;
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
static {
try {
InputStream is =
Resources.getResourceAsStream("mybatis-cfg.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
SqlSession session = null;
if (factory != null) {
// true表示开启自动提交
// session = factory.openSession(true);
session = factory.openSession();
}
return session;
}
}

3. 新增(insert)

mapper 文件中, 通过<insert>定义新增语句. 注意, 由于DML 操作的返回值都是 int 类型, 所以, 不需要定义resultType 属性.

<!-- 新增 -->
<insert id="insUser" parameterType="user">
insert into t_user values (default, #{username}, #{password})
</insert>

测试代码:

@Test
public void testIns() {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setUsername("小明");
user.setPassword("123");
int num = session.insert("com.bjsxt.mapper.UserMapper.insUser",
user);
if(num > 0) {
// 提交事务
session.commit();
System.out.println("SUCCESS!");
} else {
// 回滚事务
session.rollback();
System.out.println("FAILED!");
}
// 关闭资源
session.close();
}

1. 修改(update)和删除(delete)

1.1 修改

<!-- 修改 -->
<update id="updUser" parameterType="user">
update t_user set username=#{username}, password=#{password} where
id=#{id}
</update>

测试代码:

@Test
public void testUpd() {
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setId(9);
user.setUsername("大名");
user.setPassword("abc");
int num = session.update("com.bjsxt.mapper.UserMapper.updUser",
user);
if (num > 0) {
System.out.println("SUCCESS");
session.commit();
} else {
System.out.println("FAILED");
session.rollback();
}
session.close();
}

1.2 删除

<!-- 删除 -->
<delete id="delUser" parameterType="int">
delete from t_user where id=#{0}
</delete>

测试代码:

@Test
public void testDel() {
SqlSession session = MyBatisUtil.getSession();
int num = session.delete("com.bjsxt.mapper.UserMapper
.delUser",9);
if (num > 0) {
System.out.println("SUCCESS");
session.commit();
} else {
System.out.println("FAILED");
session.rollback();
}
session.close();
}

1. 接口绑定方案

MyBatis 中, 提供了一套接口绑定方案. 程序员可以提供一个 接 口 , 然 后 提 供 对 应 接 口 的 一 个 mapper.xml 文 件 .MyBatis 会自动将接口和 xml 文件进行绑定. 实际上就是MyBatis 会根据接口和对应的 xml 文件创建接口的实现类.换言之, 就是可以得到接口类型的对象, 方便方法的调用.

1.1 实现方式

1.1.1 定义接口

package com.bjsxt.mapper;
import java.util.List;
import com.bjsxt.pojo.User;
public interface UserMapper {
List<User> selAll();
}

1.1.2 编写对应接口的映射文件

注意:

  1. xml 文件名要和接口名一致
  2. namespace 属性必须为接口的全限定路径
  3. id 属性必须和接口对应的方法名一致
<mapper namespace="com.bjsxt.mapper.UserMapper">
<select id="selAll" resultType="User">
select * from t_user
</select>
</mapper>

1.1.3 在核心配置文件中扫描接口

a) 扫描单个接口, 可以使用 mapper 标签的 class 属性

<mappers>
<mapper class="com.bjsxt.mapper.UserMapper" />
</mappers>

b) 当扫描多个接口时,为简化配置,可以使用 package 标签,表示扫描对应包下的所有接口.

<mappers>
<package name="com.bjsxt.mapper" />
</mappers>

1.1.4 应用

在使用时, 可以通过 SqlSession 对象的 getMapper 方法,得到接口的代理对象, 从而可以调用定义好的方法.

@Test
public void testBind() {
SqlSession session = MyBatisUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.selAll();
for (User user : list) {
System.out.println(user);
}
session.close();
}

1. 通过接口绑定解决多参数的传递

1.1 方式一

a) 接口中定义方法

User selByUP(String username, String password);

b) 映射文件中提供对应的标签. 此时, SQL语句中获取方式有两种, 通过#{index}或#{param+数字}的方式.

<select id="selByUP" resultType="user">
select * from t_user where username=#{0} and password=#{1}
</select>

1.2 方式二

a) 接口中定义方法, 参数中使用@Param 注解设定参数名用于在 SQL 语句中使用.

User selByUP(@Param("username") String username, @Param("password")
String password);

b) 映射文件中提供对应的标签. 此时, SQL语句中获取方式有两种, 通过#{参数名称}或#{param+数字}的方式.

<select id="selByUP" resultType="user">
select * from t_user where username=#{username} and
password=#{password}
</select>

1. 动态 SQL

根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL.

1.1 <if>

用于进行条件判断, test 属性用于指定判断条件. 为了拼接条件, 在 SQL 语句后强行添加 1=1 的恒成立条件.

<select id="sel" resultType="user">
select * from t_user where 1=1
<if test="username != null and username != ''">
and username=#{username}
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</select>

1.2 <where>

用于管理 where 子句. 有如下功能:

a)如果没有条件, 不会生成 where 关键字

b)如果有条件, 会自动添加 where 关键字

c)如果第一个条件中有 and, 则去除

<select id="sel" resultType="user">
select * from t_user
<where>
<if test="username != null and username != ''">
and username=#{username}
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</where>
</select>

1. 动态 SQL

1.1 <choose><when><otherwise>这是一套标签, 功能类似于 switch...case...

<select id="sel" resultType="user">
select * from t_user
<where>
<choose>
<when test="username != null and username != ''">
and username = #{username}
</when>
<when test="password != null and password != ''">
and password = #{password}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</where>
</select>

1.2 <set>

用于维护 update 语句中的 set 子句. 功能如下:

  1. 满足条件时, 会自动添加 set 关键字
  2. 会去除 set 子句中多余的逗号
  3. 不满足条件时, 不会生成 set 关键字
int updUser(User user);
<update id="updUser" parameterType="user">
update t_user
<set>
id=#{id}, <!-- 防止所有条件不成立时的语法错误 -->
<if test="username != null and username != ''">
username=#{username},
</if>
<if test="password != null and password != ''">
password=#{password},
</if>
</set>
where id=#{id}
</update>

1. 动态 SQL

1.1 <trim>

用于在前后添加或删除一些内容

  1. prefix, 在前面添加内容
  2. prefixOverrides, 从前面去除内容
  3. suffix, 向后面添加内容
  4. suffixOverrides, 从后面去除内容
<update id="updUser" parameterType="user">
update t_user
<!--
prefix: 前缀, 表示向前面添加内容
prefixOverrides: 从前面删除内容
suffix: 后缀, 表示向后面添加内容
suffixOverrides: 从后面删除内容
-->
<trim prefix="set" prefixOverrides="user" suffix="hahaha"
suffixOverrides=",">
username=#{username},
</trim>
where id=#{id}
</update>

1.2 <bind>

用于对数据进行再加工, 用于模糊查询

<select id="sel" resultType="user">
select * from t_user
<where>
<if test="username!=null and username!=''">
<bind name="username" value="'%' + username + '%'"/>
and username like #{username}
</if>
</where>
</select>

1. 动态 SQL

1.1 <foreach>

用于在 SQL 语句中遍历集合参数, 在 in 查询中使用

  1. collection: 待遍历的集合
  2. open: 设置开始符号
  3. item: 迭代变量
  4. separator: 项目分隔符
  5. close: 设置结束符号
<select id="selIn" parameterType="list" resultType="user">
select * from t_user where id in
<foreach collection="list" open="(" separator="," close=")"
item="item">
#{item}
</foreach>
</select>
List<User> selIn(@Param("list") List<Integer> list);

1.2 <sql><include>

<sql>用于提取 SQL 语句, <include>用于引用 SQL 语句

<sql id="mySql">
id, username, password
</sql>
<select id="selIn" parameterType="list" resultType="user">
select
<include refid="mySql"/>
from t_user where id in
<foreach collection="list" open="(" separator="," close=")"
item="item">
#{item}
</foreach>
</select>

1. MyBatis 的缓存机制

  1. 缓存用于提高查询的效率.
  2. MyBatis的缓存是使用SQL标签的ID作为缓存的唯一标识的. 执行相同的标签可以使用缓存. 不同的标签不能使用缓存.
  3. MyBatis 中有两种缓存机制.

1.1 一级缓存

a)默认开启. 线程级别的缓存, SqlSession 的缓存

b)在一个 SqlSession 生命周期中有效. SqlSession 关闭,缓存清空.

1.2 二级缓存

a)进程级别的缓存, SqlSessionFactory 的缓存

b)在一个 SqlSessionFactory 生命周期中有效.可以在多个SqlSession 生命中期中共享.

c)默认关闭, 需要使用的时候, 要为某个命名空间开启二级缓存(在 mapper.xml 中配置<cache>).

<!-- 开启二级缓存, 要求实体类进行序列化 或者添加readonly(true)-->
<cache />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值