Data Access 之 MyBatis(三) - SQL Mapping XML(Part B)(下)

简介: Data Access 之 MyBatis(三) - SQL Mapping XML(Part B)

当参数传入Map时,可以使用#{Key}来获取参数的Value。

当一个方法中集合了以上所有情况,即多个参数的情况

getByIdAndNameAndEmployee(@Param("id) id, String empName, Employee employee);
复制代码

id使用#{id}取值,empName使用#{param2}取值,使用#{param3.email}可以取出Employee中的email信息

参数处理

SQL映射文件中SQL语句参数位置支持的属性有javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName等

jdbcType

参数也可以指定一个特殊的数据类型

#{property,javaType=int,jdbcType=NUMERIC}
#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}
复制代码
  • javaType通常可以从参数对象中确定
  • 如果null被当作值来传递,对于所有可能为空的列,需要设置jdbcType
  • 对于数值类型,可以设置小数点后保留的位数
<select id="getEmpByIdAndEmpName" resultType="com.citi.entity.Employee">
    select * from t_employee where id = #{id,jdbcType=INTEGER} and empname = #{name}
</select>
复制代码

#{}与${}

获取参数的值可以使用#{}或者${}

  • #{key}:预编译到SQL中,较安全
  • ${key}:拼接到SQL中,会有SQL注入漏洞问题

修改getEmployeeByIdAndEmpName方法对应的SQL语句,使用${}取值

<select id="getEmpByIdAndEmpName" resultType="com.citi.entity.Employee">
    select * from t_employee where id = ${id} and empname = #{name}
</select>
复制代码

执行测试,查看执行的SQL可以发现id=1是直接拼接到SQL中的

584a294201664df7b6c9c6c8ba42317b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

SQL语句中只有参数位置是支持预编译的,${}可以用作动态传递表名

修改getEmployeeByIdAndName测试方法,在paramMap中增加表名信息

@Test
public void getEmployeeByIdAndName(){
    EmployeeDao employeeDao = openSession.getMapper(EmployeeDao.class);
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("id",1);
    paramMap.put("name","stark");
    paramMap.put("tableName","t_employee");
    Employee employee = employeeDao.getEmployeeByIdAndName(paramMap);
    System.out.println(employee);
}
复制代码

修改getEmployeeByIdAndName的映射SQL,使用${tableName}获取表名

<select id="getEmployeeByIdAndName" resultType="com.citi.entity.Employee">
    select * from ${tableName} where id = #{id} and empname = #{name}
</select>
复制代码

执行测试

3eb1ffdfa7524d0d83d38617ad8adb4b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

如果使用#{}传递表名,修改getEmployeeByIdAndName的映射SQL,使用#{tableName}获取表名,再次执行测试

f003332a6972424a932e2e3fc6cfdd96_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

出现报错,SQL语句中只有参数位置是支持预编译的

查询返回List

EmployeeDao接口中新增方法getAllEmployees,查询所有的员工

List<Employee> getAllEmployees();
复制代码

employee.xml 增加映射SQL

<!--如果返回的是集合,resultType写的是集合中元素的类型-->
<select id="getAllEmployees" resultType="com.citi.entity.Employee">
    select * from t_employee
</select>
复制代码

增加测试方法

@Test
public void getAllEmployees(){
    EmployeeDao employeeDao = openSession.getMapper(EmployeeDao.class);
    List<Employee> employeeList = employeeDao.getAllEmployees();
    for (Employee employee : employeeList) {
        System.out.println(employee);
    }
}
复制代码

执行该测试方法

1d1ff01d52214b67945e00f9b31d4579_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

查询结果封装成Map

查询返回单条记录的情况下列名作为Key,值作为Value

新增方法

Map<String, Object> getEmployeeByIdWithMap(Integer id);
复制代码

增加SQL映射语句,由于返回的是Map类型数据,所以resultType为map

<select id="getEmployeeByIdWithMap" resultType="map">
    select * from t_employee where id = #{id}
</select>
复制代码

增加测试方法

@Test
public void getEmployeeByIdWithMap(){
    EmployeeDao employeeDao = openSession.getMapper(EmployeeDao.class);
    Map<String, Object> employeeMap = employeeDao.getEmployeeByIdWithMap(1);
    System.out.println(employeeMap);
}
复制代码

执行测试

adf0a5c30f8a4a34b71c0fcb85cbce3a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

默认封装成Map后,列名作为Key,值作为Value

查询返回多条记录情况下封装成Map

定义方法

Map<Integer, Employee> getAllEmployeesWithMap();
复制代码

employee.xml中增加SQL映射语句

<select id="getAllEmployeesWithMap" resultType="map">
    select * from t_employee
</select>
复制代码

增加测试方法

@Test
public void getAllEmployeesWithMap(){
    EmployeeDao employeeDao = openSession.getMapper(EmployeeDao.class);
    Map<Integer, Employee> employeeMap = employeeDao.getAllEmployeesWithMap();
    System.out.println(employeeMap);
}
复制代码

执行测试

409400d20afc491b9b9adca19252dec8_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

增加主键定义,使用@MapKey指定一个Map的主键

@MapKey("id")
Map<Integer, Employee> getAllEmployeesWithMap();
复制代码

再次执行测试

d85924f34d0747a08573d075ac667a25_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

在测试方法中打印出key为1的元素的属性,在getAllEmployeesWithMap测试方法中增加代码

@Test
public void getAllEmployeesWithMap(){
    EmployeeDao employeeDao = openSession.getMapper(EmployeeDao.class);
    Map<Integer, Employee> employeeMap = employeeDao.getAllEmployeesWithMap();
    System.out.println(employeeMap);
    Employee employee = employeeMap.get(1);
    System.out.println(employee.getEmpName());
}
复制代码

出现了类型转换异常

224b301db9174f4dbc0e5b3f54e7e17e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

这是因为SQL映射语句中定义的resultType为Map,所以会出现这种错误,修改sql映射语句中resultType类型要是集合中元素的类型

<select id="getAllEmployeesWithMap" resultType="com.citi.entity.Employee">
    select * from t_employee
</select>
复制代码

再次测试

8c89760d259b43afaf70591ec3c53a54_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

查询多条数据返回一个Map,resultType为集合Value保存的元素的类型



相关文章
|
4月前
|
XML SQL 数据格式
XML动态sql查询当前时间之前的信息报错
XML动态sql查询当前时间之前的信息报错
56 2
|
1月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
69 5
|
6月前
|
XML Java 数据库连接
MyBatis入门——MyBatis XML配置文件(3)
MyBatis入门——MyBatis XML配置文件(3)
87 6
|
2月前
|
SQL 存储 机器学习/深度学习
将 AWS Data Lake 和 S3 与 SQL Server 结合使用
将 AWS Data Lake 和 S3 与 SQL Server 结合使用
66 0
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
64 1
|
4月前
|
SQL Java 数据库连接
MyBatis Mapper.XML 标签使用说明
MyBatis Mapper.XML 标签使用说明
45 0
|
6月前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
58 3
|
6月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
77 3
|
6月前
|
XML Java 数据库连接
MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql
MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql
|
5月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法