码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis-6

时间:2020-10-09 21:13:25      阅读:20      评论:0      收藏:0      [点我收藏+]

标签:app   add   for   方法   values   camel   包装   简单   private   

一.返回结果

1)返回单个对象

public Emp selectEmpByEname(@Param("ename")String ename)

<select id="selectEmpByEname" resultType="emp" parameterType="String">

   SELECT * FROM emp WHERE ename=#{ename}

</select>

2)返回List集合

public List<Emp> selectAllByDept(@Param("tableName") String tableName);

<select id="selectAllByDept" resultType="emp" parameterType="String">

   SELECT * FROM emp_${tableName}

</select>

注意:如果方法的返回值类型是List类型,那么在映射配置文件中<select>节点中的resultType的属性的值是这个List集合中元素的类型

3)返回类型是Map

3.1) 返回map类型的单个对象

接口

public Map<String,Object> selectEmpByEmpno(short empno);

映射文件中的配置

<select id="selectEmpByEmpno" parameterType="short" resultType="map">

   SELECT * FROM emp where empno=#{empno}

</select>

编写测试方法

@Test

public void test4(){

   SqlSession sqlSession= MyBatisUtil.crateSqlSession();

   EmpMapper empMapper=sqlSession.getMapper(EmpMapper.class);

   Map<String,Object> map=empMapper.selectEmpByEmpno((short)7369);

   logger.info(map);

   MyBatisUtil.closeSqlSession(sqlSession);

}

技术图片技术图片

3.2 )返回多条记录以Map作为返回值

接口

@MapKey("empno")

public Map<String,Emp> selectEmpsByLikeEnameReturnMap(String ename);

在接口中通过@Mapkey来指定Map集合的键

映射文件

<select id="selectEmpsByLikeEnameReturnMap" parameterType="string" resultType="emp">

   SELECT * FROM emp WHERE ename LIKE CONCAT(‘%‘,#{ename},‘%‘)

</select>

映射文件中resultType的值是Map集合中value的类型

测试

@Test

public void test5(){

   SqlSession sqlSession= MyBatisUtil.crateSqlSession();

   EmpMapper empMapper=sqlSession.getMapper(EmpMapper.class);

   Map<String,Emp> map=empMapper.selectEmpsByLikeEnameReturnMap("A");

   logger.info(map);

   MyBatisUtil.closeSqlSession(sqlSession);

}

控制台的显示结果

二.数据库列名和实体对象属性不一致的解决方案

之前数据库表字段和对象的属性名相同,在映射文件中通过resultType就能实现自动的对应,如果数据库的字段和实体对象不一致

2.1 准备数据表

CREATE TABLE person(

 person_id INT PRIMARY KEY AUTO_INCREMENT,

 person_name VARCHAR(32),

 person_age INT

);

INSERT INTO person(person_name,person_age)VALUES(‘张三‘,23);

INSERT INTO person(person_name,person_age)VALUES(‘李四‘,25);

2.2 实体对象

@Data

public class Person {

   private Integer personId;

   private String personName;

   private String personAge;

}

2.3 接口方法

public interface PersonMapper {

   public List<Person> findAllPerson();

}

2.4 映射文件

<?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.woniuxy.dao.PersonMapper">

   <select id="findAllPerson" resultType="person">

       SELECT * FROM person

   </select>

</mapper>

2.5 测试

@Test

public void test6(){

   SqlSession sqlSession= MyBatisUtil.crateSqlSession();

   PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

   List<Person> persons=personMapper.findAllPerson();

   for (Person p:persons){

       logger.info(p);

   }

   MyBatisUtil.closeSqlSession(sqlSession);

}

技术图片

如上虽然数据库已经查到了数据,但是由于数据库字段的名称和实体对象的属性名称不一致,这样resultType属性就不能实现自动的设置,遇到这样问题,有如下三种解决方案

1)使用AS关键字来解决

<select id="findAllPerson" resultType="person">

   SELECT person_id AS personId,person_name AS personName,person_age personAge

   FROM person

</select>

2)如果你的项目中采用驼峰命名法,那么可以在mybatis-cofig.xml文件中进行设置

person_id==========>personId

<settings>

   <setting name="mapUnderscoreToCamelCase" value="true"></setting>

</settings>

注意:如上设置一定要符合驼峰命名法才行,否则不能起到效果

3)采用resultMap方式来解决(推荐使用)

<?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.woniuxy.dao.PersonMapper">

   <resultMap id="personMap" type="Person">

       <!--

          id作为数据库的主键声明的,常用属性

             property:实体对象的属性名

             column:数据库字段名

          result:非主键字段的声明

       -->

       <id property="personId" column="person_id"></id>

       <result property="personName" column="person_name"></result>

       <result property="personAge" column="person_age"></result>

   </resultMap>

   <select id="selectAllPerson" resultMap="personMap">

       SELECT * FROM person

   </select>

</mapper>

技术图片总结

  1. 使用AS来取别名

  2. 通过在mybatis的配置文件中设置驼峰命名来完成

   1)

<settings>

   <setting name="mapUnderscoreToCamelCase" value="true"></setting>

</settings>

  2)数据库字段和属性  person_id==============>personId

 3 通过resultMap的方式完成(推荐使用)

 

三.类于类之间的关系

1)继承关系

继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。

技术图片技术图片

2)实现关系

实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。

技术图片技术图片

3)依赖关系

简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个method方法中使用。在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示

技术图片技术图片

4)关联关系

关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。

技术图片技术图片

5)聚合关系

聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。

技术图片技术图片

6)组合关系

组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。

技术图片技术图片

四.关联关系分类

1)一对一关联:例子 一个人有一张身份证,一张身份证对应一个人

2 )一对多关联:例子: 一个区县有多个街道

3 )多对多关联:例子:一个老师有多个学生,一个学生有多个学生

五.一对一关联

1.在类与类关系中,最常见是关联关系,按照应用场景可以分入如下几种

  • 一对一关联

  • 一对多关联

  • 多对多关联

2.一对一关联的场景

人和身份证,丈夫和妻子关系

3.mybatis中处理一对一的方法:有四种方法

3.1 包装类方式【了解】

1)数据库表的创建

#身份证表

CREATE TABLE tb_card(

 cid INT PRIMARY KEY AUTO_INCREMENT,

 CODE VARCHAR(18)

);

#测试数据

INSERT INTO tb_card(CODE)VALUES(‘610122198003084020‘);

COMMIT;

#公民表

CREATE TABLE tb_person(

  pid INT PRIMARY KEY AUTO_INCREMENT,

  NAME VARCHAR(50),

  age INT,

  sex VARCHAR(20),

  idcard INT UNIQUE,

  FOREIGN KEY(idcard) REFERENCES tb_card(cid)

);

#测试数据

INSERT INTO tb_person(NAME,age,sex,idcard)VALUES(‘张三‘,32,‘男‘,1);

COMMIT;

2)创建实体对象

@Data

public class Person {

   private Integer pid;

   private String name;

   private Integer age;

   private String sex;

}

再创建一个类,在此类中继承Person类,然后将关联的属性写在其中

@Data

public class PersonCard extends Person{

   private String code;

}

3)接口

public interface PersonMapper {

   public List<PersonCard> selectAllPersons();

}

4)编写映射文件

<?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.woniuxy.dao.PersonMapper">

   <select id="selectAllPersons" resultType="PersonCard">

       SELECT *

       FROM tb_person p INNER JOIN tb_card c ON p.idcard=c.cid

   </select>

</mapper>

5)编写测试

public class AppTest

{

   private Logger logger=Logger.getLogger(AppTest.class);

   @Test

   public void test1()

   {

       SqlSession sqlSession= MyBatisUtil.crateSqlSession();

       PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

       List<PersonCard> all=personMapper.selectAllPersons();

       for(PersonCard pc:all){

           logger.info(pc.getPid()+" "+pc.getName()+" "+pc.getSex()+" "+pc.getAge()+" "+pc.getCode());

       }

       MyBatisUtil.closeSqlSession(sqlSession);

   }

}

技术图片

分析:这种做法严格意义上来讲不能称为关联,这种做法不建议大家在开发中使用,仅供了解

练习时间:10:03-10:23

3.2 resultMap方式1【了解】

1)实体对象

@Data

public class Person {

   private Integer pid;

   private String name;

   private Integer age;

   private String sex;

   private Card card;

}

@Data

public class Card {

   private Integer cid;

   private String code;

}

2)接口

public interface PersonMapper {

   public List<Person> selectAllPersons();

}

3)映射文件

<?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.woniuxy.dao.PersonMapper">

   <resultMap id="personMap" type="person">

       <id property="pid" column="pid"></id>

       <result property="name" column="name"></result>

       <result property="age" column="age"></result>

       <result property="sex" column="sex"></result>

       <result property="card.cid" column="cid"></result>

       <result property="card.code" column="code"></result>

   </resultMap>

   <select id="selectAllPersons" resultMap="personMap">

       SELECT *

       FROM tb_person p INNER JOIN tb_card c ON p.idcard=c.cid

   </select>

</mapper>

4)编写测试类

package com.woniuxy;

import static org.junit.Assert.assertTrue;

import com.woniuxy.dao.PersonMapper;

import com.woniuxy.pojo.Person;

import com.woniuxy.util.MyBatisUtil;

import org.apache.ibatis.session.SqlSession;

import org.apache.log4j.Logger;

import org.junit.Test;

import java.util.List;

public class AppTest

{

   private Logger logger=Logger.getLogger(AppTest.class);

   @Test

   public void test1()

   {

       SqlSession sqlSession= MyBatisUtil.crateSqlSession();

       PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

       List<Person> all=personMapper.selectAllPersons();

       for(Person p:all){

           logger.info(p.getPid()+" "+p.getName()+" "+p.getSex()+" "+p.getAge()

                   +" "+p.getCard().getCid()+" "+p.getCard().getCode());

       }

       MyBatisUtil.closeSqlSession(sqlSession);

   }

}

Mybatis-6

标签:app   add   for   方法   values   camel   包装   简单   private   

原文地址:https://www.cnblogs.com/qiao88/p/13785227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!