• 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战


    mabitis中的一对一关系项目实战:

    1.首先根据创建以mybatis为基础的web项目(1)中的流程将web项目部署好

    1. 打开IDE,建立web工程
    2. 在lib下面粘贴mybatis的jar,log4j的jar,mysql 连接的jar 最后最最重要的是要添加到构建路径中去,这样才能够被项目所使用
    3. 新建一个源文件夹config,用于存放xml文件
    4. 在src目录把下面新建四个包,分别是:
        • com.pojo:存放数据库表对应的实体类
        • com.imp:存放接口类
        • com.test:存放测试类
        • com.util:存放工具类(最好写成静态方法,可以用类点方法的方式调用方法)
        • 目录结构如下图所示:
          •   
    5. 在config下面新建一个com.imp包:存放接口类对应的xml文件(使用mapper代理接口方式: 使用接口和XML文件,在后台自动生成操作数据库的类)
    6. 在config下面新建一个main_config.xml文件用于配置数据库和一些相关的映射,环境,插件,别名,配置文件
      1.   main_config.xml
    7. 相应的再建立一个main_config.properties(这是一个键值对的文件,可用于存放jdbc的连接,便于修改)
      1.   main_config.properties
    8. 写一个工具类(MybatisConnection.java ),用于获取连接:
      1.   
         1 package com.util;
         2 
         3 import java.io.IOException;
         4 import java.io.InputStream;
         5 
         6 import org.apache.ibatis.io.Resources;
         7 import org.apache.ibatis.session.SqlSession;
         8 import org.apache.ibatis.session.SqlSessionFactory;
         9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
        10 
        11 public class MyBatisConnection {
        12     
        13     public static SqlSession getSqlSession() throws IOException{
        14         //获取主配置文件
        15         InputStream inputStream = Resources.getResourceAsStream("main_config.xml");
        16         //创建会话工厂
        17         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        18         SqlSession sqlSession = sqlSessionFactory.openSession();
        19         return sqlSession;
        20         
        21         
        22     }
        23 
        24 }
        MyBatisConnection.java
    9. 写一个测试类(TestConnection):测试是否可以获取连接
      1.   
         1 package com.test;
         2 
         3 import java.io.IOException;
         4 
         5 import org.apache.ibatis.session.SqlSession;
         6 
         7 import com.util.MyBatisConnection;
         8 
         9 public class TestConnection {
        10     
        11     public static void main(String[] args) throws IOException {
        12         SqlSession sqlSession = MyBatisConnection.getSqlSession();
        13         System.out.println(sqlSession);
        14         
        15     }
        16     
        TestConnection.java    

          

     2.建立一个人的表(t_person),每个人对应一个身份证(一一对应关系)所以建立一个(t_card)表

    表结构如下图所示

    3.建立对应的实体类(pojo)

    注意在person.java中cid对应写的是card的对象

     1 package com.pojo;
     2 
     3 public class Card {
     4     private int id;
     5     private int cardid;
     6     public Card() {
     7         super();
     8         // TODO 自动生成的构造函数存根
     9     }
    10     public int getId() {
    11         return id;
    12     }
    13     public void setId(int id) {
    14         this.id = id;
    15     }
    16     public int getCardid() {
    17         return cardid;
    18     }
    19     public void setCardid(int cardid) {
    20         this.cardid = cardid;
    21     }
    22     @Override
    23     public String toString() {
    24         return "Card [id=" + id + ", cardid=" + cardid + "]";
    25     }
    26 
    27 }
    Card.java
     1 package com.pojo;
     2 
     3 public class Person {
     4     
     5     private int id;
     6     private String name;
     7     private Card card;
     8     public Person() {
     9         super();
    10         // TODO 自动生成的构造函数存根
    11     }
    12     public int getId() {
    13         return id;
    14     }
    15     public void setId(int id) {
    16         this.id = id;
    17     }
    18     public String getName() {
    19         return name;
    20     }
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24     public Card getCard() {
    25         return card;
    26     }
    27     public void setCard(Card card) {
    28         this.card = card;
    29     }
    30     @Override
    31     public String toString() {
    32         return "Person [id=" + id + ", name=" + name + ", card=" + card + "]";
    33     }
    34 
    35 }
    Person.java

    4.写接口或者对应的xml文件(要注意三个规范:1.接口名和映射文件名相同,2.在同一目录下,3.使用mapper代理接口(接口和XML文件,在后台自动生成操作数据库的类)) 

    建议先写接口,有了接口之后再考虑怎么实现

    我先写了一个接口(IPerson.java)

     1 package com.imp;
     2 
     3 import java.util.List;
     4 
     5 import com.pojo.Person;
     6 
     7 public interface IPerson {
     8     //查询所有
     9     List<Person> sqlall();
    10 
    11 }
    IPerson.java

     再写对应的xml文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
     3 <!-- namespace:命名空间, 用于隔离sql语句 -->
     4 <mapper namespace="com.imp.IPerson">
     5 <!-- id是sql语句的唯一标识符,名字要与 接口中的方法名相同 -->
     6     <select id="sqlall" resultMap="test">
     7     SELECT
     8     t_person.id,
     9     t_person.`name`,
    10     t_person.cid,
    11     t_card.id,
    12     t_card.cardid
    13     FROM
    14     t_card
    15     INNER JOIN t_person ON t_person.cid = t_card.id
    16     </select>
    17     <resultMap type="person" id="test">
    18         <id column="id" property="id" />
    19         <result column="name" property="name" />
    20         <!-- association 是一对一映射关系使用的标签 -->
    21         <association property=""></association>
    22         <association property="card" javaType="card">
    23             <id column="cid" property="id" />
    24             <result column="cardid" property="cardid" />
    25         </association>
    26     </resultMap>
    27 
    28 </mapper>
    IPerson.xml

    在IPerson.xml中namepace的值为对应的接口的全限定名(com.imp.IPerson) 

    在IPerson.xml的查询中我们没有使用resultType而是使用了resultMap

    这是因为数据库表中的字段和实体类的属性不一致,这时候我们使用resultMap

    id表示主键, 

    result 表示普通的字段

    association:一对一关系

    column表示:查询结果对应的字段

    property:实体类对应的属性

    查询语句可以直接通过工具直接生成(直接拖动到空白处即可生成查询语句)

     

    5.接下来就应该是在主配置文件中写映射文件的路径了

    大家发现没有,我在IPerson.xml文件中写的Type,javaType都是实体类名,没有加包名,(这里我们要注意,我在主配置

    文件中写了别名,是通过包来加载的,所以只要写类名即可,首字母的大小写不作区分)

    在主配置文件的mappers标签中我使用的也是package映射,这是为了使用更加方便,如果有很多的xml文件要映射,那不是要写很多,这里只写一句就够了。

    1         <!-- 取别名 -->
    2     <typeAliases>
    3         <package name="com.pojo"/>
    4     </typeAliases>    
    5     <!-- 添加映射文件 -->
    6     <mappers>
    7     <package name="com.imp"/>
    8     </mappers>   
    main_config.xml

    注意标签的顺序,这个有严格的规定

    Content Model : (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,
    objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)

    6.接下来我们就要写一个测试文件,看看我们是否写成功了

     1 package com.test;
     2 
     3 import java.io.IOException;
     4 import java.util.List;
     5 
     6 import org.apache.ibatis.session.SqlSession;
     7 
     8 import com.imp.IPerson;
     9 import com.pojo.Person;
    10 import com.util.MyBatisConnection;
    11 
    12 public class TestSqlAll {
    13 
    14     public static void main(String[] args) throws IOException {
    15         SqlSession sqlSession = MyBatisConnection.getSqlSession();
    16         IPerson person = sqlSession.getMapper(IPerson.class);
    17         List<Person> list = person.sqlall();
    18         for (Person person2 : list) {
    19             System.out.println(person2);
    20         }
    21     }
    22 }
    TestSqlAll.java

    可能测试的时候会发生错误,我们要仔细看看报的什么错误,找到错误所在,改正即可

    7.测试结果如下(如果为空,那是因为你的数据库是空的啊)


     

  • 相关阅读:
    [SUCTF 2019]EasySQL
    [强网杯 2019]随便注
    [HCTF 2018]WarmUp
    Linux下配置JDK环境
    Centos克隆虚拟机后配置网络
    Sublime安装插件
    LeetCode-91-解码方法
    LeetCode-322-零钱兑换
    LeetCode-152-乘积最大子数组
    LeetCode-139-单词拆分
  • 原文地址:https://www.cnblogs.com/xyblogs/p/8780870.html
Copyright © 2020-2023  润新知