当前位置:
搜档网 › mybatis一对一关系映射
mybatis一对一关系映射
mybatis核心文件: configuratinMapping.xml: 解释每一层目录: environments:开发环境,id可以有development和work开发和工作当项目发布后,改为work. environments下面可以集成多个enviroment,id和上面environments对应 事务管理:jdbc 数据源 type=pooled连接池的形式 建立和库字段对应的实体类: 因为mybatis通过java反射来工作,所以,必须有一个无惨的构造方法。 **********************映射文件xml中的目录:***********************8 mapper对应一个接口 mapper的namespace 就是接口的完整路径 select|insert|update|delete id 就是接口中的方法名称 关于在CRUD的时候的语句中: eg: insert into user (userName,password) values (#{userName},#{password}) 第一个userName和password是和数据库中字段的对应的名字 第二个#{userName},#{password}的参数名字必须和User实体类的属性对应 因为mybatis通过java反射来工作,在根据参数类型进行解析的时候,通过 getXxx来获取参数值的,所以必须对应。 在 delete from user where id="#{idd}" 参数idd可以使随便的名字,应为他参数的类型不是从实体类进来的,是整形。 所以可以随便去取。 在findAll()的时候, ***在增删改的时候注意提交事物 自动提交的时候在openSession(true) 添加true参数 **********************************基于注解的**************************************** 1.写一个接口,没有映射文件了,定义sql映射的接口,把所有的SQL语句都写在接口里面 eg: public interface UserMap(){ @insert("insert into user (username,password)values(#{name},#(password))") public int addUser(); @select("select * from user where id=#{id}") public User selectUser(); @selct("select * form user") public List getAll(); } 接口写完后必须要在mybatis的主配置文件中进行映射, 2.接口的实现不需要我们写,是动态实现的 在session中有个方法getmapper(userMapper.class) sqlSession session=factory.openSession(); UserMapper mapper=session.getMap(T.class),参数传入接口的类型就ok,直接动态产生了接口的实现类 调用接口里的方法 mapper.findAll(); ******************字段名和属性名不同的冲突****************8 当字段名和实体属性名不同的时候: 在查询的时候,select * 的时候,从数据库里查询出来的字段和实体属性名字不一样,mybatis就 无法直接映射到对应的属性去赋值,所以,出错。 可以通过: 1.select id userId name UserName from user; 起别名的形式吧数据库里的id name 值转换为userid username 来处理去映射到实体属性中。 2.mybatis提供
的resutlMap="mapId" 定义一个map处理主键用id 其他用result 1:1关联映射: 1.连表查询 2.嵌套查询 专门做一对一的标签: 例如:有个教师表和教室表,是一对一的关系,在教室表中有外键教师ID,现在查询教室id为?的教师 Teacher类和Classes类 在映射文件中, (基本的复合语句): select * form classes c,teachers t where c.teacher_id=t.teacher_id and c.c_id=1classes自己的属性id和name <==关键的标签association实现关联classes对象里的teacher对象==> javaTppe作用是告诉框架映射的类型 property是classes类中的属性名:teacher,类型是 Teacher类型,进行链接 teacher 里面的id 2.嵌套查询:(两次查询) 第一次查询classes所有信息,第二次根据第一次查询结果中的teacher信息在teacher 表中查找 select * form classes c,where c.c_id=#{id}没有用resultMap就必须用别名进行 字段列和实体属性的映射 select t_id id ,t_name name form teacher t,where t_id=#{tid}参数由上一次查询字段的结果传入teacher_idclasses自己的属性id和name teacher_id是取到该字段所对应的值传给select select引用了第二个查询teacher property是classes类中的属性名teacher,类型是Teacher类型,进行链接 teacher 里面的id