多表查询
一对一
- 需求:根据订单查询到订单人员的信息
- 开发步骤:在接口中定义相关方法,然后在xml映射文件中进行
<insert> 等标签的配置,重点是手动进行封装(resultmap),示例代码如下:
<select id="findAll" resultMap="orderMap">
SELECT *,o.`id` oid FROM USER u,orders o WHERE u.`id`=o.`uid`
</select>
- 注意点:订单类中封装user类(作为外键),给order一个ordermapper.xml的映射文件,在其中主要需要做的是信息的映射,有两种方法:分开来映射、使用
<association> 来进行整合后给user映射赋值,查出来的多余的数据没有被映射应该是被丢掉了,不用管。 - 代码如下:
<resultMap id="orderMap" type="order">
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
<association property="user" javaType="user">
<id column="uid" property="id"></id>
<id column="username" property="username"></id>
<id column="password" property="password"></id>
<id column="birthday" property="birthday"></id>
</association>
</resultMap>
一对多
- 需求:查找出用户所有的订单
- 注意点:用户实体类中加上订单List属性,在usermapper.xml文件中进行映射封装。
- 代码如下:
<resultMap id="userMap" type="user">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<collection property="orderList" ofType="order">
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
</collection>
</resultMap>
多对多
- 模型:一个人有多个角色
- 注意点:先定义一个中间表user_role;再在user表中定义描述有多个role的list属性;在usermapper.xml文件中定义相关映射,进行自动封装。
- 代码如下:
<resultMap id="roleMap" type="user">
<id column="userId" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<collection property="roleList" ofType="role">
<id column="roleId" property="id"></id>
<result column="roleName" property="roleName"></result>
<result column="roleDesc" property="roleDesc"></result>
</collection>
</resultMap>
知识总结

注解开发
常用注解

一对一
- 模型:一个订单只有一个用户
- 编写findAll方法,有两种方式封装user实体类,主要用到@Select、@Results和@one标签,重点关注@Results标签中的配置
- 代码如下:
@Select("select * from orders")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "ordertime", property = "ordertime"),
@Result(column = "total", property = "total"),
@Result(
property = "user",
column = "uid",
javaType = User.class,
one = @One(select = "com.itheima.mapper.UserMapper.findById")
)
})
public List<Order> findAll();
- usermapper接口中的findbyid方法如下:
@Select("select * from user where id=#{id}")
public User findById(int id);
一对多
- 模型:一个用户有多个订单
- 注意点:首先在user类中加入描述多个订单的List属性,再在映射类中加入查找方法findAllOrders;最后在该方法上进行注解,用到的标签与一对一相同
- sql可分解为两步:先把user表数据全部查出来;再根据user的id在order表中进行查询,接着将结果封装进List
- 代码如下:
@Select("select * from user")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "password", property = "password"),
@Result(
property = "orderList",
column = "id",
javaType = List.class,
many = @Many(select = "com.itheima.mapper.OrderMapper.findByUid")
)
})
public List<User> findAllOrders();
@Select("select * from orders where id=#{uid}")
public List<Order> findByUid(int uid);
多对多
- 一个用户有多个角色,一个角色也可以有多个用户,需要根据用户的id找到其角色种类;
- 要建role实体类
- sql查询分为两步:第一步是根据中间表和角色表的对应id相等查到有用的信息,再根据中间表的userId等于user表中的id来进行最后的查找
- 具体代码如下:
@Select("select * from user")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "password", property = "password"),
@Result(
property = "roleList",
column = "id",
javaType = List.class,
many = @Many(select = "com.itheima.mapper.RoleMapper.findByUid")
)
})
public List<User> findUserAndAllROles();
- 需要在RoleMapper接口中新建通过uid查找到角色的类
- 具体代码:
@Select("select * from roles r, user_role ur where r.id=ur.roleId and ur.userId=#{uid}")
public List<Role> findByUid(int uid);
spring整合mybatis
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"</property>
<property name="jbdcUrl" value="${jdbc.url}"</property>
<property name="username" value="${jdbc.username}"</property>
<property name="password" value="${jdbc.password}"</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:sqlMapConfig-spring.xml"></property >
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.mapper"></property >
</bean>
- 在spring配置文件中进行声明式事务整合
- 代码如下
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
</bean>
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.itheima.service.impl.*.*(..)"></aop:advisor>
</aop:config>
|