Heim > Java > javaLernprogramm > Hauptteil

Detaillierte Erläuterung der Mybatis-Zuordnungsdatei

不言
Freigeben: 2018-10-12 14:50:55
nach vorne
4229 Leute haben es durchsucht

Dieser Artikel enthält eine detaillierte Erklärung der Mybatis-Zuordnungsdatei. Freunde in Not können darauf verweisen.

Der eigentliche Kern von MyBatis ist die Zuordnungsdatei. Wenn Sie sie mit JDBC-Code mit derselben Funktion vergleichen, werden Sie feststellen, dass sie fast 95 % des Codes einspart.

MyBatis-Entitätsklassenzuordnungsdatei

MyBatis verfügt über mehrere Elemente der obersten Ebene

Auswahl: Mapping-Abfrageanweisung

<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
        select * from tal_employee
</select>
Nach dem Login kopieren

Einfügen: Mapping-Einfügeanweisung

Verwenden Sie #{Parameterattributname}, um einen Wert zuzuweisen

<insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee">
        insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>
Nach dem Login kopieren

: Zuordnungsänderungsanweisung

<update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee">
        update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}
 </update>
Nach dem Login kopieren

: Zuordnungslöschanweisung

<delete id="deleteEmp" parameterType="Integer">
        delete from tal_employee where id=#{id}
</delete>
Nach dem Login kopieren
Nach dem Login kopieren

: SQL-Anweisung, die von wiederverwendet werden kann andere SQL-Anweisungen.
: Es ist das komplexeste und leistungsfähigste Element, das zum Zuordnen von Datenbanktabellen und Entitätsklassen verwendet wird.

<resultMap type="com.simple.mybatis.entitys.Employee" id="Employee">
    <id property="id" column="id"/>
    <result property="lastName" column="last_name"/>
    <result property="email" column="email"/>
    <result property="gender" column="gender"/></resultMap><!-- 返回外部resultMap格式的类型。-->
 <select id="findAll" resultMap="Employee">
    select id,last_name AS lastName,email,gender from tal_employee
</select>
Nach dem Login kopieren

: Cache-Konfiguration für den angegebenen Namespace.
: Verweise auf andere Namespace-Cache-Konfigurationen.

Wir kombinieren Kapitel 1 und verwenden die vorherige Methode der Interaktion mit der Datenbank:

sqlSession.selectList("命名空间.select标签ID");
sqlSession.selectOne("命名空间.select标签ID");
sqlSession.update("命名空间.update标签ID", "Object类型参数");
sqlSession.delete("命名空间.delete标签ID", "Object类型参数");
sqlSession.insert("命名空间.insert标签ID", "Object类型参数");
Nach dem Login kopieren

Hinzufügen, Löschen und Ändern von Transaktionen müssen übermittelt werden: sqlSession.commit();

Verwendung Bei der Ausführung einer Methode mithilfe der XML-Zuordnungsdateimethode sind die Typbeschränkungen nicht zwingend erforderlich und die Lesbarkeit ist schlecht. Dies war die aufrufende Methode der frühen Ibatis. Darüber hinaus bietet Mybatis auch zwei weitere Implementierungsmethoden

MyBatis-Annotationsmethode

1: Wird zum Ändern der Methode zur Verwendung von Abfrageanweisungen verwendet

2. Wird zum Ändern der Methode zum Hinzufügen von Anweisungen verwendet.

3. @Update: Wird zum Ändern der Methode zum Ändern verwendet.

4. @Delete: Wird verwendet, um die Methode zur Verwendung der Löschanweisung zu ändern.

öffentliche Schnittstelle EmployeeAnnotation {
@Select("select id,last_name AS lastName,email,gender from tal_employee")
List

 @Insert("insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})")
 int saveEmp(Employee employee);

 @Update("update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}")
 boolean updateEmp(Employee employee);

 @Delete("elete from tal_employee where id=#{id}")
 long deleteEmp(Integer id);
 }
Nach dem Login kopieren

Dann müssen wir den Mybatis-Hauptserver konfigurieren Konfigurationsdatei Zuordnung dieser Annotationsschnittstelle

<!-- 映射注解类 -->
<mapper class="com.simple.mybatis.dao.EmployeeAnnotation"/>

@Test
    public void testAnnotation(){
        SqlSession session = sqlSessionFactory.openSession();
        EmployeeAnnotation employeeAnnotation = session.getMapper(EmployeeAnnotation.class);
        Employee employee = new Employee("测试注解增加", "email", "男");
        employeeAnnotation.saveEmp(employee);
        //提交事务
        session.commit();
        session.close();
}
Nach dem Login kopieren

Obwohl die Verwendung von Annotationen bequemer ist, ist es komplizierter, komplexe SQL-Anweisungen zu konfigurieren. Daher wird häufig eine Kombination beider Methoden eingesetzt.

Mybatis-Schnittstellenprogrammierung

Wir fügen zuerst eine Schnittstelle hinzu

public interface EmployeeMapper {
    List<Employee> findAll();
    
    int saveEmp(Employee employee);
    
    boolean updateEmp(Employee employee);
    
    long deleteEmp(Integer id);
}
Nach dem Login kopieren

Der Namespace der Entitätsklassenzuordnungsdatei muss dem vollständigen Namen der Schnittstelle und den darin enthaltenen Methoden entsprechen um dem hinzugefügten zu entsprechen. Löschen, ändern und überprüfen Sie die Tag-ID, um die Bindung abzuschließen

<?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.simple.mybatis.dao.EmployeeMapper">
    <resultMap type="com.simple.mybatis.entitys.Employee" id="Employee">
        <id property="id" column="id"/>
        <result property="lastName" column="last_name"/>
        <result property="email" column="email"/>
        <result property="gender" column="gender"/>
    </resultMap>

    <!-- 返回外部resultMap格式的类型。-->
    <select id="findAll" resultMap="Employee">
        select id,last_name AS lastName,email,gender from tal_employee
    </select>
    
    <insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee">
        insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
    </insert>
    
    <update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee">
        update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}
    </update>
    
    <delete id="deleteEmp" parameterType="Integer">
        delete from tal_employee where id=#{id}
    </delete>
</mapper>
Nach dem Login kopieren

und diese Zuordnungsdatei muss in die MyBatis-Hauptkonfigurationsdatei geladen werden

<mappers>
        <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" />
</mappers>
Nach dem Login kopieren

Verwendung:

@Test
    public void test4(){
        SqlSession session = sqlSessionFactory.openSession();
        //获取接口。这个接口mybatis会帮我创建代理实现类完成接口与XML映射的绑定
        EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
        employeeMapper.deleteEmp(1);
        session.commit();
        session.close();
    }
Nach dem Login kopieren

Rufen Sie den automatisch wachsenden Primärschlüssel nach dem Einfügen ab

Der Parameter useGeneratedKeys ist nur für die Einfügeanweisung wirksam und der Standardwert ist falsch. Wenn es auf „true“ gesetzt ist, bedeutet dies, dass JDBC die automatische Generierung des Primärschlüssels unterstützen darf und der automatisch generierte Primärschlüssel zurückgegeben werden kann, wenn die eingefügte Tabelle eine Spalte mit automatischer Inkrementierung als Primärschlüssel hat. keyProperty muss in den Primärschlüssel-ID-Attributnamen in parameterType="com.simple.mybatis.entitys.Employee

<insert id="saveEmpGetKey" parameterType="com.simple.mybatis.entitys.Employee"
    useGeneratedKeys="true" keyProperty="id"
    >
        insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>

@Test
    public void saveEmpGetKey(){
        SqlSession session = sqlSessionFactory.openSession();
        EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
        Employee employee = new Employee("自动封装主键", "email", "男");//增加之前主键没赋值
        employeeMapper.saveEmpGetKey(employee);
        session.commit();//提交事务
        System.out.println("增加后主键有值: " + employee.getId());
        session.close();//关闭资源
    }
Nach dem Login kopieren

Mybatis-Parameterregel

Wenn ein Parameter verwendet wird:

gekapselt werden

direkt Verwenden Sie einfach #{xxx}, um auf den Parameterwert zuzugreifen. Wenn es sich um einen Sammlungstyp (Collection, List, Set) handelt, verwenden Sie Kleinbuchstaben Name der Sammlung als Schlüsselwert.

Erforderliche Schnittstellenmethode:

long deleteEmp(Integer emp);
Nach dem Login kopieren

Mapping-Datei:

<delete id="deleteEmp" parameterType="Integer">
        delete from tal_employee where id=#{id}
</delete>
Nach dem Login kopieren
Nach dem Login kopieren

Sie können hier sehen, dass wir diesem keinen Wert zugewiesen haben , #{id}Mein Attributname heißt auch nicht id, sondern emp. Daher kann der Name eines Parameters beliebig sein, wenn es sich um den eingehenden Sammlungstyp

handelt Parameter:

//接口有方法:long deleteEmp(Map<String, Object> map);
<delete id="deleteEmp" parameterType="Map">
        delete from tal_employee where id=#{empID}
</delete>
Nach dem Login kopieren

Der Wert hier ist empID. Denken Sie einfach darüber nach und Sie wissen, dass Sie einfach ein map.put("empID", 1) als Parameter erstellen und es an den Methodenaufruf

übergeben müssen

Wenn mehrere Parameter vorhanden sind:

  1. Standard: Nur Sie können #{xxx} nicht verwenden, um auf Parameter zuzugreifen. Wenn mehrere Parameter vorhanden sind, kapselt mybatis die Parameter in einer Kartensammlung , und der Wert kann nur über #{subscript} oder #{paramN} abgerufen werden: Geben Sie den Schlüssel der Karte manuell an, wenn Sie den Kapselungsparameter angeben Hinzufügen von @Param("key") zur Schnittstellenmethode: Wenn mehrere Parameter gekapselte Geschäftsklassen sind, können Sie die Attribute direkt über #{property name} abrufen. Wenn mehrere Parameter keine gekapselten Geschäftsklassen sind, übergeben Sie einfach den entsprechenden Wert über #{key}, außer in MyBatis kann auch #{} verwendet werden, um den Wert des Parameters zu erhalten

    Unterschied: #{}: Der Parameter wird vorkompiliert in die SQL-Anweisung generiert. $ {}: Erzeugt den Wert direkt in der SQL-Anweisung.
  2. In den meisten Fällen verwenden wir #{} zum Abrufen von Parametern, aber an einigen Stellen, an denen Platzhalter nicht unterstützt werden, kann ${ } verwendet werden, um Parameter wie den Tabellennamen

    resultType return type
  3. <🎜 zu erhalten >

    Für Methoden zum Hinzufügen, Löschen und Ändern kapselt Mybatis das Ergebnis automatisch und gibt int, Boolean, long zurück. Alle sind in Ordnung

Für die Rückgabe von Entitätsobjekten und Listensammlungen. Der resultType kann auf den Entitätstyp gesetzt werden.

Wenn ein einzelnes Objekt zurückgegeben wird, kann es auch gekapselt werden. Für Map wird der resultType auf map gesetzt.

Wenn ein Map-Sammlungsobjekt zurückgegeben wird, z. B. Map, wird resultType auf den Student-Typ festgelegt und der in der Map platzierte Schlüsselwert wird durch geändert @MapKey("id") Annotation .

ResultMap标签介绍

ResultMap的常用子标签

  1. id:映射主键。result:映射普通列。

  2. association:复杂结果映射。

  3. collection:复杂类型的集合映射。

  4. constructor:构造函数注入。

前面我们的案例我们数据库的字段与实体类的属性基本上一致,或者不一致使用取别名方案解决,可是每条语句都去取别名是非常麻烦的,ResultMap这个标签就很好的解决数据库与实体类字段不对应的问题

我们新创建一个部门表:

CREATE TABLE tal_dept(
    d_id INT PRIMARY KEY AUTO_INCREMENT,
    d_name VARCHAR(50)
);
Nach dem Login kopieren

对应实体类:

public class Dept {
    private Integer id;
    private Integer name;
}
Nach dem Login kopieren

如果我们查询语句直接使用resultType="com.simple.mybatis.entitys.Dept那么毫无疑问我们的实体类中名字不对应是赋值为null的,我们可以ResultMap映射实体类与数据库的对应关系

<!--配置返回结果,配置数据库字段与类属性的映射-->
<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult">
        <id column="d_id" property="id"/>
        <result column="d_name" property="name"/>
</resultMap>
<!--使用resultMap使用指向上面返回结果的ID-->
<select id="getDeptOne" parameterType="Integer" resultMap="DeptResult">
        select * from tal_dept where d_id = #{id}
</select>
Nach dem Login kopieren

关系映射

在数据库中,许多数据是分布在多个表中的,有时候需要将多个表的数据关联起来进行查询。那么在ORM框架中,我们需要处理数据表的映射关系。

常见的映射关系:

  1. 关联属性映射association

  2. 映射collection映射

result方式映射属性

这种方式并不推荐,没有什么重用性

<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept">
        <id property="id" column="id"/>
        <result property="lastName" column="last_name"/>
        <result property="email" column="email"/>
        <result property="gender" column="gender"/>
        <!-- 指定Employee中Dept对象属性 -->
        <result property="dept.id" column="d_id"/>
        <result property="dept.name" column="d_name"/>
</resultMap>
<select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept">
        select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id
</select>
Nach dem Login kopieren

association映射(分步查询)

多对一,查询员工获取员工中的部门:

<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept">
        <id property="id" column="id"/>
        <result property="lastName" column="last_name"/>
        <result property="email" column="email"/>
        <result property="gender" column="gender"/>
        <!-- property指定实体类中对象dept 指定发过去的参数column="d_id" 
             select指定com.simple.mybatis.dao.DeptMapper映射文件中getDeptOne查询方法
         -->
        <association property="dept" column="d_id" 
        select="com.simple.mybatis.dao.DeptMapper.getDeptOne"></association>
</resultMap>
<!--resultMap指定使用上面定义的返回结果-->
<select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept">
        select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id
</select>
Nach dem Login kopieren

Collection查询

一对多,获取部门同时部门中员工也获取:

<!--部门映射-->
<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult">
        <id column="d_id" property="id"/>
        <result column="d_name" property="name"/>
        <!--property指定Dept中集合属性名 ofType指定集合中属性类型 -->
        <collection property="Employees" ofType="com.simple.mybatis.entitys.Employee" >
            <id property="id" column="id"/>
            <result property="lastName" column="last_name"/>
            <result property="email" column="email"/>
            <result property="gender" column="gender"/>
        </collection>
</resultMap>
<select id="getDeptAll" resultMap="DeptResult">
        select * from tal_dept d left join tal_Employee e on d.d_id = e.d_id
</select>
Nach dem Login kopieren

Collection嵌套查询

一对多分布查询

<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptOrEmployee">
        <id column="d_id" property="id"/>
        <result column="d_name" property="name"/>
        <!--select指定com.simple.mybatis.dao.EmployeeMapper映射文件中的getEmployeeByDeptId-->
        <collection property="Employees" column="d_id"  ofType="com.simple.mybatis.entitys.Employee" 
        select="com.simple.mybatis.dao.EmployeeMapper.getEmployeeByDeptId">
        </collection>
    </resultMap>
<!--com.simple.mybatis.dao.EmployeeMapperXML中方法-->
<select id="getEmployeeByDeptId" parameterType="Integer" resultType="com.simple.mybatis.entitys.Employee">
        select * from tal_employee where d_id = #{id}
    </select>
Nach dem Login kopieren

关联查询和分步查询的区别:

  1. 关联查询一次将多个表的数据查询出来,分步查询通过多次查询获取查询结果。

  2. 配置文件不同,关联查询需要定义额外的映射,分步查询需要定义外键列,和查询的select方法。

  3. 关联查询不支持延迟加载,分步查询支持延迟加载。fetchType="lazy"

延迟加载

刚才分布查询是一次将结果查询出来,为了提高效率,mybatis还支持延迟加载技术,等需要用到对象时才进行查询。

在mybatis主配置文件中配置:

<!– 通过全局配置文件设置延迟加载-->
<settings>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
Nach dem Login kopieren

设置级联延迟加载

<!– 设置延迟加载属性-->
<association fetchType="lazy"/>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Mybatis-Zuordnungsdatei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!