mybatis实现mapper代理模式的方式

今晚继续复习mybtis
以根据id值查询单条数据为例
编写SqlMapConfig.xml文件

<configuration>
<!-- 使用mybatis需要的数据源和事务配置,后续如果整合spring之后,将不再需要 -->
<environments default="development">
<!-- 配置数据源和事务 -->
<environment id="development">
<!-- 配置事务管理,将事务管理交给mybatis管理 --> <transactionManager type="JDBC" />
<!-- 配置数据源 -->
<dataSource type="POOLED">
 <property name = "driver" value = "com.mysql.jdbc.Driver" />
 <property name="url" value="jdbc:mysql://localhost:3306/db_shop? useUnicode=true&amp;characterEncoding=utf-8"/>
  <property name="username" value="root"/> <property name="password" value=""/>
   </dataSource>
    </environment>
    </environments>
     <!-- 加载**.xml配置文件 -->
     <mappers>
     <mapper resource="product.xml"/>
</mappers>
</configuration>

编写失血模型对象:Product,最好字段名和数据库里面的字段名一直

/**** <p>Title: Product</p> *
<p>Description: 商品类失血模型</p> *
 @author Alon *
  @date 2020年9月27日 下午6:51:57
  * @version 1.0 */
 public class Product {
  private int p_id;
   private String name;
   private int p_number;
    private double price;
    private String add_time;
     public Product(int p_id, String name, int p_number, double price, String add_time) {
     super();
      this.p_id = p_id;
      this.name = name;
      this.p_number = p_number;
      this.price = price;
      this.add_time = add_time;
      }public Product() {
        super();
       }
       public int getP_id() {
       return p_id; }
       public void setP_id(int p_id) {
       this.p_id = p_id; }public String getName() { return name; }
       public void setName(String name) { this.name = name; }
       public int getP_number() {
       return p_number; }
       public void setP_number(int p_number) { this.p_number = p_number; }
       public double getPrice() { return price; }
       public void setPrice(double price) { this.price = price; }
       public String getAdd_time() { return add_time;
}
public void setAdd_time(String add_time) { this.add_time = add_time; }
@Override
public String toString() {
return "Product [p_id=" + p_id + ", name=" + name + ", p_number=" + p_number + ", price=" + price + ", add_time=" + add_time + "]"; } }

编写单个映射关系的sql.xml:product.xml

<?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">
 <!-- 映射的sql文件 namespace:命名空间,可以理解成将部分的sql语句进行隔离。到后面的mapper代理方式将有更 加重要的作用 --> <mapper namespace="test">
 <!--select:表示要执行的查询语句 id:给这个查询语句取一个名字,唯一的,java中要调用的使用。
  parameterType:输入参数的数据类型
  resultType:输出参数的数据类型,一般绑定成model的对象 #{value}:表示用来和占位符一样,用来接受输入的参数值。 --> <select id="findById" parameterType="java.lang.Integer" resultType="com.woniuxy.model.Product">
   SELECT * FROM t_product WHERE p_id = #{value}
    </select>
     </mapper>

编写java代码进行测试执行sql语句并得到结果

/**** <p>Title: MybatisDemo1</p> *
 <p>Description: 查询数据的demo</p> *
  @author Alon
  * @date 2020年9月27日 下午7:05:32
  * * @version 1.0 */
  * public class MybatisDemo1 {
  *  public static void main(String[] args) throws IOException {
  * new MybatisDemo1().queryById(); }
  * public void queryById() throws IOException {
  *  //1、读取到SqlMapConfig.xml文件的流 String path = "SqlMapConfig.xml";
  * InputStream config = Resources.getResourceAsStream(path);
//创建会话工厂,同时将SqlMapConfig.xml里面的数据放到工厂中 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
//开启会话 SqlSession sqlSession = factory.openSession(); /** 第一个参数:要执行哪个sql语句的参数,一般命名空间.id值 * 第二个参数:传入填充#{value}的传入参数值。 */
Object obj = sqlSession.selectOne("test.findById", 1); System.out.println(obj); } }

进行模糊查询:查询出多条结果集

<!-- 在原有的xml文件中进行配置即可,不需要新建,之前的也已经在SqlMapConfig.xml文件中进行了配 置 --> <select id="queryByName" parameterType="java.lang.String" resultType="com.woniuxy.model.Product"> SELECT * FROM t_product WHERE name like "%${value}%" </select> public void queryByName() throws Exception
{
 String path = "SqlMapConfig.xml"; //获取流对象 InputStream config = Resources.getResourceAsStream(path); //获取会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config); //开启会话 SqlSession sqlSession = factory.openSession(); /** 因为执行结果有多条语句,那么必须使用selectList */ List<Object> list = sqlSession.selectList("test.queryByName", "旺仔"); //迭代 System.out.println(list);
}

新增语句

<!-- 新增一条数据 parameterType:传入参数的数据类型,用失血模型对象即可。 -->
<insert id="insertProduct" parameterType="com.woniuxy.model.Product">
INSERT INTO t_product(name,p_number,price) value(#{name},#{p_number},# {price});
</insert>
/**
**<p>Title: insert</p>
*<p>Description: 新增数据</p>
* @throws Exception
* */ public void insert() throws Exception{ String path = "SqlMapConfig.xml";
* //获取流对象
* InputStream config = Resources.getResourceAsStream(path); //获取会话工厂
*  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
* //开启会话
* SqlSession sqlSession = factory.openSession();
*  Product prod = new Product();
*  prod.setName("雪碧");
* prod.setP_number(10);
* prod.setPrice(3.0);
*  int row = sqlSession.insert("test.insertProduct", prod); System.out.println(row); sqlSession.commit(); sqlSession.close(); }

mapper代理的方式进行讲解增、删、改、查(重点)
步骤1:创建对应的Mapper接口,和之前的dao接口一致
步骤2:编写对应的xxmapper.xml配置文件。有要求
1)mapper标签里面的namespace:必须写成对应的Mapper接口的全路径名
2)sql语句里面的id:必须和接口中对应方法的名称一致。
3)sql语句里面的parameterType:必须要和接口中方法的形式参数数据类型一致
4)sql语句里面的resultType:必须和接口中方法的返回值数据类型一致
步骤3:将编写好的**mapper.xml文件在SqlMapConfig.xml文件中加载
步骤4:编写实现类,并在这里直接测试
别名和mapper映射详解
设置别名
在mybatis配置文件中,别名是一直存在的,实际上在框架中已经存在一些默认的别名。比如
java.lang.String对应的别名:String,java.lang.Integer对应的别名:int
在开发中,一般mapper.xml配置文件中的parameterType和resultType往往对应的名称需要写上
model的全路径,而且还是多次被重复使用,可以选择给该路径取一个别名。用别名来替换比较复杂的
全路径名
以扫描包的形式进行配置
自定义的POJO类(重点)
自定义POJO类,一般指的是高级查询,在想要的数据和传入的条件不再一张表中,通过表所创建的失血
模型model已经不能够满足传入参数的需求了,这个时候,就需要使用自定义的POJO类
因为一个失血模型已经不能够满足查询输入参数的要求了,所以进行扩展,创建一个UserCustom类,里
面包含user对象声明和userInfo对象声明

以上就是mybatis实现mapper代理模式的方式的详细内容,更多关于mybatis mapper代理模式的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解

    一.添加所需依赖,当前完整的pom文件如下: <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&q

  • MyBatis直接执行SQL的工具SqlMapper

    可能有些人也有过类似需求,一般都会选择使用其他的方式如Spring-JDBC等方式解决. 能否通过MyBatis实现这样的功能呢? 为了让通用Mapper更彻底的支持多表操作以及更灵活的操作,在2.2.0版本增加了一个可以直接执行SQL的新类SqlMapper. 我们来了解一下SqlMapper. SqlMapper提供的方法 SqlMapper提供了以下这些公共方法: Map<String,Object> selectOne(String sql) Map<String,Object&

  • Mybatis MapperScannerConfigurer自动扫描Mapper接口生成代理注入到Spring的方法

    前言 Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置 MapperFactoryBean来生成Mapper接口的代理. 例如: <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mappe

  • 详解Mybatis通用Mapper介绍与使用

    使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改.这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障.这时,通用Mapper便应运而生-- 什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删

  • 解决SpringBoot整合Mybatis扫描不到Mapper的问题

    闲来无事,想学学springboot,开始搭建一个项目,但是一直显示mapper扫描不到的错误: "Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsa

  • Mybatis-Plus BaseMapper的用法详解

    1.如何使用BaseMapper进行数据库的操作. 2.使用BaseMapper进行插入实体时如何让UUID的主键自动生成. Student实体类,其中id属性主键为UUID package com.huixiaoer.ant.api.model.bean; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; public class Stud

  • mybatis-plus  mapper中foreach循环操作代码详解(新增或修改)

    .循环添加 接口处: 分别是 void 无返回类型 :有的话是(resultType)返回类型,参数类型(parameterType) list , 如: 在mapper文件中分别对应ID,参数类型和返回类型. 循环处理,如下: <insert id="insertPack" parameterType="java.util.List"> insert into t_ev_bu_pack ( PACK_CODE, BIN, PACK_PROD_TIME,

  • mybatis实现mapper代理模式的方式

    今晚继续复习mybtis 以根据id值查询单条数据为例 编写SqlMapConfig.xml文件 <configuration> <!-- 使用mybatis需要的数据源和事务配置,后续如果整合spring之后,将不再需要 --> <environments default="development"> <!-- 配置数据源和事务 --> <environment id="development"> <

  • java应用开发之Mybatis通过Mapper代理自定义接口的实现

    如何实现?主要分为以下两步骤 1.通过 Mapper 代理实现⾃定义接口 2.编写与方法相对应的 Mapper.xml 1.自定义接口AccountRepository package repository; import entity.Account; import java.util.List; public interface AccountRepository { public int save(Account account); public int update(Account ac

  • Mybatis通过Mapper代理连接数据库的方法

    1.在数据库中创建表和相应字段,如下图我创建了三个字段分别为fromname,message,toname,类型为varchar 2.创建对应的pojo实体类,注意类型要和数据库创建类型一致,如varchar()对应的是java.lang.String 3.在resource路径下配置config.xml,配置Mybatis的运行环境3306/后面加上自己的数据库schema名字,数据库username和password输入自己的账号和密码,而在下方mapper则是用于注册我们待会要写的xml文

  • Spring AOP的底层实现方式-代理模式

    目录 1.1 静态代理 1.2 动态代理 1.2.1 JDK动态代理(必须有接口) 1.2.2 CGlib动态代理 在学习Spring的过程中,留下一下痕迹. 代理模式,其实就是让别人做同样的事情,但是别人却不仅将我的事情做了,还会把他的事情也做了,换言之,这个人做的事情,是他独有的事情和我需要做的事情的综合.回到代码,那么就是,代理类执行与委托类同样的方法,在这方法里代理类不仅可以执行委托类的方法的内容,还可以添加自己的另外的内容,在使用代理类的时候,会比直接使用委托类具有更多的能力,所以我们

  • MyBatis源码剖析之Mapper代理方式详解

    目录 源码剖析-getmapper() 源码剖析-invoke() 具体代码如下: //前三步都相同 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSess

  • Mybatis实现Mapper动态代理方式详解

    一.实现原理 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法. Mapper接口开发需要遵循以下规范: 1.Mapper.xml文件中的namespace与mapper接口的类路径相同. 2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同 3.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的para

  • 详解MyBatis Mapper 代理实现数据库调用原理

    1. Mapper 代理层执行 Mapper 代理上执行方法调用时,调用被委派给 MapperProxy 来处理. public class MapperProxy<T> implements InvocationHandler, Serializable { private final SqlSession sqlSession; private final Class<T> mapperInterface; private final Map<Method, Mapper

  • Mybatis 中Mapper使用package方式配置报错的解决方案

    踩了个坑,写出来 Mybatis 中Mapper使用package方式配置报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) UserDaoTest中调用了UserDao的insert方法. 1.项目结构如下 2.UserDao接口 package com.mybatis.dao; import org.apache.ibatis.annotations.Mapper; import

  • MyBatis Mapper代理使用方法详解

    MyBatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 下文重点给大家介绍mapper代理使用方法. 一.开发人员需要完成的任务: mapper.xml映射文件和mapper.java 二.开发规范

  • java设计模式—静态代理模式(聚合与继承方式对比)

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实现了movable接口,则可实现灵活多变,具体看代码 (2)继承:继承不够灵活,随着功能需求增多,继承体系会非常臃肿.具体看代码 二.代码 1.Movable.java 2.Tank.java 3.TankTimeProxy.java 4.TankLogProxy.java 5.Tank2Time.

随机推荐