Java框架SSM:mybatis之二 一对一的关系
程序员文章站
2022-03-02 15:20:43
...
这是mybatis的第二次课!
mybatis的操作数据过程的思想大体与jdbc类似!开发效率稍低,但运行与jdbc相近。
hibernate将数据库表 当作对象一样操作,开发效率高,但运行慢,可能会去查一些不必要的数据。
jdbc是直连数据库,运行很快,但是开发效率低。
自己动手编辑SQL,接受数据的时候,自己编写接收方式,将某行某列的数据赋值给对象的某个属性!
uid | uname | cid |
1 | 得瑟得瑟 | 1 |
2 | 大师傅 | 2 |
cid | cnum |
1 | 241354235423535265 |
2 | 54663546546546546354 |
可以从两张表中看出,User表有一列值是卡的id,通过它可以查到另一张card表中的数据。
uid | uname | cid | cnum |
1 | 得瑟得瑟 | 1 | 241354235423535265 |
2 | 大师傅 | 2 | 54663546546546546354 |
Idea,是一款非常强大的Java的web开发工具。
ctrl+alt+f:切出,变为全局变量
alt+insert:封装对象属性,构造、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!