Mybatis实现订单案例的多表联合查询

一、创建如下五张表:
用户表.png
商品类型表.png
商品表.png
订单表.png
订单详情表.png
二、创建maven项目,在pom.xml里添加mariadb,junit,mybatis依赖
<dependencies>
        <dependency>
            <groupId>mariadb</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>1.8.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
    </dependencies>
三、在resource目录下创建一个mybatis.xml文件

进行数据库的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--
    该配置文件中包含一个configuration节点
        里面有配置信息 分别是环境和映射
         其中环境里有datasource,里面有我们熟悉的连接数据库的四个字符串
-->
<configuration>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.mariadb.jdbc.Driver"/>
                <property name="url" value="jdbc:mariadb://localhost:3306/order"/>
                <property name="username" value="root"/>
                <property name="password" value="yutong19970820"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="OrderMapper.xml"/>
        <mapper resource="ProductMapper.xml"/>
    </mappers>
</configuration>

给当前mybatis项目添加日志功能,该STDOUT_LOGGING值的好处是不用添加第三方jar包就可以有日志的输出:

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

引入db的配置文件信息,后面用到的四个连接字符串就可以直接使用如value="${driver}"的方式来动态引入:

    <properties resource="db.properties">
    </properties>

其中:

<mappers>
        <mapper resource="OrderMapper.xml"/>
        <mapper resource="ProductMapper.xml"/>
    </mappers>

当进行数据操作的时候要找到调用mybatis.xml文件将数据库连接启动,然后通过mapper标签去到别的xml文件进行SQL语句的查询,不同的数据操作要加上不同的xml文件

四、先根据uid查询订单,即根据uid查询该用户的订单。在resource目录下创建一个OrderMapper.xml
<?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,
    每个方法对应自己的sql语句,每个sql语句对应有一个id
    整个项目中所有的namespace.id必须是唯一的
    resultType:结果的数据类型
-->
<mapper namespace="orderMapper">
    <!--com.qianfeng.obu.OrderByUid 定义返回类型为OrderByUid,
    OrderByUid中定义的都是想要查询的属性。能得到想要查询的值-->
    <select id="getOrderByUid" resultType="com.qianfeng.obu.OrderByUid">
        select o.oid,u.userName,o.sumPrice,o.address,o.payType from orders as o left join users as u on u.uid=o.uid where u.uid=1
    </select>
</mapper>

创建一个对象类OrderByUid,里面的属性为想要查询的值,便于打印、得到所要查询的值的对象。此时resultType的值应填该类所在路径 :

public class OrderByUid {
    private int oid;
    private String userName;
    private double sumPrice;
    private String address;
    private String payType;

    public int getOid() {
        return oid;
    }

    public void setOid(int oid) {
        this.oid = oid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public double getSumPrice() {
        return sumPrice;
    }

    public void setSumPrice(double sumPrice) {
        this.sumPrice = sumPrice;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPayType() {
        return payType;
    }

    public void setPayType(String payType) {
        this.payType = payType;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("OrderByUid{");
        sb.append("oid=").append(oid);
        sb.append(", userName='").append(userName).append('\'');
        sb.append(", sumPrice=").append(sumPrice);
        sb.append(", address='").append(address).append('\'');
        sb.append(", payType='").append(payType).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

查询SQL语句为:(以想要查询uid为1 即zhangsan的订单为例)

select o.oid,u.userName,o.sumPrice,o.address,o.payType from orders as o left join users as u on u.uid=o.uid where u.uid=1
五、测试类
public void getOrderByUid(){

        OrderByUid orderByUid = session.selectOne("orderMapper.getOrderByUid");
        System.out.println(orderByUid);
    }

namespace+id即(orderMapper.getOrderByUid)找到的是唯一的sql语句

结果如图:

示例图.png

OrderByUid{oid=1, userName='zhangsan', sumPrice=50.0, address='安徽', payType='支付宝'}

六、注意事项
  1. OrderMapper的映射文件:
    1、namespace和id在整个项目中,必须要保证唯一
    2、namespace+id找到的是唯一的sql语句,标签可能不对应,但是不影响执行结果,但是还是需要规范各个标签
  2. 测试类
    1、创建SqlSession对象的时候,SqlSessionFactory对象的openSession()方法不包含参数,则使用事务手动提交,做完增删改操作后,需要调用SqlSession对象的commit()方法完成事务的提交。如果openSession()方法包含有一个true,代表自动提交生效,我们做完增删改操作时候,就完成了对应的增删改功能。openSession()方法默认的提交方式为手动提交
    2、该类活用了junit的生命周期方法,每个测试方法执行之前都会调用标注有@Before注解的setUp()方法完成环境的准备工作,每个方法完成之后都自动的执行标注有@After注解的tearDown()方法完成资源的释放工作
    3、SqlSession是mybatis中的核心对象,使用该对象即可完成对于所有操作的crud功能,里面有对应的方法,selectList(),查询列表(集合),selectOne()查询单个对象,insert(),delete,update()分别对应增删改功能。这三个方法的返回值均为受影响的行数。
    4、每次使用完SqlSession对象之后,使用close()方法将SqlSession对象关闭,不建议关闭SqlSessionFactory对象
    5、关于传递参数
    (1).传递单个值,sql语句里面的占位符可以任意写
    (2).多个值,可以使用Map来传值,map中的key要与sql语句中的占位符一致
    (3).对象传值,sql语句中的字段值与对象的属性名一致
    (4).零散值的传递,可以使用两种方式arg0, arg1,...或者param1,param2...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容