标签: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> |
总结
使用AS来取别名
通过在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); } } |
标签:app add for 方法 values camel 包装 简单 private
原文地址:https://www.cnblogs.com/qiao88/p/13785227.html