2.3.2 delete标签
功能:
定义删除sql语句
用法案例:
使用delete标签在数据库中删除员工编号为4的数据
①在EmployeeMapper接口中先定义删除数据的方法
代码示例如下:
//删除员工(根据员工编号删除对应的员工信息) public void deleteEmployee(int empId);
②在上述接口对应的映射文件中使用delete标签
代码示例如下:
<delete id="deleteEmployee"> delete from tbl_employee where id= #{empId} </delete>
③测试
代码示例如下:
@Test public void testDeleteEmployee(){ try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过SqlSessionFactory对象调用openSession(); SqlSession sqlSession = sqlSessionFactory.openSession(); //获取EmployeeMapper的代理对象 EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); //删除员工编号为4的员工信息 employeeMapper.deleteEmployee(4); //开启事务,数据才能真正存进数据库中 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); } }
2.3.3 update标签
功能:
定义修改sql语句
用法案例:
使用update标签修改员工编号为2的相关员工数据
修改前的数据:
①在EmployeeMapper接口中先定义修改数据的方法
代码示例如下:
//修改员工数据 public void updateEmployee(Employee employee);
②在上述接口对应的映射文件中使用update标签
代码示例如下:
<update id="updateEmployee"> update tbl_employee set email=#{email} , salary=#{salary} where id=#{id} </update>
③测试
@Test public void testUpdateEmployee(){ try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过SqlSessionFactory对象调用openSession(); SqlSession sqlSession = sqlSessionFactory.openSession(); //获取EmployeeMapper的代理对象 EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); //通过调用代理对象去执行删除,这点和当初在Dao层新建接口,接口的实现类去实现删除的功能很像,代理对 //象就相当于当初接口的实现类一样,但是我并没有写接口的实现类,但在mybatis框架中就真真切切的实现了 //删除的功能,究其原因,应该是mybatis在底层就帮我实现了,但是具体是怎么实现的,我暂时不知道 //修改员工编号为2的员工部分信息 employeeMapper.updateEmployee(new Employee(2,"hdjs@qq.com",120.0));; //开启事务,数据才能真正存进数据库中 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); } }
2.3.4 select标签
功能:
定义查询sql语句
用法案例:
使用select标签查询数据库中所有的员工信息
①在EmployeeMapper接口中先定义查看所有的员工数据的方法
代码示例如下:
//查看所有的员工信息 public List<Employee> showAllEmployee();
②在上述接口对应的映射文件中使用select标签
代码示例如下:
<!-- 查看所有的员工信息 --> <!-- 如果resultType中的值是一个类的类型,如果之前定义它的别名,这里可填写该类的别名,毕竟有时类的全名太长了 --> <select id="showAllEmployee" resultType="mybatis.pojo.Employee"> select id, last_name , email, salary from tbl_employee </select>
注意:
在resultType中,期望从这条语句中返回结果的类全限定名或别名,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能选其一使用。
③测试
@Test public void testShowAllEmployee(){ try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过SqlSessionFactory对象调用openSession(); SqlSession sqlSession = sqlSessionFactory.openSession(); //获取EmployeeMapper的代理对象 EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); List<Employee> employees = employeeMapper.showAllEmployee(); for (Employee employee : employees) { System.out.println(employee); } /* //开启事务,数据才能真正存进数据库中 sqlSession.commit(); */ } catch (IOException e) { e.printStackTrace(); } }
备注:以下子标签的详细功能用法将在接下来的序列文章中详细探讨,这里不做赘述
2.3.5 Sql标签
功能:
定义可重用的SQL语句块
2.3.6 cache标签
功能:
设置当前命名空间的缓存配置
2.3.7 cache-ref标签
功能:
设置其他命名空间的缓存配置
2.3.8 resultMap标签
功能:
描述如何从数据库结果集中加载对象
注意:
在使用多表查询的场景上,resultType解决不了,就用resultMap
2.4 映射文件中常用的属性
2.4.1 resultType
功能描述:
设置期望结果集返回类型【全类名或别名】
注意:
如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。
resultType和resultMap之间只能同时使用一个
2.5 获取主键自增数据
获取主键自增数据需要用到以下两个属性
useGeneratedKeys
:启用主键生成策略keyProperty
:设置存储属性值
用法案例:基于EmployeeMapper接口中的插入数据的方法,对其映射文件中原有的insert标签内,添加以上两个属性,使在插入数据时获得其自增主键
①在EmployeeMapper接口中书写插入数据的方法
代码示例如下:
//添加员工 public void insertEmployee(Employee employee);
②在EmployeeMapper接口对应的映射文件中对使用inset标签添加获取主键自增数据的两个属性
代码示例如下:
<!-- useGeneratedKeys="true" keyProperty="id" : 启用主键生成策略,返回的结果集中包含自动生成主键的信息,并将其赋值给实体类对象中的 id 属性 --> <insert id="insertEmployee" useGeneratedKeys="true" keyProperty="id"> insert into tbl_employee(last_name,email,salary) <!-- 这里是要将employee对象中的属性值传到mysql中 --> values(#{lastName},#{email},#{salary}) </insert>
③测试
代码示例如下
@Test public void testInsertKeyEmployee(){ try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过SqlSessionFactory对象调用openSession(); SqlSession sqlSession = sqlSessionFactory.openSession(); //获取EmployeeMapper的代理对象 EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee=new Employee("李四1","sshdfjf@163.com",9000.0); employeeMapper.insertEmployee(employee); //当执行插入sql后,获取新增员工的主键(员工编号) System.out.println("employee.getId() : "+employee.getId()); //开启事务,数据才能真正存进数据库中 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); } }
2.6 获取数据库受影响行数
如何获取数据库受影响行数?
直接将接口中相应方法的返回值设置为int或boolean即可
int
:代表受影响行数boolean
:代表是否影响了数据库,true代表影响了数据库,false则代表无
用法案例:在插入数据时获取数据库受影响的行数
①基于2.5小节中用法案例的代码,仅仅修改Mapper接口中返回值的类型为int
代码示例如下:
//修改Mapper接口中返回值的类型为int //添加员工 public int insertEmployee(Employee employee);
②测试代码做相应的微调并测试
//测试代码做相应的微调 @Test public void testInsertKeyEmployee(){ try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过SqlSessionFactory对象调用openSession(); SqlSession sqlSession = sqlSessionFactory.openSession(); //获取EmployeeMapper的代理对象 EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee=new Employee("李四1","sshdfjf@163.com",9000.0); //获取返回值i(影响数据库的行数) int i = employeeMapper.insertEmployee(employee); System.out.println("影响数据库的行数: "+i); //当执行插入sql后,获取新增员工的主键(员工编号) System.out.println("employee.getId() : "+employee.getId()); //开启事务,数据才能真正存进数据库中 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); } }