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

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

相关推荐
毕设源码-赖学姐11 分钟前
【开题答辩全过程】以 基于Springboot的智慧养老系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
jamesge201013 分钟前
限流之漏桶算法
java·开发语言·算法
jvstar14 分钟前
JAVA面试题和答案
java
冷雨夜中漫步14 分钟前
OpenAPITools使用——FAQ
android·java·缓存
9坐会得自创19 分钟前
使用marked将markdown渲染成HTML的基本操作
java·前端·html
Hello.Reader40 分钟前
Flink ML 线性 SVM(Linear SVC)入门输入输出列、训练参数与 Java 示例解读
java·支持向量机·flink
oioihoii41 分钟前
C++数据竞争与无锁编程
java·开发语言·c++
最贪吃的虎41 分钟前
什么是开源?小白如何快速学会开源协作流程并参与项目
java·前端·后端·开源
资生算法程序员_畅想家_剑魔42 分钟前
Java常见技术分享-16-多线程安全-并发编程的核心问题
java·开发语言