mybatis的mapper代理模式

2022-08-23 14:39:12

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

<configuration><!-- 使用mybatis需要的数据源和事务配置,后续如果整合spring之后,将不再需要--><environmentsdefault="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 */publicclassProduct{privateint p_id;private String name;privateint p_number;privatedouble price;private String add_time;publicProduct(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;}publicProduct(){super();}publicintgetP_id(){return p_id;}publicvoidsetP_id(int p_id){this.p_id= p_id;}public StringgetName(){return name;}publicvoidsetName(String name){this.name= name;}publicintgetP_number(){return p_number;}publicvoidsetP_number(int p_number){this.p_number= p_number;}publicdoublegetPrice(){return price;}publicvoidsetPrice(double price){this.price= price;}public StringgetAdd_time(){return add_time;}publicvoidsetAdd_time(String add_time){this.add_time= add_time;}@Overridepublic StringtoString(){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 */*publicclassMybatisDemo1{*publicstaticvoidmain(String[] args)throws IOException{*newMybatisDemo1().queryById();}*publicvoidqueryById()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>publicvoidqueryByName()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 INTOt_product(name,p_number,price)value(#{name},#{p_number},#{price});</insert>
/**
**<p>Title: insert</p> 
*<p>Description: 新增数据</p> 
* @throws Exception 
* */publicvoidinsert()throws Exception{ String path="SqlMapConfig.xml";*//获取流对象* InputStream config= Resources.getResourceAsStream(path);//获取会话工厂*  SqlSessionFactory factory=newSqlSessionFactoryBuilder().build(config);*//开启会话* SqlSession sqlSession= factory.openSession();*  Product prod=newProduct();*  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对象声明

  • 作者:小刘-鱼皮
  • 原文链接:https://blog.csdn.net/weixin_55604133/article/details/117391495
    更新时间:2022-08-23 14:39:12