前言
为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码以及文章末尾链接的学习视频源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)
六、mybatis参数传递
1.编码环境准备(辅助学习)
(在个人主页mybatis源码的re_mb_demon模块可以找到相关代码)
- 导入坐标
<!--mybatis 依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> <!--mysql 驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency> <!--junit 单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!-- 添加slf4j日志api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.5</version> </dependency> <!-- 添加logback-classic依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- 添加logback-core依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency>
- 设计创建数据库表tb_user
create database mybatis; use mybatis; drop table if exists tb_user; create table tb_user( id int primary key auto_increment, username varchar(20), password varchar(20), gender char(1), addr varchar(30) ); INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京'); INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津'); INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');、
- mybatis核心配置文件mybatis-config
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="org.example.pojo"/> </typeAliases> <!-- environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--数据库连接信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <!--Mapper代理方式--> <package name="org.example.mapper"/> </mappers> </configuration>
- 对应的实体类User
//此处省略getter、setter和toString方法 public class User { private Integer id; private String username; private String password; private String gender; private String addr;
- Mapper映射接口UserMapper
public interface UserMapper { }
- Mapper代理核心配置文件UserMaper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace:名称空间,用于进一步区分--> <mapper namespace="org.example.mapper.UserMapper"> </mapper>
- 日志配置文件logback.xml(辅助理解)
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- CONSOLE :表示当前的日志信息是可以输出到控制台的。 --> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern> </encoder> </appender> <logger name="com.itheima" level="DEBUG" additivity="false"> <appender-ref ref="Console"/> </logger> <!-- level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF , 默认debug <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。 --> <root level="DEBUG"> <appender-ref ref="Console"/> </root> </configuration>
- 模拟测试类UserMapperTest
public class UserMapperTest { }
- 文件结构预览
2.传递多个参数
- mybatis封装多个参数解析
dao层方法需要多个参数时,若是没有使用mybatis的@Param注解,直接调用方法,Mybatis解析XML文件时会将参数名称解析为arg1, arg0…, param1, param2…,封装为Map集合
可以使用@Param注解,替换Map集合中默认的arg键名
- 概述
MyBatis为开发者提供了一个注解**@Param**(org.apache.ibatis.annotations.Param),可以通过它去定义映射器的参数名称,使用它可以得到更好的可读性 这个时候需要修改映射文件的代码,此时并不需要给出parameterType属性,让MyBatis自动探索便可以了 使可读性大大提高,使用者也方便了,但是这会带来一个麻烦。如果SQL很复杂,拥有大于10个参数,那么接口方法的参数个数就多了,使用起来就很不容易,不过不必担心,MyBatis还提供传递Java Bean的形式。
- 注解传递多个参数一般格式
public List<Role> findRolesByAnnotation(@Param("roleName") String rolename, @Param("note") String note);
<select id="findRolesByAnnotation" resultType="role"> select id, role_name as roleName, note from t_role where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note}, '%') </select>
- 实操举例
- 编写Mapper映射接口UserMapper
User select(@Param("username") String username, @Param("password")String password);
- 编写Mapper代理核心配置文件UserMaper.xml(sql语句)
<select id="select" resultType="org.example.pojo.User"> select * from tb_user where username = #{username} and password = #{password} </select>
- 编写模拟测试类UserMapperTest
@Test public void testSelect() throws IOException { //1. 获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 获取Mapper接口的代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //4. 执行方法 String username = "zhangsan"; String password = "123"; User user = userMapper.select(username,password); System.out.println(user); //5. 释放资源 sqlSession.close(); }
- 运行结果
3.传递单个参数
- POJO类型:直接使用,属性名 和 参数占位符名称 一致
- 接口函数举例
void add(Brand brand);
- 模拟测试类对象封装举例
//接收参数 int status = 1; String companyName = "波导手机"; String brandName = "波导"; String description = "手机中的战斗机"; int ordered = 100; //封装对象 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName); brand.setDescription(description); brand.setOrdered(ordered);
- sql语句举例
<insert id="add" useGeneratedKeys="true" keyProperty="id"> insert into tb_brand (brand_name, company_name, ordered, description, status) values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status}); </insert>
- Map集合:直接使用,键名 和 参数占位符名称 一致
- 接口函数举例
List<Brand> selectByCondition(Map map); • 1
- Map封装举例
//接收参数 int status = 1; String companyName = "华为"; String brandName = "华为"; // 处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; Map map = new HashMap(); map.put("status" , status); map.put("companyName", companyName); map.put("brandName" , brandName);
- sql语句举例
<select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName} </select>
- Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put(“arg0”,collection集合);
map.put(“collection”,collection集合); - List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put(“arg0”,list集合);
map.put(“collection”,list集合);
map.put(“list”,list集合); - Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put(“arg0”,数组);
map.put(“array”,数组); - 其他类型:直接使用(${任意值})
- 接口函数举例
User selectById(int id);
- sql语句举例
<select id="selectById" resultType="user"> select * from tb_User where id = ${id}; </select>
4.小结
`博客内容借鉴了bilibili黑马程序员SSM课程资料,如有侵权,请联系作者删除`
总结
欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下作者,后续还会更新springboot,maven高级,微信小程序,等前后端内容的学习笔记。