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 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

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

相关推荐
要一起看日出几秒前
MVCC-多版本并发控制
数据库·mysql·mvcc
Hx__1 分钟前
MySQL InnoDB 的 MVCC 机制
数据库·mysql
速易达网络2 分钟前
ASP.NET MVC 连接 MySQL 数据库查询示例
数据库·asp.net·mvc
Dcs3 分钟前
用 Python UTCP 直调 HTTP、CLI、MCP……
java
玉衡子39 分钟前
MySQL基础架构全面解析
数据库·后端
快乐肚皮40 分钟前
fencing token机制
java·fencing token
梦中的天之酒壶41 分钟前
Redis Stack扩展功能
数据库·redis·bootstrap
GreatSQL1 小时前
GreatSQL分页查询优化案例实战
数据库
叶落阁主1 小时前
Neovim 插件 i18n.nvim 介绍
java·vue.js·vim
渣哥1 小时前
让集合线程安全的几种靠谱方法
java