mybatis中用xml文件方式实现接口类
老师,在本章教学视频中,发现在dao层的PersonMapper.java是个接口类,里面提到说它的实现就是对应了mybatis下的PersonMapper.xml(即mybatis的映射配置文件)
我有点疑惑,在mybatis中,一个xml文件里也可以实现接口么?如果是这样的话,那接口的方法是怎么被实现的呢?是xml当中id为接口方法名的那个标签下增删改查实体么?
正在回答
同学你好,首先方法中有多个参数时,就不再使用sqlSession中的方法。需要使用自定义方法。
例如:
PersonMapper类:
Xml 文件中
测试
多参数传递可以按照如上方式进行。
其次,在之后的课程中,除了涉及到JavaBean对象,集合传参,也是有多个参数传递的详细讲解哦~
建议同学先观看讲解多参数传递的视频,看的时候根据视频敲遍代码,有什么不明白的,欢迎继续提问哦~
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
就比如说这个例子,下面的xml文件,命名空间是一个实体类不是接口对不对?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <? 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"> <!-- mapper 用于定义一个映射配置文件的根节点 namespace属性是用来配置命名空间,主要进行session级别的缓存管理 命名空间默认情况下,使用我们当前操作的实体类的全路径 --> < mapper namespace = "com.damu.entity.Users" > <!--<select id="findUsers" resultType="com.damu.entity.Users">--> < select id = "findUsers" resultMap = "forUsers" > select * from users < if test = "id != null" > where id = #{id} </ if > </ select > <!-- 自定义映射关系集合:主要包含对于一些自定义操作的配置,如不一致的属性和字段 --> < resultMap id = "forUsers" type = "com.damu.entity.Users" > <!-- 绑定id主键 --> < id property = "id" column = "id" ></ id > <!-- result配置,主要配置普通属性,column表示配置的是数据库字段名称 property配置的是实体类的属性名称 --> < result column = "username" property = "name" ></ result > < collection property = "addresses" column = "id" ofType = "com.damu.entity.Address" select = "getAddress" ></ collection > </ resultMap > < select id = "getAddress" resultType = "com.damu.entity.Address" > select * from address where userid = #{id} </ select > < sql id = "user_fields" > username, userpass, nickname, age, gender, email, phone, createTime, updateTime, lastLogin, userstatus, remark </ sql > < insert id = "addUser" useGeneratedKeys = "true" keyProperty = "id" > insert into users( < include refid = "user_fields" ></ include >) values(#{name},#{userpass}, #{nickname}, #{age}, #{gender}, #{email}, #{phone}, #{createTime}, #{updateTime}, #{lastLogin}, #{userStatus}, #{remark}) </ insert > < update id = "updateUser" > update users < set > < if test = "name != null" >username = #{name},</ if > < if test = "userpass != null" >userpass = #{userpass},</ if > < if test = "nickname != null" >nickname = #{nickname},</ if > < if test = "age != null" >age = #{age},</ if > < if test = "gender != null" >gender = #{gender},</ if > < if test = "email != null" >email = #{email},</ if > < if test = "phone != null" >phone = #{phone},</ if > < if test = "createTime != null" >createTime = #{createTime},</ if > < if test = "updateTime != null" >updateTime = #{updateTime},</ if > < if test = "lastLogin != null" >lastlogin = #{lastLogin},</ if > < if test = "userStatus != null" >userStatus = #{userStatus},</ if > < if test = "remark != null" >remark = #{remark},</ if > </ set > where id = #{id} </ update > < delete id = "delUser" > delete from users where id = #{id} </ delete > </ mapper > |
然后在dao层调用sql语句的时候,是用SqlSession对象来执行语句的对不对?如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | package com.damu.dao; import com.damu.entity.Users; import com.damu.utils.SqlSessionFactoryUtils; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import java.util.List; /** * Created by mouwe on 2017/5/23. */ public class UsersDAO { private SqlSession sqlSession; private List<Users> list; private Users user; private SqlSession getSession() { sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); return sqlSession; } /** * 查询全部用户 * @return */ public List<Users> findAll() { try { list = getSession().selectList( "findUsers" ); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return list; } /** * 查询单个用户根据编号 * @return */ public Users findById(Integer id) { try { user = getSession().selectOne( "findUsers" , new Users(id)); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return user; } /** * 增加一个新用户数据到数据库的方法 * @return */ public Users addUser(Users user) { try { // 返回值:是insert执行过程中影响的行数 getSession().insert( "addUser" , user); sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return user; } /** * 用于修改用户资料的方法 * @return */ public Users updateUsers(Users user) { try { // 返回值:是insert执行过程中影响的行数 getSession().update( "updateUser" , user); sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return user; } /** * 用于修改用户资料的方法 * @return */ public void delUsers(Integer id) { try { // 返回值:是insert执行过程中影响的行数 getSession().delete( "delUser" , id); sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } } |
其中,这里的
list = getSession().selectList("findUsers");
user = getSession().selectOne("findUsers", new Users(id));
getSession().insert("addUser", user);
getSession().update("updateUser", user);
上述的SqlSession的方法是不是传入了最多两个参数,第一个参数是xml标签对应的id值,表示执行哪条SQL语句,而第二个参数是封装成了一个javabean对象来传参,这个是多参处理的方式之一。就如果我不用封装JavaBean对象或者集合的方式,那么这种方式下要怎么传多个参数?
是这样子么?
list = getSession().selectList("findUsers",参数1,参数2,参数3...........);
就是说SqlSession中的select方法、insert方法、delete方法,可以直接传无穷个参数?
同学你好,
1、多参数传递在后面的课程中有详细讲解~
2、查询不改变数据,所以查询时不用使用事务。有关于事务的课程在之后的课程中有详细讲解,同学不用着急哦~按照视频循序渐进的学习就可以呢~
3、selectOne查询出的就是一条记录,selectList查询出的是记录的集合。
可以说MyBatis是对JDBC的一个封装,优化。这样做比之前返回结果集更方便。
4、PersonMapper.class是获取PersonMapper类的对象,getMapper方法是SqlSession内部封装好的方法,可以直接使用,表示:返回绑定到此sqlsession的映射。
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
那也就是说命名空间就是一个接口类咯?那刚开始视频教学是说命名空间默认情况下,使用我们当前操作的实体类的全路径。在里面编写SQL语句后,调用SqlSession的对应方法执行。
在命名空间是实体类的情况下,是通过SqlSession对象的selectList、selctOne、update、delete方法来执行xml里面的SQL语句的,其中第一个参数就是xml对应标签的id值,表示调用哪一个SQL语句。第二个则是代表传入的参数,可是这里只能传入一个参数么?我看这些方法要么就是只有一个id值参数,要么就是后面穿了个javabean对象,如果在xml中涉及到多参处理的话,我又不用封装JavaBean或者集合类的方法,要直接传多个参数怎么办?
视频中提到说mybatis的事务是默认不会自动提交的,可是我看了下查询的操作,也没有调用commit方法,就可以获得查询的结果,但是增删改却要加commit,查询是特例么?
在以前学习JDBC的时候,查询操作可以用executorQuery方法获取,不管查询某条记录还是一堆记录,得到的都是一个结果集ResultSet对象,可以通过遍历结果集获取每条记录。但是在mybatis我发现,查询一条记录时,SqlSession调用了selectOne方法,查多条记录用的是selectList方法,那这样的话不就得提前知道我查询的是某条记录还是记录的集合?有没一种方法能像JDBC返回结果集那样,返回一个结果集对象,不管是一条记录还是多条记录都封装在这个结果集里面呢?
之前视频映射的xml文件对应一个实体类,这次对应一个接口类,发现调用SQL语句的方法也有所不同。对应接口的话,直接用接口方法名即可,不用像之前那样传入一个id值的参数。我发现在xml映射一个接口类的时候,调用方法前有个反射的过程,如下例子:
- 1234567891011121314
/**
* 根据ID删除所对应的Person数据
*/
public
void
deletePerson() {
SqlSession sqlSession =
this
.getSqlSessionFactory().openSession();
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.
class
);
personMapper.deletePerson(
2
);
sqlSession.commit();
}
请问这里的 PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);语句是什么意思?类名.class是获取一个类的class文件对应的Class对象,这里通过一个Class对象返回的是它所反射的一个实体类对象,这个方法是已经SqlSession类内部集成好直接拿来用的么?
- 参与学习 人
- 提交作业 357 份
- 解答问题 8016 个
本阶段将带你学习MySQL数据库,JDBC接口,MyBatis框架等,带你掌握的数据的存放和管理。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧