当前位置: 代码网 > it编程>编程语言>Java > MyBatis中的接口代理机制及其使用方式

MyBatis中的接口代理机制及其使用方式

2024年06月17日 Java 我要评论
mybatis中的接口代理机制及其使用mybatis 中的接口代理类机制,mybatis 框架中使用了动态代理的设计模式,让我们可以不用写,对应xxxmapper.java 接口的实现类,而是通过动态

mybatis中的接口代理机制及其使用

mybatis 中的接口代理类机制,mybatis 框架中使用了动态代理的设计模式,让我们可以不用写,对应xxxmapper.java 接口的实现类,而是通过动态代理的方式,让mybatis 自动为我们生成对应实现了该 xxxmapper.java接口的实现类,这个动态代理实现的类,我们可以直接使用。

核心代码:

 		// 获取到 sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 获取到sqlsessionfactory 对象
        // sqlsessionfactory对象,一个sqlsessionfactory对应一个 environment, 一个environment通常是一个数据库
        sqlsessionfactory sessionfactory = sqlsessionfactorybuilder.build(resources.getresourceasstream("mybatis-config.xml"), "mybatis");
        // 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        car car = new car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
		// 需要注意的是参数的 xxxmapper.class 和 返回值是保持一致的。
        xxxmapper mapper = sqlsession.getmapper(xxxmapper.class);
		mapper.xxx(); // 执行的是该xxxmapper接口中的方法
		// 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        car car = new car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
		// 需要注意的是参数的 xxxmapper.class 和 返回值是保持一致的。
        xxxmapper mapper = sqlsession.getmapper(xxxmapper.class);
		mapper.xxx(); // 执行的是该xxxmapper接口中的方法

使用以上代码的前提是:xxxmapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。

比如:我们这里的是:

carmappe.xml

xxxmapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致

对应的接口上的方法名,id 必须dao(mapper) 接口中方法名一致。

使用的是 pojo 属性类赋值的话,#{} 的括号中的值,必须是 pojo类当中的属性名,比如这里我们用的是 car ,则#{}括号中的值,则必须是 car 的属性名。同时 #{} 括号中一定要有值(就算只有一个参数,也要有值(随便写都要有值),才行,不然编译无法通过)

实操

下面我们使用 mybatis 的接口代理机制,对数据库进行crud,(增删改查)的操作。

1.准备工作

数据表结构的设计,数据表名为:t_car

t_car 表中的数据信息:

pom.xml 文件当中配置相关的依赖的 jar 包如下:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
         xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelversion>4.0.0</modelversion>

    <groupid>com.rainbowsea</groupid>
    <artifactid>mybatis-005-crud-blog</artifactid>
    <version>1.0-snapshot</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <!--        mybatis 的依赖-->
        <dependency>
            <groupid>org.mybatis</groupid>
            <artifactid>mybatis</artifactid>
            <version>3.5.10</version>
        </dependency>

        <!--        mysql -->
        <dependency>
            <groupid>mysql</groupid>
            <artifactid>mysql-connector-java</artifactid>
            <version>8.0.30</version>
        </dependency>

        <dependency>
            <groupid>junit</groupid>
            <artifactid>junit</artifactid>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!--        引入 logback的依赖,这个日志框架实现了slf4j 规范-->
        <dependency>
            <groupid>ch.qos.logback</groupid>
            <artifactid>logback-classic</artifactid>
            <version>1.2.11</version>
        </dependency>
    </dependencies>

</project>

配置 logback 的配置文件,用于打印显示,我们的日志信息,方便我们查看我们的运行过程,效果。

<?xml version="1.0" encoding="utf-8"?>

<configuration debug="false">
    <!-- 控制台输出 -->
    <appender name="stdout" class="ch.qos.logback.core.consoleappender">
        <encoder class="ch.qos.logback.classic.encoder.patternlayoutencoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-mm-dd hh:mm:ss.sss} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--mybatis log configure-->
    <logger name="com.apache.ibatis" level="trace"/>
    <logger name="java.sql.connection" level="debug"/>
    <logger name="java.sql.statement" level="debug"/>
    <logger name="java.sql.preparedstatement" level="debug"/>

    <!-- 日志输出级别,logback日志级别包括五个:trace < debug < info < warn < error -->
    <root level="debug">
        <appender-ref ref="stdout"/>
        <appender-ref ref="file"/>
    </root>

</configuration>

配置 mybatis 的核心配置文件,

<?xml version="1.0" encoding="utf-8" ?>
<!doctype configuration
        public "-//mybatis.org//dtd config 3.0//en"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--    起别名-->
    <typealiases>
        <!--  使用 <package>	还可以将这个包下的所有的类的全部自动起别名,别名就是简名,不区分大小写 -->
        <package name="com.rainbowsea.mybatis.pojo"/>
    </typealiases>
    <environments default="mybatis">

        <environment id="mybatis">
            <!--            managed 没有用第三框架管理的话,都是会被提交的,没有事务上的管理了 -->
            <transactionmanager type="jdbc"/>
            <datasource type="pooled">
                <property name="driver" value="com.mysql.cj.jdbc.driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql123"/>
            </datasource>
        </environment>
    </environments>
    <mappers>
        <!-- 这里也是可以使用 package 包名扫描,但是同样的:对应接口路径要一致,接口名一致-->
        <mapper resource="carmapper.xml"></mapper>
    </mappers>
</configuration>

对照 t_car 创建的orm 映射的 car 类

注意:在mybatis 当中对应的orm ,一般在框架里对应的 bean实体类,一定要实现该 set 和 get 方法以及无参数构造方法,无法框架无法使用反射机制,进行操作 。

建议用包装类,这样可以防止 null的问题,因为(简单类型 int num = null ,是不可以赋值为 null)的编译无法通过

package com.rainbowsea.mybatis.pojo;

public class car {
    // 数据库表当中的字段应该和pojo类的属性一一对应
    // 建议使用包装类,这样可以防止null的问题
    private long id;
    private string carnum;
    private string brand;
    private double guideprice;
    private string producetime;
    private string cartype;

    public car() {
    }

    public car(long id, string carnum, string brand, double guideprice, string producetime, string cartype) {
        this.id = id;
        this.carnum = carnum;
        this.brand = brand;
        this.guideprice = guideprice;
        this.producetime = producetime;
        this.cartype = cartype;
    }

    @override
    public string tostring() {
        return "car{" +
                "id=" + id +
                ", carnum='" + carnum + '\'' +
                ", brand='" + brand + '\'' +
                ", guideprice=" + guideprice +
                ", producetime='" + producetime + '\'' +
                ", cattype='" + cartype + '\'' +
                '}';
    }

    public long getid() {
        return id;
    }

    public void setid(long id) {
        this.id = id;
    }

    public string getcarnum() {
        return carnum;
    }

    public void setcarnum(string carnum) {
        this.carnum = carnum;
    }

    public string getbrand() {
        return brand;
    }

    public void setbrand(string brand) {
        this.brand = brand;
    }

    public double getguideprice() {
        return guideprice;
    }

    public void setguideprice(double guideprice) {
        this.guideprice = guideprice;
    }

    public string getproducetime() {
        return producetime;
    }

    public void setproducetime(string producetime) {
        this.producetime = producetime;
    }

    public string getcartype() {
        return cartype;
    }

    public void setcartype(string cattype) {
        this.cartype = cattype;
    }
}

对应操作实现crud(增删改查)的接口(这里是:carmapper接口),在mybtis 当中 ,关于 crud(增删改查)操作的接口/实现类,都是 mapper 结尾的作为持久层,而在 mvc的三层架构中,则是以 dao 为后缀作为crud(增删改查)操作的接口/实现类。

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.car;

import java.util.list;

public interface carmapper {


    /**
     * 新增 car
     * @param car
     * @return
     */
    int insert(car car);


    /**
     * 根据id 删除 car
     * @param id
     * @return
     */
    int deletebyid(long id);


    /**
     * 修改汽车信息
     * @param car
     * @return
     */
    int update(car car);


    /**
     * 根据id查询汽车信息
     * @param id
     * @return
     */
    car selectbyid(long id);


    /**
     * 获取所有的汽车信息
     * @return
     */
    list<car> selectall();
}

2.insert 增加操作

对应 carmapper 接口中的 insert( ) 抽象方法。

public interface carmapper {

    /**
     * 新增 car
     * @param car
     * @return
     */
    int insert(car car);
}

对应 carmapper.xml sql语句映射文件,上编写 insert 插入的 sql语句。

<?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">

<!--namespace 一定要是:对应的接口的全限定类名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.carmapper">

    <!--	id 要是 namespace 对应接口上的方法名: -->
    <insert id="insert" parametertype="com.rainbowsea.mybatis.pojo.car">
        insert into t_car values(null,#{carnum},#{brand},#{guideprice},#{producetime},#{cartype})
    </insert>

</mapper>

java当中编程运行程序:

注意:因为是对数据库进行了修改,所以需要 commit() 提交给数据库,以及 close() 关闭资源

package com.rainbowsea.mybatis.test;

import com.rainbowsea.mybatis.mapper.carmapper;
import com.rainbowsea.mybatis.pojo.car;
import org.apache.ibatis.io.resources;
import org.apache.ibatis.session.sqlsession;
import org.apache.ibatis.session.sqlsessionfactory;
import org.apache.ibatis.session.sqlsessionfactorybuilder;
import org.junit.test;

import java.io.ioexception;

public class carmappertest {

    @test
    public void testinsert() throws ioexception {
        // 获取到 sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 获取到sqlsessionfactory 对象
        // sqlsessionfactory对象,一个sqlsessionfactory对应一个 environment, 一个environment通常是一个数据库
        sqlsessionfactory sessionfactory = sqlsessionfactorybuilder.build(resources.getresourceasstream("mybatis-config.xml"), "mybatis");
        // 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        car car = new car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
        carmapper mapper = sqlsession.getmapper(carmapper.class);
        int count = mapper.insert(car);

        system.out.println(count);
        sqlsession.commit();
        sqlsession.close();


    }
}

3.delete 删除操作

根据 id 删除一条记录,删除id为 124的一条记录。

对应 carmapper 接口中的 deletebyid( long id) 抽象方法。

public interface carmapper {


    /**
     * 新增 car
     * @param car
     * @return
     */
    int insert(car car);


    /**
     * 根据id 删除 car
     * @param id
     * @return
     */
    int deletebyid(long id);
}

对应 carmapper.xml sql语句映射文件,上编写 delete 删除的 sql语句。

使用以上代码的前提是:xxxmapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。

<?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">

<!--namespace 一定要是:对应的接口的全限定类名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.carmapper">


<!--    如果只有一个参数需要传的话,#{} 括号中的值,可以随便写,但最后见名知意-->
    <delete id="deletebyid" >
        delete from t_car where id=#{id}
    </delete>
</mapper>

java当中编程运行程序:

注意:因为是对数据库进行了修改,所以需要 commit() 提交给数据库,以及 close() 关闭资源

删除id为 124的一条记录。

import org.junit.test;

import java.io.ioexception;

public class carmappertest {

    @test
    public void testdeletebyid() throws ioexception {
        // 获取到 sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 获取到sqlsessionfactory 对象
        // sqlsessionfactory对象,一个sqlsessionfactory对应一个 environment, 一个environment通常是一个数据库
        sqlsessionfactory sessionfactory = sqlsessionfactorybuilder.build(resources.getresourceasstream("mybatis-config.xml"), "mybatis");
        // 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
        carmapper mapper = sqlsession.getmapper(carmapper.class);

        // 删除id为 124的一条记录。
        int count = mapper.deletebyid(124l);
        sqlsession.commit(); // 提交给数据库
        sqlsession.close(); // 关闭资源
        system.out.println(count);

    }
}

4.update 修改操作

根据 id 修改记录信息。

将 id 为 128的 brand 改为小米su7, guide_price 改为 21.00 , 时间改为 2024-03-28

对应 carmapper 接口中的 update( ) 抽象方法。

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.car;

import java.util.list;

public interface carmapper {


    /**
     * 修改汽车信息
     * @param car
     * @return
     */
    int update(car car);

}

对应 carmapper.xml sql语句映射文件,上编写 update 修改的 sql语句。

使用以上代码的前提是:xxxmapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。

<?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">

<!--namespace 一定要是:对应的接口的全限定类名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.carmapper">


    <!--	id 要是 namespace 对应接口上的方法名: -->
    <update id="update">
        update t_car
        set car_num=#{carnum},
            brand=#{brand},
            guide_price=#{guideprice},
            produce_time=#{producetime},
            car_type=#{cartype}
        where id = #{id}
    </update>


</mapper>

java当中编程运行程序:

注意:因为是对数据库进行了修改,所以需要 commit() 提交给数据库,以及 close() 关闭资源

将 id 为 128的 brand 改为小米su7, guide_price 改为 21.00 , 时间改为 2024-03-28

import com.rainbowsea.mybatis.mapper.carmapper;
import com.rainbowsea.mybatis.pojo.car;
import org.apache.ibatis.io.resources;
import org.apache.ibatis.session.sqlsession;
import org.apache.ibatis.session.sqlsessionfactory;
import org.apache.ibatis.session.sqlsessionfactorybuilder;
import org.junit.test;

import java.io.ioexception;

public class carmappertest {

    @test
    public void testupdate() throws ioexception {
        // 获取到 sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 获取到sqlsessionfactory 对象
        // sqlsessionfactory对象,一个sqlsessionfactory对应一个 environment, 一个environment通常是一个数据库
        sqlsessionfactory sessionfactory = sqlsessionfactorybuilder.build(resources.getresourceasstream("mybatis-config.xml"), "mybatis");
        // 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        car car = new car(128l, "999", "小米su7", 21.0, "2022-03-28", "新能源");
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
        carmapper mapper = sqlsession.getmapper(carmapper.class);
        int count = mapper.update(car);
        sqlsession.commit(); // 提交给数据库
        sqlsession.close();



    }
}

5.select 查询一条记录操作

根据 id 查询一条记录。

查询 id 为 130 的一条记录。

对应 carmapper 接口中的 selectbyid ( long id) 抽象方法。

package com.rainbowsea.mybatis.mapper;

import com.rainbowsea.mybatis.pojo.car;

import java.util.list;

public interface carmapper {



    /**
     * 根据id查询汽车信息
     * @param id
     * @return
     */
    car selectbyid(long id);

}

对应 carmapper.xml sql语句映射文件,上编写 select 查询 的 sql语句。

使用以上代码的前提是:xxxmapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。

需要注意的是:查询是会返回结果集的,所以我们需要在 <select> 查询标签当中,通过 resulttype 属性指定返回的类型(如果没有用别名机制的话,要用全限定类名(带包名的)) 。

同时由于我们的数据表的字段的命名方式是下划线 ,部分数据表的字段名与我们设置的 orm 映射的pojo类的属性名不一致,需要将他们二者的名字保持一致,所以我们需要使用 as 定义别名,不然无法将对应数据表中的值,赋值到 对应的 pojo的类当中(这里是 car 类当中)

<?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">

<!--namespace 一定要是:对应的接口的全限定类名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.carmapper">


    <!--	id 要是 namespace 对应接口上的方法名: -->
    <select id="selectbyid" resulttype="com.rainbowsea.mybatis.pojo.car">
        select id,
               car_num      as carnum,
               brand,
               guide_price  as guideprice,
               produce_time as producetime,
               car_type     as cartype
        from t_car
        where id = #{id}
    </select>



</mapper>

java当中编程运行程序:

注意:因为我们仅仅是查询数据表中的信息,不涉及到对数据表的修改,删除操作,所以无需提交数据库commit,只要 close() 关闭资源就可以了

查询 id 为 130 的一条记录。

import com.rainbowsea.mybatis.mapper.carmapper;
import com.rainbowsea.mybatis.pojo.car;
import org.apache.ibatis.io.resources;
import org.apache.ibatis.session.sqlsession;
import org.apache.ibatis.session.sqlsessionfactory;
import org.apache.ibatis.session.sqlsessionfactorybuilder;
import org.junit.test;

import java.io.ioexception;

public class carmappertest {

    @test
    public void testselectbyid() throws ioexception {
        // 获取到 sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 获取到sqlsessionfactory 对象
        // sqlsessionfactory对象,一个sqlsessionfactory对应一个 environment, 一个environment通常是一个数据库
        sqlsessionfactory sessionfactory = sqlsessionfactorybuilder.build(resources.getresourceasstream("mybatis-config.xml"), "mybatis");
        // 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
        carmapper mapper = sqlsession.getmapper(carmapper.class);
        car car = mapper.selectbyid(130l);
        system.out.println(car);
        sqlsession.close();
    }
}

6.select 查询多条记录操作

查询t_car 数据表中的所有信息。

对应 carmapper 接口中的 selectall( long id) 抽象方法。返回的是一个list 集合

package com.rainbowsea.mybatis.mapper;
import com.rainbowsea.mybatis.pojo.car;
import java.util.list;
public interface carmapper {

    /**
     * 获取所有的汽车信息
     * @return
     */
    list<car> selectall();
}

对应 carmapper.xml sql语句映射文件,上编写 select 查询 的 sql语句。

使用以上代码的前提是:xxxmapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。

需要注意的是:查询是会返回结果集的,所以我们需要在 <select> 查询标签当中,通过 resulttype 属性指定返回的类型(如果没有用别名机制的话,要用全限定类名(带包名的)) 。

同时由于我们的数据表的字段的命名方式是下划线 ,部分数据表的字段名与我们设置的 orm 映射的pojo类的属性名不一致,需要将他们二者的名字保持一致,所以我们需要使用 as 定义别名,不然无法将对应数据表中的值,赋值到 对应的 pojo的类当中(这里是 car 类当中)

<?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">

<!--namespace 一定要是:对应的接口的全限定类名-->
<mapper namespace="com.rainbowsea.mybatis.mapper.carmapper">


    <!--	id 要是 namespace 对应接口上的方法名: -->
    <select id="selectall" resulttype="com.rainbowsea.mybatis.pojo.car">
        select id,
               car_num      as carnum,
               brand,
               guide_price  as guideprice,
               produce_time as producetime,
               car_type     as cartype
        from t_car
    </select>

</mapper>

java当中编程运行程序:

注意:因为我们仅仅是查询数据表中的信息,不涉及到对数据表的修改,删除操作,所以无需提交数据库commit,只要 close() 关闭资源就可以了

查询 t_car 数据表中的所有记录。

import com.rainbowsea.mybatis.mapper.carmapper;
import com.rainbowsea.mybatis.pojo.car;
import org.apache.ibatis.io.resources;
import org.apache.ibatis.session.sqlsession;
import org.apache.ibatis.session.sqlsessionfactory;
import org.apache.ibatis.session.sqlsessionfactorybuilder;
import org.junit.test;

import java.io.ioexception;
import java.util.list;

public class carmappertest {
    @test
    public void testselectall() throws ioexception {
        // 获取到 sqlsessionfactorybuilder
        sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder();
        // 获取到sqlsessionfactory 对象
        // sqlsessionfactory对象,一个sqlsessionfactory对应一个 environment, 一个environment通常是一个数据库
        sqlsessionfactory sessionfactory = sqlsessionfactorybuilder.build(resources.getresourceasstream("mybatis-config.xml"), "mybatis");
        // 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
        carmapper mapper = sqlsession.getmapper(carmapper.class);
        list<car> cars = mapper.selectall();
        cars.foreach(car -> {
            system.out.println(car);
        });

        sqlsession.close();
    }
}

总结

		// 获取到 salsession 会话,一次会话一个
        sqlsession sqlsession = sessionfactory.opensession();
        car car = new car(null, "999", "奥迪", 3.0, "2000-10-10", "新能源");
        // 面向接口编程,获取接口的代理对象,也就是接口的实现类,实现类该接口中的方法
		// 需要注意的是参数的 xxxmapper.class 和 返回值是保持一致的。
        xxxmapper mapper = sqlsession.getmapper(xxxmapper.class);
		mapper.xxx(); // 执行的是该xxxmapper接口中的方法

使用以上代码的前提是:xxxmapper.xml 文件中的 namespace 必须和 dao(mapper)接口的全限定名称一致,id 必须和 dao(mapper) 接口中方法名一致。

注意:因为是对数据库进行了修改,删除,改动了,所以需要 commit() 提交给数据库,以及 close() 关闭资源

需要注意的是:查询是会返回结果集的,所以我们需要在 <select> 查询标签当中,通过 resulttype 属性指定返回的类型(如果没有用别名机制的话,要用全限定类名(带包名的))

同时由于我们的数据表的字段的命名方式是下划线 ,部分数据表的字段名与我们设置的 orm 映射的pojo类的属性名不一致,需要将他们二者的名字保持一致,所以我们需要使用 as 定义别名,不然无法将对应数据表中的值,赋值到 对应的 pojo的类当中(这里是 car 类当中)

注意:因为我们仅仅是查询数据表中的信息,不涉及到对数据表的修改,删除操作,所以无需提交数据库commit,只要 close() 关闭资源就可以了。

如果只有一个参数需要传的话,#{} 括号中的值,可以随便写(#{}括号的值不能空着,不然不编译无法通过),但最好见名知意。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com