Java框架SSM:mybatis之二 一对一的关系

5 篇文章 0 订阅
3 篇文章 0 订阅

第一次mybatis 

百度是最强大的搜索器

这是mybatis的第二次课!

mybatis的操作数据过程的思想大体与jdbc类似!开发效率稍低,但运行与jdbc相近。

hibernate将数据库表 当作对象一样操作,开发效率高,但运行慢,可能会去查一些不必要的数据。

jdbc是直连数据库,运行很快,但是开发效率低。

自己动手编辑SQL,接受数据的时候,自己编写接收方式,将某行某列的数据赋值给对象的某个属性!

 

USer
uidunamecid
1得瑟得瑟1
2大师傅2

 

Card
cidcnum
1241354235423535265
254663546546546546354

可以从两张表中看出,User表有一列值是卡的id,通过它可以查到另一张card表中的数据。

连表
uidunamecidcnum
1得瑟得瑟1241354235423535265
2大师傅254663546546546546354

 

Idea,是一款非常强大的Java的web开发工具。

新建选择:maven-web

add Maven property

archetypeCatalog

internal

 

新建maven后,需要在src/main下新i建文件夹java、resource、test,并标记指定资源,右击mark directory as。

psvm:main方法

.sout:打印

.for:fore

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>MyBatisWork</groupId>
  <artifactId>MyBatisWork</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>MyBatisWork Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>


    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.1</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.43</version>
    </dependency>

  </dependencies>

  <build>
    <finalName>MyBatisWork</finalName>

    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>

    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

 

resources:资源加载问题。
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>

ctrl+alt+f:切出,变为全局变量

ctrl+alt+L:整理当前文件的代码

alt+insert:封装对象属性,构造、getset等。

右击 generate :封装对象属性,构造、getset等。

 

package com.hc.entity;

public class User {

    private int userId;
    private String userName;
    private Card card;

    public User() {

    }

    public User(String userName) {
        this.userName = userName;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

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

//    public static void main(String[] args) {
//        System.out.println("hello world");
//    }

    public Card getCard() {
        return card;
    }

    public void setCard(Card card) {
        this.card = card;
    }
}

这是USer的对象类。

package com.hc.entity;

public class Card {

    private int cardId;
    private String cardNum;
    private User user;

    public Card() {
    }

    public Card(String cardNum) {

        this.cardNum = cardNum;
    }

    public int getCardId() {
        return cardId;
    }

    public void setCardId(int cardId) {
        this.cardId = cardId;
    }

    public String getCardNum() {
        return cardNum;
    }

    public void setCardNum(String cardNum) {
        this.cardNum = cardNum;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

这是Card类。

可以看到,user里有card,card里有User,这是在建立一定的关系。

从User中可以调用card。

 

<?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="com.hc.dao.UserDao">


    <resultMap id="UserisCard" type="User">
        <id property="userId" column="userId"></id>
        <result property="userName" column="userName"></result>

        <association property="card" javaType="Card" column="cardId">
            <id property="cardId" column="cardId"></id>
            <result property="cardNum" column="cardNum"></result>
        </association>
    </resultMap>


    <select id="allUser" resultMap="UserisCard">
        select * from users u,card c where u.cardId=c.cardId
    </select>


</mapper>

 这是在为User、card建立具体的关系,User.xml。

select * from users u,card c where u.cardId=c.cardId:连表查询数据

select* from User:user变色,所以user不可用,改为了users。

resultMap:是自定义返回类型。
id:该属性为数据库主键。
association:因为user类中具有card的对象属性,可以调用,所以,把相对应的数据填充到card中。

 

如此,连表查询的数据就可以被接受。

就像jdbc般,自己编写SQL,又拿到所查出来的数据,然后进行匹配。例如:getInt(1)=某对象的某个属性。

这就是框架的强大之处!

 

package com.hc.dao;

import com.hc.entity.Son;
import com.hc.entity.User;
import java.util.List;

public interface UserDao {
    public List<User> allUser();
    public List<Son> allSon();
}

 

这是方法接口,可以调用 映射的关系文件User.xml中的SQL,拿到想要的某类型数据。

 

package com.hc.test;

import com.hc.dao.UserDao;
import com.hc.entity.Dog;
import com.hc.entity.Son;
import com.hc.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class First {

    private SqlSession session;
    private UserDao userDao;

    @Before
    public void before(){
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("myBatis-config.xml"));
        session = factory.openSession();
        userDao = session.getMapper(UserDao.class);
    }

    @Test
    public void testallSon(){

        List<Son> sons= userDao.allSon();
        for (Son son : sons) {
            System.out.println(son.getSonId()+"\t"+son.getSonName());
            for (Dog dog : son.getDogs()) {
                System.out.println(dog.getDogId()+"\t"+dog.getDogName());
            }
            System.out.println("\n");
        }
    }


    @Test
    public void testallUser(){
        List<User> users= userDao.allUser();
        for (User user : users) {
            System.out.println(user.getUserId()+"\t"+user.getUserName());
            System.out.println(user.getCard().getCardId()+"\t"+user.getCard().getCardNum());
            System.out.println("\n");
        }
    }

    @After
    public void after(){
        session.commit();
        session.close();
    }
}

具体操作数据的Test。

单元测试:

运行testallUser方法,可以得到某user以及与他相对应的那张卡。

mybatis的一对一就是这么简单,把连表查询的SQL放到数据库中查询,取回一堆值,然后一一匹配,填充到对象以及对象的某属性对象中。这是最为接近jdbc的操作。nb!

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪君.

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值