Parameters参数、增删改标签、事务、typeAliases

1.获取传入的参数值
  1. #{} 形式传参,Mybatis会将SQL语句中的#{}转换为问号占位符?

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <!--根据商品编号,查询商品信息 --> <select id="selectById" parameterType="int" resultType="com.bdqn.pojo.Goods"> select * from goods where id=#{id} </select> |

  1. ${} 形式传参,底层Mybatis做的是字符串拼接操作

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| //调用方法,既可以触发对应的SQL语句 Goods goods=goodsMapper.selectById(10020); <!--根据商品编号,查询商品信息--> <select id="selectById" parameterType="int" resultType="com.bdqn.pojo.Goods"> select * from goods where id=${id} </select> |

结论:实际开发中,能用#{}实现的,肯定不用${}。

特殊情况:动态的不是值,是列名或者关键字,需要使用${}拼接。如排序列名

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| List<Goods> list=goodsMapper.selectAll("price"); <!-- 查询所有的商品信息,按照指定列名排序 --> <select id="selectAll" parameterType="String" resultType="com.bdqn.pojo.Goods"> select * from goods order by ${sortColumn} </select> |

2.传入的参数类型,以及获取参数值
  1. 通过SQL语句标签中的parameterType属性指定传入参数类型

  2. 一个简单类型参数

在#{}中可以随意命名,通常还是使用和接口方法参数同名。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| int row=goodsMapper.deleteById(10010); /**删除商品信息*/ public int deleteById(int id); <!--删除商品信息--> <delete id="deleteById" parameterType="int" > delete from goods where id=#{id} </delete> |

3. 多个零散的简单类型参数

如果没有特殊处理,那么Mybatis无法识别自定义名称。

使用@Param("key")注解,底层封装map,给传入的值指定key,通过#{key}获取值。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| List<Goods> list=goodsMapper.selectPage(0,2); /**获取当前页的商品信息*/ public List<Goods> selectPage(@Param("start") int start,@Param("pageSize") int pageSize); <!--获取当前页的商品信息--> <select id="selectPage" resultType="com.bdqn.pojo.Goods"> select * from goods limit #{start} ,#{pageSize} </select> |

  1. 实体类型参数

#{属性名}: 写对象的属性名

Mybatis会根据#{属性名}中传入的数据,加工成getXxx()方法,通过反射在实体类对象中调用这个方法,从而获取到对应的数据。填充到#{}解析后的问号占位符这个位置。

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Goods goods=new Goods(10080,"香蕉",5.8,"香蕉.jpg",9); int row=goodsMapper.addGoods(goods); /**添加商品信息*/ public int addGoods(Goods goods); <!--添加商品信息--> <insert id="addGoods" parameterType="com.bdqn.pojo.Goods" > insert into goods values(#{id},#{name},#{price},#{imgs},#{num}) </insert> |

5.Map类型的参数

有很多零散的参数需要传递,但是没有对应的实体类类型可以使用。使用@Param注解一个一个传入又太麻烦了。所以都封装到Map中。

获取map集合的参数值:#{}中写Map中的key

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 测试代码: Map<String, Object> map=new HashMap<>(); map.put("start",0); map.put("pageSize",2); List<Goods> list=goodsMapper.selectPage2(map); Mapper接口: /**获取当前页的商品信息*/ public List<Goods> selectPage2(Map<String,Object> params); Mapper.xml配置 <!--获取当前页的商品信息--> <select id="selectPage2" parameterType="map" resultType="Goods"> select * from goods limit #{start} ,#{pageSize} </select> |

3.Mybatis增加、删除、修改 和事务

1.mybatis的<insert><delete><update>增删改标签默认返回值类型是int, 所以没有resultType属性。

  1. mybatis默认关闭事务提交功能。autocommit=false

2.1 手动提交事务

session.commit();

2.2 设置session对象autocommit=true

SqlSession session=factory.openSession(true);

  1. 删除 <delete>

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| int row=goodsMapper.deleteById(10010); /**删除商品信息*/ public int deleteById(int id); <!-- 删除商品信息--> <delete id="deleteById" parameterType="int" > delete from goods where id=#{id} </delete> |

  1. 修改 <update>

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Goods goods=new Goods(10080,"香蕉",6.8,"香蕉.jpg",5); int row=goodsMapper.updateGoods(goods); /** 修改商品信息*/ public int updateGoods(Goods goods); <!--修改商品信息--> <update id="updateGoods" parameterType="com.bdqn.pojo.Goods"> update goods set name=#{name},price=#{price},imgs=#{imgs},num=#{num} where id=#{id} </update> |

  1. 添加 <insert>

  2. 添加数据

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Goods goods=new Goods(10080,"香蕉",5.8,"香蕉.jpg",9); int row=goodsMapper.addGoods(goods); /**添加商品信息*/ public int addGoods(Goods goods); <!-- 添加商品信息--> <insert id="addGoods" parameterType="com.bdqn.pojo.Goods" > insert into goods values(#{id},#{name},#{price},#{imgs},#{num}) </insert> |

  1. 添加数据,返回自动增长的主键列的值

  2. 数据准备

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #用户表 CREATE TABLE USER( user_id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(20) NOT NULL, password VARCHAR(20) NOT NULL ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; INSERT INTO USER VALUES(NULL,'admin','admin'); INSERT INTO USER VALUES(NULL,'zs','123'); SELECT * FROM USER; |

  1. 实现代码

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| User user=new User(0,"ls","8888"); int row=userMapper.addUser(user); //输出添加成功后主键列的值 System.out.println("自动增长的用户编号:"+user.getUserid()); public int addUser(User user); <!--添加用户信息,并返回自动增长的用户编号--> <!-- useGeneratedKeys属性字面意思就是"使用生成的主键" --> <!-- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性--> <insert id="addUser" parameterType="com.bdqn.pojo.User" useGeneratedKeys="true" keyProperty="userid"> insert into user values(null,#{username},#{password}) </insert> |

4.typeAliases 给类全限定名取别名

作用:xxxmapper.xml会大量使用实体类的全限定名,

可以使用typeAliases取别名,从而简化编写

在mybatis.xml全局配置文件加入如下配置:

  1. 给指定类全限定名取别名

|-------------------------------------------------------------------------------------------------------|
| <typeAliases> <typeAlias type="com.bdqn.pojo.Goods" alias="goods"></typeAlias> </typeAliases> |

2.给包下所有类取别名 (别名默认为类名首字母小写,不区分大小写)

|------------------------------------------------------------------------------|
| <typeAliases> <package name="com.bdqn.pojo"/> </typeAliases> |

3.注解取别名

|------------------------------------------------|
| @Alias("goods") public class Goods { } |

4.下面是Mybatis为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

|------------------------------------------------------------------------------------------------------------------------------------------------------|
| |

相关推荐
SelectDB技术团队2 分钟前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光22 分钟前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓120124 分钟前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
天天摸鱼的java工程师26 分钟前
Java 解析 JSON 文件:八年老开发的实战总结(从业务到代码)
java·后端·面试
白仑色27 分钟前
Spring Boot 全局异常处理
java·spring boot·后端·全局异常处理·统一返回格式
染落林间色32 分钟前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
喵手34 分钟前
反射机制:你真的了解它的“能力”吗?
java·后端·java ee
kaika11 小时前
告别复杂配置!使用 1Panel 运行环境功能轻松搭建 Java 应用
java·1panel·建站·halo
有梦想的攻城狮1 小时前
Java 11中的Collections类详解
java·windows·python·java11·collections
颜颜yan_1 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库