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

1. MyBatis中的接口代理机制及其使用

文章目录

  • 1. MyBatis中的接口代理机制及其使用
  • 2. 实操
    • 2.1 准备工作
    • 2.2 insert 增加操作
    • 2.3 delete 删除操作
    • 2.4 update 修改操作
    • 2.5 select 查询一条记录操作
    • 2.6 select 查询多条记录操作
  • 3. 总结:
  • 4. 最后:


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

核心代码:

 		// 获取到 SqlSessionFactoryBuilderSqlSessionFactoryBuilder 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 的属性名。同时 #{} 括号中一定要有值(就算只有一个参数,也要有值(随便写都要有值),才行,不然编译无法通过)

在这里插入图片描述

2. 实操

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

2.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 configurationPUBLIC "-//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;}@Overridepublic 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.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 mapperPUBLIC "-//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 {@Testpublic void testInsert() throws IOException {// 获取到 SqlSessionFactoryBuilderSqlSessionFactoryBuilder 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();}
}

在这里插入图片描述

2.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 mapperPUBLIC "-//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 {@Testpublic void testDeleteById() throws IOException {// 获取到 SqlSessionFactoryBuilderSqlSessionFactoryBuilder 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);}
}

在这里插入图片描述

2.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 mapperPUBLIC "-//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_carset 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 {@Testpublic void testUpdate() throws IOException {// 获取到 SqlSessionFactoryBuilderSqlSessionFactoryBuilder 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();}
}

2.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 mapperPUBLIC "-//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 carTypefrom t_carwhere 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 {@Testpublic void testSelectById() throws IOException {// 获取到 SqlSessionFactoryBuilderSqlSessionFactoryBuilder 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();}
}

2.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 mapperPUBLIC "-//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 carTypefrom 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 {@Testpublic void testSelectAll() throws IOException {// 获取到 SqlSessionFactoryBuilderSqlSessionFactoryBuilder 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();}
}

3. 总结:

		// 获取到 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) 接口中方法名一致。

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

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

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

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

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

4. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HackTheBox-Machines--Nineveh

Nineveh测试过程 1 信息收集 NMAP 端口扫描 80 端口 80端口是服务器的默认页面&#xff0c;无可利用功能点&#xff0c;源代码没有可利用的敏感信息 目录扫描 1.http://10.129.25.123/department 访问/department目录跳转到登录页面&#xff0c;尝试暴力破解&#xff0c;获取…

嵌入式期末复习

一、选择题&#xff08;20&#xff09; 二、判断题&#xff08;10&#xff09; 三、填空题&#xff08;10&#xff09; 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。常用的远程调试技术主要有 插桩/st…

NVIDIA NeMo - 训练本地化多语种 LLM

本文转载自&#xff1a;使用 NVIDIA NeMo 训练本地化多语种 LLM &#xff08;2024年 5月 17日 By Nicole Luo and Amit Bleiweiss 第 1 部分 https://developer.nvidia.com/zh-cn/blog/training-localized-multilingual-llms-with-nvidia-nemo-part-1/ 第 2 部分 https://deve…

Cocos入门2:软件安装

Cocos Creator的安装教程如下&#xff0c;按照步骤进行&#xff0c;可以帮助您顺利安装Cocos Creator&#xff1a; 一、下载Cocos Dashboard 访问Cocos官网&#xff1a;前往Cocos Creator的官方网站&#xff08;https://www.cocos.com/creator/&#xff09;。 下载Cocos Dash…

重生之 SpringBoot3 入门保姆级学习(14、内容协商基础简介)

重生之 SpringBoot3 入门保姆级学习&#xff08;14、内容协商基础简介&#xff09; 3.3 内容协商3.3.1 基础简介3.3.2 演示效果 3.3 内容协商 3.3.1 基础简介 默认规则 基于请求头的内容协商&#xff08;默认开启&#xff09; 客户端向服务器发送请求&#xff0c;携带 HTTP 标…

20240601使用iperf3在Toybrick的TB-RK3588开发板上跑预编译的Android12测网速

20240601使用iperf3在Toybrick的TB-RK3588开发板上跑预编译的Android12测网速 2024/6/1 20:39 【常见问题】给TB-RK3588开发板刷机Androidd12之后&#xff0c;如果刷机线type-C不拔掉。可能起不来&#xff01; 搞得我都以为板子坏了呢&#xff01; rootrootrootroot-ThinkBook-…

Linux[高级管理]——使用源码包编译安装Apache网站

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月31日14点20分 &#x1f004;️文章质量&#xff1a;96分 在Linux系统上编译和安装Apache HTTP Server是…

搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL(四)

上一篇&#xff1a;搭建基于Django的博客系统增加广告轮播图&#xff08;三&#xff09; 下一篇&#xff1a;基于Django的博客系统之用HayStack连接elasticsearch增加搜索功能&#xff08;五&#xff09; Sqlite3数据库迁移到MySQL 数据库 迁移原因 Django 的内置数据库 SQL…

动态规划求多段图的最短路径

一、基本思想 动态规划法将待求解问题分解成若干个相互重叠的子问题&#xff0c;每个子问题相互关联&#xff1b;动态规划法与分治法的区别就在于分治法的子问题相互不关联&#xff0c;而动态规划法的子问题是相互关联的&#xff0c;且有重叠的部分。 二、算法分析 动态规划…

性能优化相关:nginx负载均衡中的动静分离

结合上次博客&#xff1a;正向代理和反向代理 什么是动静分离&#xff1a; 静态资源&#xff1a;包含css文件、图片、js文件、配置文件等 动态资源&#xff1a;脚本处理等 更改/usr/local/nginx/conf下的nginx.conf文件&#xff0c;设置动静目录&#xff0c;添加如下 locatio…

Ubuntu——配置安装服务

目录 一、安装JDK 二、安装IntelliJ IDEA 三、安装Docker-ce 1.环境清理以免有遗留组件 2.安装Docker 3.测试 #检查版本 sudo cat /etc/issue 一、安装JDK Ubuntu提供了一个名为apt的软件包管理工具&#xff0c;通过它可以使用命令行的方式安装、更新和删除软件包。 使用…

Day03 左侧菜单数据绑定

一.左侧菜单数据绑定 1.首先&#xff0c;进行项目结构塔建。按照Prism 框架约定&#xff0c;要使用自动查找绑定功能。即View &#xff08;视图&#xff09;中自动查找并绑定到对应的ViewModel&#xff08;视图模型&#xff0c;处理视图业务逻辑&#xff09;。就需要在项目中按…

大数据在金融行业的深度应用与未来展望

一、引言 随着信息技术的迅猛发展,大数据已经成为推动金融行业创新的重要力量。从精准营销、个性化服务到风险管理和产品创新,大数据的应用正在不断重塑金融行业的格局。本文将深入探讨大数据在金融行业的深度应用,分析其特征特点、解决方案以及面临的挑战与机遇,并展望其…

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下&#xff0c;一个上午都在床上趴着看完了《百年孤独》&#xff0c;撑伞去吃了个饭&#xff0c;又回到了宿舍。打开许久未开的老电脑&#xff0c;准备做题了。《百年孤独》讲了什么&#xff0c;想表达什么&#xff0c;想给读者留下什么&#xff0c;我不知道&am…

无法拒绝!GPT-4o 完美适配安卓手机,畅享丝滑体验

无法拒绝&#xff01;GPT-4o 完美适配安卓手机&#xff0c;畅享丝滑体验 前言 人工智能的飞速发展&#xff0c;给我们的生活带来了前所未有的便利。作为AI技术的代表之一&#xff0c;GPT凭借其强大的自然语言处理能力&#xff0c;已经成为许多用户日常生活和工作中的得力助手…

超大功率光伏并网逆变器学习(三相) 一

1.超大功率用的IGBT开关频率通常很低,比如6KHz 2.线电压和相电压的关系 相电压 A AB线电压-CA线电压 相电压 B BC线电压-AB线电压 相电压 C CA线电压-BC线电压 3.坐标变换 ABC三相信号通过Clark坐标变换得到αβ两相静止信号,其中α与A相重合,β与α…

基于数据驱动的自适应性小波构造(MATLAB)

以地震领域为例&#xff0c;时频变换能够刻画地震资料的时频特征&#xff0c;进而辅助地质构造解释。在各种时频分析工具中&#xff0c;连续小波变换CWT是描述地震资料时频特征的常用工具。选择合适的基小波是CWT的关键问题。对于不同类型的信号前人有针对性的设计了许多基小波…

TCP/IP(网络编程)

一、网络每一层的作用 &#xff0a;网络接口层和物理层的作用&#xff1a;屏蔽硬件的差异&#xff0c;通过底层的驱动&#xff0c;会提供统一的接口&#xff0c;供网络层使用 &#xff0a;网络层的作用&#xff1a;实现端到端的传输 &#xff0a;传输层:数据应该交给哪一个任…

移植2D物理引擎到LVGL

背景 在LVGL交流群&#xff0c;有网友提出想要移植物理引擎到LVGL&#xff0c;遂有了本文。阅读本文需要对IDF和LVGL有所了解 过程 2D物理引擎有很多&#xff0c;经过一番调研选择了Chipmunk2D 下载源码 此处省略一万字&#xff0c;Github访问可能会有些慢 添加文件 将…

前端3剑客(第1篇)-初识HTML

100编程书屋_孔夫子旧书网 当今主流的技术中&#xff0c;可以分为前端和后端两个门类。 前端&#xff1a;简单的理解就是和用户打交道 后端&#xff1a;主要用于组织数据 而前端就Web开发方向来说&#xff0c; 分为三门语言&#xff0c; HTML、CSS、JavaScript 语言作用HT…