IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 2021-07-23 -> 正文阅读

[Java知识库]2021-07-23

多表查询

一对一

  • 需求:根据订单查询到订单人员的信息
  • 开发步骤:在接口中定义相关方法,然后在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映射赋值,查出来的多余的数据没有被映射应该是被丢掉了,不用管。
  • 代码如下:
<!--手动指定字段和实体属性之间的关系
        column:数据表的字段名称
        property:实体属性名称
        id:ordermap:select标签中resultMap引用的值,为其指定返回数据映射方法
        type:要封装的实体类,此时我们需要返回的是order类
    -->
    <resultMap id="orderMap" type="order">
        <id column="oid" property="id"></id><!--id是指主键,其他属性用result-->
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
        <!--第一种方法-->
        <!--        <result column="uid" property="user.id"></result>-->
<!--        <result column="username" property="user.username"></result>-->
<!--        <result column="password" property="user.password"></result>-->
<!--        <result column="birthday" property="user.birthday"></result>-->
        <!--
            property:当前实体类(order)中属性的名称(user)
            javatype:当前实体类(order)中属性的类型(User),此时使用user是因为进行了别名的设置
        -->
         <!--第二种方法-->
        <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>
        <!--
        property:实体类中集合的属性名
        ofType:集合中的数据类型
        -->
        <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">
        <!--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>
        <!--user内部roleList的信息-->
        <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", //要封装的在order实体类中的属性
                    column = "uid", //指定根据数据库中哪个字段查询user表的数据
                    javaType = User.class, //要封装成的实体类型
                    //select:指定需要根据另一个映射类(UserMapper)中的哪个方法进行查询
                    one = @One(select = "com.itheima.mapper.UserMapper.findById")
            )
    })
    public List<Order> findAll();
    
    //第一种方式:
    /*@Select("select *,o.id oid from user u,orders o where u.id=o.uid")
    @Results({
            @Result(column = "oid", property = "id"),
            @Result(column = "ordertime", property = "ordertime"),
            @Result(column = "total", property = "total"),
            @Result(column = "uid", property = "user.id"),
            @Result(column = "username", property = "user.username"),
            @Result(column = "password", property = "user.password"),
    })
    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"), //id=true指明主键
            @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();


//OrderMapper映射类中根据uid来查找的方法
	@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

  • 思想:让spring容器帮忙生成mapper对象
    思想

  • 在spring的配置文件applicationContext.xml中进行配置

  • 具体代码如下:

<!--加载配置文件,储存了数据库的驱动、url、用户名和密码等信息-->
<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>
<!--配置sessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<!--加载mybatis核心文件,此时的sqlMapConfig-spring.xml中只有别名设置和其他插件等设置-->
	<property name="configLocation" value="classpath:sqlMapConfig-spring.xml"></property >
<!--扫描mapper所在的包,方便为mapper创建实现类--> 
<!--相当于sqlMapConfig.xml文件中的加载映射-->
<!--
<mappers>
	<mapper resource="com/itheima/mapper/AccountMapper.xml"></mapper>
	<!--AccountMapper.xml中存在的是接口中需要实现的sql语句-->
	<!--或者是下面直接扫描包的语句-->
	<!--<package name="com.itheima.mapper"></package>
</mappers>-->
<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-->
<aop:config>
	<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.itheima.service.impl.*.*(..)"></aop:advisor>
</aop:config>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:18:43  更:2021-07-24 11:19:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:39:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码