一对一、一对多注解开发

Mybatis注解开发

一、创建数据库

  1. 连接数据库:在命令窗口输入mysql -u root -p回车然后输入密码回车
  2. 创建数据库:create database mybatis;
  3. 创建表和插入数据
    use mybatis;
    
    create table tb_user(
       id int(10) primary key auto_increment,
       username varchar(32) not null,
       address varchar(32) not null);
    
    insert into tb_user values(1,'张三','广州'),(2,'王五','东莞'),(3,'李四','上海');
    
    create table tb_orders(
       id int(10) primary key auto_increment,
       number varchar(32) not null,
       user_id int(10) not null,
       foreign key(user_id) references tb_user(id));
    
    insert into tb_orders values(1,'1000001',1),(2,'1000002',1),(3,'1000003',2);
    
     

    二、导入相关依

    pom.xml代码如下:

    <?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>org.example</groupId>
        <artifactId>Mybatis的关系映射</artifactId>
        <version>1.0-SNAPSHOT</version>
            <dependencies>
                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                    <version>3.5.2</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.11</version>
                </dependency>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.12</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                    <version>1.2.17</version>
                </dependency>
            </dependencies>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.properties</include>
                            <include>**/*.xml</include>
                        </includes>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </build>
    </project>

    三、创建POJO实体

    在src/main/java目录下创建一个com.itheima.pojo包,在包下分别创建Users.java、Orders.java实体类,代码如下:

    Users.java

    package com.itheima.pojo;
    
    import java.util.List;
    
    public class Users {
        private Integer id;                 // 用户编号
        private String username;           // 用户姓名
        private String address;            // 用户地址
        private List<Orders> ordersList; //用户关联的订单
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public List<Orders> getOrdersList() {
            return ordersList;
        }
    
        public void setOrdersList(List<Orders> ordersList) {
            this.ordersList = ordersList;
        }
    
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", address="
                    + address + ", ordersList=" + ordersList + "]";
        }
    }
    

    Orders.java

    package com.itheima.pojo;
    
    import java.io.Serializable;
    
    public class Orders implements Serializable {
        private Integer id;//订单id
        private String number;//订单编号
        private Users users;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    
        public Users getUsers() {
            return users;
        }
    
        public void setUsers(Users users) {
            this.users = users;
        }
    
        @Override
        public String toString() {
            return "Orders{" +
                    "id=" + id +
                    ", number='" + number + '\'' +
                    ", users=" + users +
                    '}';
        }
    }
    

    四、创建数据库连接信息配置文件

    在项目的src/main/resources目录下创建数据库连接信息配置文件,其命名为:db.properties代码如下:

    mysql.driver=com.mysql.cj.jdbc.Driver
    mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&\
      characterEncoding=utf-8&useUnicode=true&useSSL=false
    mysql.username=root
    mysql.password=123456

    五、创建映射文件

    在项目的src/main/com/itheima目录下创建一个dao包,在该文件夹下创建UserMapper.java、OrdersMapper.java接口类,该文件主要用于配置注解SQL语句和Java对象之间的映射。其中property属性用于指定关联的实体类属性,column属性用于指定关联的数据库表中的字段,one属性用于指定数据表之间属于那种关联关系,@One注解表明数据表之间是一对一的关联关系;many属性和@Many表示一对多的关联关系。

        UserMapper.java:

package com.itheima.dao;

import com.itheima.pojo.Users;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    //一对一
    @Select("select * from tb_user  where id=#{id}")
    Users UserMapper(int id);//Users是返回信息的类型,UserMapper是调用的方法,int id是传入的参数值
    //一对多
    @Select("select * from tb_user where id=#{id}")
    @Results({@Result(id=true,column = "id",property = "id")
            ,@Result(column = "username",property = "username")
            ,@Result(column = "address",property = "address")
            ,@Result(column = "id",property = "ordersList",many=@Many(select ="com.itheima.dao.OrdersMapper.OrdersMappers")
    )})
    Users UserMappers(int id);
}

   OrdersMapper.java:

package com.itheima.dao;

import com.itheima.pojo.Orders;
import com.itheima.pojo.Users;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface OrdersMapper {
    //一对一
    @Select("select * from tb_orders where id=#{id}")
    @Results({@Result(column="user_id",property = "users",one = @One(select = "com.itheima.dao.UserMapper.UserMapper"))})
    //这里是将查询到的column的user_id值传给select = "com.itheima.dao.UserMapper.UserMapper"的查询语句中,然后将结果的返回值类型
    //值以property = "users"的形式打印出,其中users是Users实体类中设置的类型。
    Orders OrdersMapper(int id);
    //一对多
    @Select("select id,number from tb_orders where user_id=#{id}")
    @Results({@Result(id=true,column = "id",property = "id"),
    @Result(column = "number",property = "number")})
    List<Orders> OrdersMappers(int user_id);
}

六、创建MyBatis的核心配置文件

在项目的src/main/resources目录下创建Mybatis的核心配置文件,其命名为:mybatis-config.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>
    <!--引入数据库连接信息-->
    <properties resource="db.properties" />
    <settings>
        <!--设置打印信息 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--开启二级缓存的全局配置-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!--使用扫描包的形式定义别名 -->
    <typeAliases>
        <package name="com.itheima.pojo"/>
    </typeAliases>
    <!--配置运行环境,可以选择事务管理器和数据源,environments有两个子元素:分别为事务管理transactionManager元素和数据源dataSource元素-->
    <!--事务管理transactionManager元素有两种类型,分别为JDBC和MANAGED,JDBC配置直接提交和回滚设置-->
    <!--数据源dataSource元素配置不提交或回滚一个连接,而是让容器管理事务的整个生命周期,有无连接池UNPOOLED、连接池POOLED和JNDI-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 数据库驱动-->
                <property name="driver" value="${mysql.driver}"/>
                <!--连接数据库的url-->
                <property name="url" value="${mysql.url}"/>
                <!-- 连接数据库的用户名-->
                <property name="username" value="${mysql.username}"/>
                <!-- 连接数据库的密码-->
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--mapper的映射文件有4种,分别为类路径引入、本地路径引入、接口类引入、包名引入-->
    <mappers>
        <mapper class="com.itheima.dao.UserMapper"/>
        <mapper class="com.itheima.dao.OrdersMapper"/>
    </mappers>
</configuration>

七、创建MyBatis的工具类

在src/main/java目录下创建一个com.itheima.utils包,在包下创建一个MyBatisUtils.java工具类,代码如下:

package com.itheima.utils;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * 工具类
 */

public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory = null;

    // 初始化SqlSessionFactory对象
    static {
        try {
            // 使用MyBatis提供的Resources类加载MyBatis的配置文件
            Reader reader =
                    Resources.getResourceAsReader("mybatis-config.xml");
            // 构建SqlSessionFactory工厂
            sqlSessionFactory =
                    new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 获取SqlSession对象的静态方法
    public static SqlSession getSession() {
        return sqlSessionFactory.openSession();
    }
}

八、创建测试类

在src/main/java目录下创建一个com.itheima.test包,在包下创建一个MybatisTest.java测试类,代码如下:

package com.itheima.test;

import com.itheima.dao.OrdersMapper;
import com.itheima.dao.UserMapper;
import com.itheima.pojo.Orders;
import com.itheima.pojo.Users;
import com.itheima.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class mybatisTest {
    @Test
    public void findByIdTest1() {
        // 通过工具类生成SqlSession对象
        SqlSession session = MyBatisUtils.getSession();
        //getMapper()用于获取接口类对象,并通过调用接口类对象调用相应的方法查询相应的信息
        //一对一
        OrdersMapper ordersMapper =
                session.getMapper(OrdersMapper.class);
        Orders orders =ordersMapper.OrdersMapper(3);
        System.out.println("一对一");
            System.out.println(orders.toString());
        //一对多
        UserMapper userMapper =
                session.getMapper(UserMapper.class);
        Users users =userMapper.UserMappers(1);
        System.out.println("一对多");
        System.out.println(users.toString());
        session.commit();
        // 关闭SqlSession
        session.close();

    }
}

九、运行结果

总结

多练多看代码

猜你喜欢

转载自blog.csdn.net/weixin_47365427/article/details/125959217