kelovp.
首页 Java MyBatis使用XML配置SQL映射器

MyBatis使用XML配置SQL映射器

MyBatis提供了多种元素来配置不同类型的语句,比如Select、Insert、Update、Delete这样的,之前在写学生信息简单的增删改查时就已经使用过这些语句。而将这些映射都存放在mapper.xml当中,然后通过映射器Mapper接口来调用所对应的语句。而在Mapper当中不只这几个元素存在,还有其他的。

    CRUD:

insert into t\_student(id,name,age,adress) values(#{id},#{name},#{age},#{adress}) delete from t\_student where id =#{id} update t\_student set name = #{name},age = #{age} where id = #{id}

    显然上面的查询语句Select永远只会返回一个xin.work.Student类型的对象,所以在 涉及到多个符合条件的结果存在的时候,上面的配映射就不靠谱了。所以可以利用集合来实现多条数据的读取。

package xin.Logs;

import java.util.List;

public interface employeeMapper { public List SelectAll(); }

package xin.Logs;

import java.util.List;

import org.apache.ibatis.session.SqlSession; import org.junit.Test;

import xin.publicUse.MyBatisUtils;

public class EmployTest { @Test public void SelectAll() { SqlSession tk = MyBatisUtils.openSession(); employeeMapper op = tk.getMapper(employeeMapper.class); List tki = op.SelectAll(); for (Employee e : tki) { System.out.println(e); } tk.commit(); tk.close(); } }

    注意上述的SELECT映射定义,我们为所有的映射语句中的last_name和first_name起了别名。我们可以使用ResultMaps,来避免上述的到处重复别名。我们稍后会继续讨论。
    除了java.util.List,你也可以使用其他类型的集合类,如Set,Map,以及(SortedSet)。MyBatis 根据集合的类型,会采用适当的集合实现,如下所示:
    对于List,Collection,Iterable类型,MyBatis将返回java.util.ArrayList 
    对于Map类型,MyBatis 将返回java.util.HashMap  
    对于Set类型,MyBatis 将返回java.util.HashSet 
    对于SortedSet类型,MyBatis将返回java.util.TreeSet 

结果集映射 ResultMaps

    ResultMaps被用来将SELECT语句的结果集映射到java对象的属性中。ResultMaps特性非常强大,你可以使用它将简单的SELECT语句映射到复杂的一对一、一对多关系的SELECT语句上。所以说刚才上面的xml配置文件我可以改为:

    同时也要注意,resultMap在同一命名空间下的id肯定是唯一的,而且Type属性是完全限定类名或者是返回值的别名。子元素被用来将一个resultset列映射到对象的一个属性当中。元素和元素功能相同,不过被用来映射到唯一标识属性,用来区分和比较对象(一般和主键列相对应)。还有就是resultType和resultMap只能出现一个,不能 两个同时出现。

    此刻可以利用resultMap的特性来做更多的事情:当两张或者更多表出现在同一个select当中时,且其字段出现重复的情况下,就不能简单的像以上那样去做处理,还好resultMap给我们提供一个能够解决的办法:

    关联关系映射 设置一对一的映射:

    这里通过两张简单的表,设置一对一的级联

create table wife( wid number constraint wife_wid_pk primary key, wname varchar2(20), age number constraint wife_age_ck check (age>20), gender varchar2(4) constraint wife_gender_ck check (gender in(‘F’,‘M’)), brithday date ); create table hus( hid number constraint hus_hid_pk primary key, hname varchar2(20), age number constraint hus_age_ck check (age > 20), gender varchar2(4) constraint hus_gender_ck check (gender in(‘F’,‘M’)), brithday date, wife_id number constraint hus_wife_id_fk references wife(wid) constraint hus_wife_id_un unique );

     在插入数据之后设置映射文件:

    由此对应写出测试也是老套路,不再赘述。而也有嵌套select的写法:

    设置一对多的映射

    同样是写个测试表:

create table s_clz( id number primary key, name varchar2(20) ); create table s_stu( id number primary key, name varchar2(20), c_id number references s_clz(id) );

    插入测试数据之后尝试:

    其中的任意一种都可以查询得到,但是注意下最后一种的返回不太和前两种一样。

    多对多的关联

    依旧是先创建三个表:

create table m_user( id number primary key, name varchar2(20) ); create table m_role( id number primary key, name varchar2(20) ); create table m_user_role( u_id number references m_user(id), r_id number references m_role(id), primary key(u_id,r_id) );

    在理论层面多对多算是一对多的组合。

    SQL映射器配置暂且到此,更多详情请戳官方文档-=-

K
kelovp
后端工程师 · 广告投放 / 商业化
八年后端,做广告投放与商业化变现系统,现在带团队折腾商业化中台与 AIGC 内容平台。工作之外写点电子音乐、动漫解析和故事。相信把事情想清楚,才写得明白。