[[toc]]

第五节 数据输出

1、返回单个简单类型数据

①Mapper接口中的抽象方法

int selectEmpCount();

②SQL语句

  1. <select id="selectEmpCount" resultType="int"><br /> select count(*) from t_emp<br /> </select>

③junit测试

@Test<br />    public void testEmpCount() {

    EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

    int count = employeeMapper.selectEmpCount();

    System.out.println("count = " + count);<br />    }

2、返回实体类对象

①Mapper接口的抽象方法

Employee selectEmployee(Integer empId);

②SQL语句




通过给数据库表字段加别名,让查询结果的每一列都和Java实体类中属性对应起来。

③增加全局配置自动识别对应关系

做了下面的配置,select语句中可以不给字段设置别名








3、返回Map类型

适用于SQL查询返回的各个字段综合起来并不和任何一个现有的实体类对应,没法封装到实体类对象中。能够封装成实体类类型的,就不使用Map类型。

①Mapper接口的抽象方法

Map selectEmpNameAndMaxSalary();

②SQL语句



③junit测试

@Test<br />    public void testQueryEmpNameAndSalary() {

    EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

    Map<String, Object> resultMap = employeeMapper.selectEmpNameAndMaxSalary();

    Set<Map.Entry<String, Object>> entrySet = resultMap.entrySet();

    for (Map.Entry<String, Object> entry : entrySet) {<br />            String key = entry.getKey();<br />            Object value = entry.getValue();<br />            System.out.println(key + "=" + value);<br />        }<br />    }

4、返回List类型

查询结果返回多个实体类对象,希望把多个实体类对象放在List集合中返回。此时不需要任何特殊处理,在resultType属性中还是设置实体类类型即可。

①Mapper接口中抽象方法

List selectAll();

②SQL语句

<!-- List<Employee> selectAll(); --><br />    <select id="selectAll" resultType="com.atguigu.mybatis.entity.Employee"><br />        select emp_id empId,emp_name empName,emp_salary empSalary<br />        from t_emp<br />    </select>

③junit测试

@Test<br />    public void testSelectAll() {

    EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

    List<Employee> employeeList = employeeMapper.selectAll();

    for (Employee employee : employeeList) {<br />            System.out.println("employee = " + employee);<br />        }

}

5、返回自增主键

①使用场景

例如:保存订单信息。需要保存Order对象和List。其中,OrderItem对应的数据库表,包含一个外键,指向Order对应表的主键。
在保存List的时候,需要使用下面的SQL:
insert into t_order_item(item_name,item_price,item_count,order_id) values(…)
这里需要用到的order_id,是在保存Order对象时,数据库表以自增方式产生的,需要特殊办法拿到这个自增的主键值。至于,为什么不能通过查询最大主键的方式解决这个问题,参考下图:
05.数据输出 - 图1

②在Mapper配置文件中设置方式

[1]Mapper接口中的抽象方法

int insertEmployee(Employee employee);

[2]SQL语句





insert into t_emp(emp_name,emp_salary)
values(#{empName},#{empSalary})

[3]junit测试

@Test
public void testSaveEmp() {

EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

Employee employee = new Employee();

employee.setEmpName("john");<br />    employee.setEmpSalary(666.66);

employeeMapper.insertEmployee(employee);

System.out.println("employee.getEmpId() = " + employee.getEmpId());

}

④注意

Mybatis是将自增主键的值设置到实体类对象中,而不是以Mapper接口方法返回值的形式返回。

⑤不支持自增主键的数据库

而对于不支持自增型主键的数据库(例如 Oracle),则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用
parameterType=”com.atguigu.mybatis.beans.Employee”
databaseId=”oracle”>
resultType=”integer”>
select employee_seq.nextval from dual

insert into orcl_employee(id,last_name,email,gender) values(#{id},#{lastName},#{email},#{gender})

或者是
parameterType=”com.atguigu.mybatis.beans.Employee”
databaseId=”oracle”>
resultType=”integer”>
select employee_seq.currval from dual

insert into orcl_employee(id,last_name,email,gender) values(employee_seq.nextval,#{lastName},#{email},#{gender})

6、数据库表字段和实体类属性对应关系

①别名

将字段的别名设置成和实体类属性一致。



关于实体类属性的约定:
getXxx()方法、setXxx()方法把方法名中的get或set去掉,首字母小写。

②全局配置自动识别驼峰式命名规则

在Mybatis全局配置文件加入如下配置:





SQL语句中可以不使用别名

③使用resultMap

使用resultMap标签定义对应关系,再在后面的SQL语句中引用这个对应关系

<!-- 使用id标签设置主键列和主键属性之间的对应关系 --><br />    <!-- column属性用于指定字段名;property属性用于指定Java实体类属性名 --><br />    <id column="emp_id" property="empId"/>

<!-- 使用result标签设置普通字段和Java实体类属性之间的关系 --><br />    <result column="emp_name" property="empName"/><br />    <result column="emp_salary" property="empSalary"/><br /></resultMap>


上一节 回目录