200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > mybatis select 返回值long null_Mybatis框架(二)

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

时间:2020-11-13 18:36:55

相关推荐

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

【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 的内建别名

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>

测试代码:

@Testpublic 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} andpassword=#{password}</select>

测试代码:

@Testpublic 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>

测试代码:

@Testpublic 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)

事务是数据库操作的最小单元, 有 ACID 的特性. 应该保证一个事务的的 SQL 语句要么同时成功, 要么都不成功.MyBatis 中配置了事务管理器, type 属性设置为 JDBC.表示 MyBatis 采用和原生 JDBC 相同的事务管理机制. 在 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>

测试代码:

@Testpublic 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) {// 提交事务mit();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} whereid=#{id}</update>

测试代码:

@Testpublic 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");mit();} else {System.out.println("FAILED");session.rollback();}session.close();}

1.2 删除

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

测试代码:

@Testpublic void testDel() {SqlSession session = MyBatisUtil.getSession();int num = session.delete("com.bjsxt.mapper.UserMapper.delUser",9);if (num > 0) {System.out.println("SUCCESS");mit();} 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 编写对应接口的映射文件

注意:

xml 文件名要和接口名一致namespace 属性必须为接口的全限定路径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 方法,得到接口的代理对象, 从而可以调用定义好的方法.

@Testpublic 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} andpassword=#{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 子句. 功能如下:

满足条件时, 会自动添加 set 关键字会去除 set 子句中多余的逗号不满足条件时, 不会生成 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>

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

prefix, 在前面添加内容prefixOverrides, 从前面去除内容suffix, 向后面添加内容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 查询中使用

collection: 待遍历的集合open: 设置开始符号item: 迭代变量separator: 项目分隔符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 的缓存机制

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

1.1 一级缓存

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

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

1.2 二级缓存

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

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

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

<!-- 开启二级缓存, 要求实体类进行序列化 或者添加readonly(true)--><cache />

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。