银川建网站,ppt模板app,谷歌google地图,如何能查到百度搜索排名文章目录 1. 一对一什么是一对一User、Order类及Mapper#xff0c;User、Order表一对一操作的实现一对一操作实现的第二种方式 2. 一对多什么是一对多一对多操作实现 3. 多对多什么是多对多多对多的实现 4. 小结 1. 一对一
什么是一对一
一对一指的是表与表之间通过外键进行… 文章目录 1. 一对一什么是一对一User、Order类及MapperUser、Order表一对一操作的实现一对一操作实现的第二种方式 2. 一对多什么是一对多一对多操作实现 3. 多对多什么是多对多多对多的实现 4. 小结 1. 一对一
什么是一对一
一对一指的是表与表之间通过外键进行连接比如我们有一个Order类里面有属性id、orderTime、total以及一个下这个订单的用户userId通过userId找到对应的用户。一个订单会有一个对应的下单用户这就是一对一。
User、Order类及MapperUser、Order表
User表中有如下属性
Java代码中 User类的定义如下
package com.example.demo.domain;import java.util.Date;public class User {int id;String username;String password;Date birthday;Overridepublic String toString() {return User{ id id , username username \ , password password \ , birthday birthday };}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday birthday;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}
}并写好对应的Mapper UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.dao.UserMapper/mapperUserMapper.java
package com.example.demo.dao;import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public interface UserMapper {void save(User user);User findById(int id);ListUser findAll();}Order表中有如下属性
Java代码中 Order类的定义如下
package com.example.demo.domain;import java.util.Date;public class Order {int id;Date orderTime;double total;User user;Overridepublic String toString() {return Order{ id id , orderTime orderTime , total total , user user };}public int getId() {return id;}public void setId(int id) {this.id id;}public Date getOrderTime() {return orderTime;}public void setOrderTime(Date orderTime) {this.orderTime orderTime;}public double getTotal() {return total;}public void setTotal(double total) {this.total total;}public User getUser() {return user;}public void setUser(User user) {this.user user;}
}并写好对应的Mapper OrderMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.dao.OrderMapper/mapperOrderMapper.java
package com.example.demo.dao;public interface OrderMapper {}还有SqlMapConfig.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- 通过properties标签加载外部properties文件 --properties resourcejdbc.properties/properties!-- 自定义别名 --typeAliasestypeAlias typecom.example.demo.domain.User aliasuser/typeAlias/typeAliases!-- 配置分页助手插件 --pluginsplugin interceptorcom.github.pagehelper.PageInterceptor//plugins!-- 数据源环境 --environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/transactionManagerdataSource typePOOLEDproperty namedriver value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//dataSource/environment/environments!-- 加载映射文件 --mappersmapper resourcemapper/UserMapper.xml/mappermapper resourcemapper/OrderMapper.xml/mapper/mappers/configuration一对一操作的实现
假如我们有这样一条sql语句
SELECT *, o.id orderid FROM order o, user u WHERE o.uidu.id两张表中分别有如下数据
则查询的结果为
若想要把这条语句中各个属性封装到Order中对应的各个属性中其中User相关的属性封装到User里应如下写sql语句 在orderMapper.java中
package com.example.demo.dao;import com.example.demo.domain.Order;import java.util.List;public interface OrderMapper {ListOrder findAll();
}orderMapper.xml中
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.dao.OrderMapperresultMap idorderMap typecom.example.demo.domain.Order
!-- 手动指定字段与实体属性的映射关系--
!-- column:数据表的字段名称--
!-- property:实体的属性名称--id columnoid propertyid/idresult columnordertime propertyorderTime/resultresult columntotal propertytotal/resultresult columnuid propertyuser.id/resultresult columnusername propertyuser.username/resultresult columnpassword propertyuser.password/resultresult columnbirthday propertyuser.birthday/result/resultMapselect idfindAll resultMaporderMapSELECT *, o.id orderid, u.id userid FROM order o, user u WHERE o.uidu.id/select/mapper其中我们将SQL语句的返回值通过resultMap属性指定为orderMap并在上面定义了一个id为orderMap的resultMap 在resultMap中type属性表示返回的具体的类这里返回的是Order类因为我们要将返回的值都封装在Order类中 下面的id标签表示主键result表示其他结果 column用于指定返回的值名称property用于指定将返回的值注入到Order对象的哪个属性里去 其中要注意的事因为uid,password,birthday都是要注入到user这个对象里的所以在property中写的是user下的属性 测试代码
package com.example.demo;import com.example.demo.dao.OrderMapper;
import com.example.demo.domain.Order;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
// 1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件InputStream inputStream Resources.getResourceAsStream(sqlMapConfig.xml);
// 3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory sqlSessionFactoryBuilder.build(inputStream);
// 4. 获取SqlSessionSqlSession sqlSession sqlSessionFactory.openSession();OrderMapper orderMapper sqlSession.getMapper(OrderMapper.class);ListOrder orderList orderMapper.findAll();for (Order order: orderList){System.out.println(order);}// 6. 释放资源sqlSession.close();}
}查询结果
一对一操作实现的第二种方式
id为orderMap的resultMap还可以用以下的方式写 association标签中的property用于指定属性的名称javaType用于指定属性类型如果我们没有在sqlMapConfig.xml中配置别名的话这里就要写com.example.demo.domain.User 下面的内容是类似的不过通过这个方法就不需要再写user.xxx了直接写对应的属性名称就好
resultMap idorderMap typecom.example.demo.domain.Order
!-- 手动指定字段与实体属性的映射关系 --
!-- column:数据表的字段名称 --
!-- property:实体的属性名称 --id columnoid propertyid/idresult columnordertime propertyorderTime/resultresult columntotal propertytotal/result!-- property:当前实体(order)属性名称(private User user --
!-- javaType:当前实体(order)中的属性类型(User) --association propertyuser javaTypeuserid columnuid propertyid/idresult columnusername propertyusername/resultresult columnpassword propertypassword/resultresult columnbirthday propertybirthday/result/association
/resultMap运行结果保持不变
2. 一对多
什么是一对多
一对多指的是比如我们有一个Order类里面有属性id、orderTime、total以及一个下这个订单的用户userId每个用户可以下多个订单那就是一对多的关系。
一对多操作实现
想要查询一个用户及其名下的所有订单我们的SQL语句是这么写的
select *, o.id oid from user u, order o where u.ido.uid想要查询这种一对多关系的东西我们应该如下实现 修改User.java其中多了一个用户订单的List属性
package com.example.demo.domain;import java.util.Date;
import java.util.List;public class User {int id;String username;String password;Date birthday;// 描述当前用户存在哪些订单ListOrder orderList;Overridepublic String toString() {return User{ id id , username username \ , password password \ , birthday birthday , orderList orderList };}public ListOrder getOrderList() {return orderList;}public void setOrderList(ListOrder orderList) {this.orderList orderList;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday birthday;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}
}UserMapper.java
package com.example.demo.dao;import com.example.demo.domain.User;import java.util.List;public interface UserMapper {ListUser findAll();}UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.dao.UserMapperresultMap iduserMap typeuserid columnuid propertyid/idresult columnusername propertyusername/resultresult columnpassword propertypassword/resultresult columnbirthday propertybirthday/resultcollection propertyorderList ofTypeorderid columnoid propertyid/idresult columnorderTime propertyorderTime/resultresult columntotal propertytotal/result/collection/resultMapselect idfindAll resultMapuserMapselect *, o.id oid from user u, order o where u.ido.uid/select/mapper在总配置文件中加上别名配置
!-- 自定义别名 --
typeAliasestypeAlias typecom.example.demo.domain.User aliasuser/typeAliastypeAlias typecom.example.demo.domain.Order aliasorder/typeAlias
/typeAliases其中collection表示列表集合其中property指的是User类的属性名称ofType是List里面的属性 下面的id和column和之前的意思一样 测试代码
package com.example.demo;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
// 1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件InputStream inputStream Resources.getResourceAsStream(sqlMapConfig.xml);
// 3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory sqlSessionFactoryBuilder.build(inputStream);
// 4. 获取SqlSessionSqlSession sqlSession sqlSessionFactory.openSession();UserMapper userMapper sqlSession.getMapper(UserMapper.class);ListUser userList userMapper.findAll();for (User user: userList){System.out.println(user);}// 6. 释放资源sqlSession.close();}
}结果如下
3. 多对多
什么是多对多 其中user_role表中的信息如下
role表的信息如下 通过一个user_role表来连接两个表我们需要通过user_role为媒介进行role具体信息的查询 注意在这里一个用户可以有多个角色在user_role表中两个键均为主键。 一个用户可以有多个角色一个角色可以被多个用户拥有就是多对多的关系
多对多的实现
定义Role.java
package com.example.demo.domain;public class Role {int id;String roleName;String description;Overridepublic String toString() {return Role{ id id , roleName roleName \ , description description \ };}public int getId() {return id;}public void setId(int id) {this.id id;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName roleName;}public String getDescription() {return description;}public void setDescription(String description) {this.description description;}
}在User中加上对应的属性及方法
package com.example.demo.domain;import java.util.Date;
import java.util.List;public class User {int id;String username;String password;Date birthday;// 描述当前用户存在哪些订单ListOrder orderList;// 描述当前用户的角色ListRole roles;Overridepublic String toString() {return User{ id id , username username \ , password password \ , birthday birthday , roles roles };}public ListRole getRoles() {return roles;}public void setRoles(ListRole roles) {this.roles roles;}public ListOrder getOrderList() {return orderList;}public void setOrderList(ListOrder orderList) {this.orderList orderList;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday birthday;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}
}在UserMapper.java中加上对应方法的定义
package com.example.demo.dao;import com.example.demo.domain.User;import java.util.List;public interface UserMapper {ListUser findAll();ListUser findUserandRole();}在写对应的UserMapper.xml之前先把SQL语句写好这实际上就是通过user_role表来查询user对应的role相关的信息
SELECT * FROM user u, user_role ur, role r where u.id ur.userid and ur.roleid r.id查询结果如下 此时继续写UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.dao.UserMapperresultMap iduserMap typeuserid columnuid propertyid/idresult columnusername propertyusername/resultresult columnpassword propertypassword/resultresult columnbirthday propertybirthday/resultcollection propertyorderList ofTypeorderid columnoid propertyid/idresult columnorderTime propertyorderTime/resultresult columntotal propertytotal/result/collection/resultMapselect idfindAll resultMapuserMapselect *, o.id oid from user u, order o where u.ido.uid/selectresultMap iduserandRoleMap typeuserid columnuid propertyid/idresult columnusername propertyusername/resultresult columnpassword propertypassword/resultresult columnbirthday propertybirthday/resultcollection propertyroles ofTyperoleid columnroleid propertyid/idresult columnroleName propertyroleName/resultresult columndescription propertydescription/result/collection/resultMapselect idfindUserandRole resultMapuserandRoleMapSELECT * FROM user u, user_role ur, role r where u.id ur.userid and ur.roleid r.id/select/mapper这里对应的语句是findUserandRole中的语句返回的Map为userandRoleMap里面定义了对应的user信息及role的信息 在总配置中加上别名配置
!-- 自定义别名 --
typeAliasestypeAlias typecom.example.demo.domain.User aliasuser/typeAliastypeAlias typecom.example.demo.domain.Order aliasorder/typeAliastypeAlias typecom.example.demo.domain.Role aliasrole/typeAlias
/typeAliases测试代码
package com.example.demo;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
// 1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件InputStream inputStream Resources.getResourceAsStream(sqlMapConfig.xml);
// 3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory sqlSessionFactoryBuilder.build(inputStream);
// 4. 获取SqlSessionSqlSession sqlSession sqlSessionFactory.openSession();UserMapper userMapper sqlSession.getMapper(UserMapper.class);ListUser userList userMapper.findUserandRole();for (User user : userList) {System.out.println(user); }// 6. 释放资源sqlSession.close();}
}结果如下 和表中查询出来的结果一致
4. 小结 感觉就是如果是一个类里面包含有另一个类单个对象就通过resultMapassociation就可以 然后对于一个类里面包含有另一个类的列表的通过resultMapcollection实现即可。 其中resultMap中有属性id和type前者用于指定这个resultMap的名称type指定这个resultMap的返回类型 下面的id是主键result是其他信息其中包含column是数据库查表得到的列名称property是具体的属性名 association中的property是对应的属性名javaType是对应的类型 collection中的property是对应的属性名ofType是列表对应的类型