一、增加

1. 设置插入数据后自动返回主键

主键返回策略只适用于单个对象的插入;

主键返回策略:

  (1) 单独参数

    直接用set方法

  (2)  map

    对象名.id

  (3) 多参数列表

  对象名.id(eg:keyProperty="attr.id")

eg1: 单独参数

package com.atguigu.mapper;

import java.util.List;
import java.util.Map; import com.atguigu.bean.T_MALL_PRODUCT; public interface SpuMapper { void insert_spu(T_MALL_PRODUCT spu); void insert_images(Map<Object, Object> map); List<T_MALL_PRODUCT> select_spu_list(Map<Object, Object> map); }
<!-- useGeneratedKeys:主键返回策略,默认为false,如果设置为true,则MyBatis插入后的主键返回回去
keyColumn:数据库生成的主键字段名 keyProperty:实体属性名(指所插入的对象的属性名)-->
<insert useGeneratedKeys="true" keyColumn="id" keyProperty="id"
id="insert_spu" parameterType="com.atguigu.bean.T_MALL_PRODUCT">
insert into t_mall_product
(
shp_mch,
shp_tp,
flbh1,
flbh2,
pp_id,
shp_msh
)
values
(
#{shp_mch},
#{shp_tp},
#{flbh1},
#{flbh2},
#{pp_id},
#{shp_msh}
)
</insert>

eg2: 多参数对象时,需要指定keyProperty="attr.id",这样MyBatis才知道应该将返回的主键封装给哪个对象

package com.atguigu.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.atguigu.bean.OBJECT_T_MALL_ATTR;
//import com.atguigu.bean.OBJECT_T_MALL_ATTR;
import com.atguigu.bean.T_MALL_VALUE; public interface AttrMapper {
/**
* 保存商品属性
* @param flbh2
* @param attr:主键返回策略只适用于单个对象的插入,所以这里需要封装成OBJECT_T_MALL_ATTR对象
* 这里的insert_attr有两个参数,需要用 @Param,这样主键生成策略中(通过指定keyProperty="attr.id")
* 才知道应该将主键封装给哪个参数
*/
void insert_attr(@Param("flbh2") int flbh2, @Param("attr") OBJECT_T_MALL_ATTR attr);
/**
* 插入属性值
* @param attr_id
* @param list_value
*/
void insert_values(@Param("attr_id") int attr_id, @Param("list_value") List<T_MALL_VALUE> list_value); List<OBJECT_T_MALL_ATTR> select_attr_list(int flbh2); }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.atguigu.mapper.AttrMapper">
<select id="select_attr_list" parameterType="int"
resultMap="select_attr_list_map">
select attr.id as attr_id ,attr.*,val.id as val_id ,val.*
from t_mall_attr attr ,
t_mall_value val where
attr.id = val.shxm_id
and
attr.flbh2 = #{flbh2}
</select> <!-- autoMapping:属性自动映射 -->
<resultMap type="com.atguigu.bean.OBJECT_T_MALL_ATTR" id="select_attr_list_map"
autoMapping="true">
<result column="attr_id" property="id" />
<collection property="list_value" ofType="com.atguigu.bean.T_MALL_VALUE"
autoMapping="true">
<!-- 指定主键映射,其他属性自动映射 -->
<result column="val_id" property="id" />
</collection>
<!-- 如果里面还有对象类型的数据 -->
<!-- <association property=""></association> -->
<!-- 如果还有集合类型的数据 -->
<!-- <collection property=""></collection> -->
</resultMap> <insert id="insert_attr" useGeneratedKeys="true" keyColumn="id"
keyProperty="attr.id">
insert into t_mall_attr(
shxm_mch,
flbh2
)
values
(
#{attr.shxm_mch},
#{flbh2}
)
</insert> <insert id="insert_values">
insert into t_mall_value(
shxzh,
shxm_id,
shxzh_mch
)
values
<foreach collection="list_value" item="val" separator=",">
(
#{val.shxzh},
#{attr_id},
#{val.shxzh_mch}
)
</foreach>
</insert> </mapper>

2. 批量插入

我传入的参数为map,参数封装:

// 根据spu的主键,批量插入spu图片
Map<Object, Object> map = new HashMap<Object, Object>();
map.put("shp_id", spu.getId());
map.put("list_image", list_image);
spuMapper.insert_images(map);

sql:

    <!-- 插入商品图片 -->
<insert id="insert_images" parameterType="Map">
insert into t_mall_product_image(shp_id,url) values <foreach collection="list_image" item="image" separator=",">
(#{shp_id},#{image})
</foreach>
</insert>

3.多重对象的同步表单参数提交

A页面表达式ognl(object gram navigation language)

List_attr[0].list_value[0].shxzh  对象.属性.对象的方式去找到对应的属性

B mvc如何封装?

jsp的表单页面:页面上的级联属性名或者对象名必须在java中要有set方法方法,表单提交时才能自动封装上表单的数据。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page isELIgnored="false" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath %>">
<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
function b(){}
</script>
<title>硅谷商城</title>
</head>
<body>
添加商品属性
<hr>
<form action="attr_add.do">
<input type="text" value="${flbh2}" name="flbh2"/>
<table border="1" width="800px">
<tr><td>属性名:<input type="text" name="list_attr[0].shxm_mch"/></td><td></td><td>添加属性值</td></tr>
<tr><td>属性值:<input type="text" name="list_attr[0].list_value[0].shxzh"/></td><td>单位:<input type="text" name="list_attr[0].list_value[0].shxzh_mch"/></td><td>删除</td></tr>
<tr><td>属性值:<input type="text" name="list_attr[0].list_value[1].shxzh"/></td><td>单位:<input type="text" name="list_attr[0].list_value[1].shxzh_mch"/></td><td>删除</td></tr>
</table> <table border="1" width="800px">
<tr><td>属性名:<input type="text" name="list_attr[1].shxm_mch"/></td><td></td><td>添加属性值</td></tr>
<tr><td>属性值:<input type="text" name="list_attr[1].list_value[0].shxzh"/></td><td>单位:<input type="text" name="list_attr[1].list_value[0].shxzh_mch"/></td><td>删除</td></tr>
<tr><td>属性值:<input type="text" name="list_attr[1].list_value[1].shxzh"/></td><td>单位:<input type="text" name="list_attr[1].list_value[1].shxzh_mch"/></td><td>删除</td></tr>
</table>
添加:<input type="submit" value="提交"/>
</form>
</body>
</html>

Controller接收方法:

/**
* 商品属性提交 (双重集合提交)
* 页面表达式ognl(object gram navigation language)
* List_attr[0].list_value[0].shxzh
* @param flbh2
* @param list_attr
* @return
*/
@RequestMapping("attr_add")
public ModelAndView attr_add(int flbh2, MODEL_T_MALL_ATTR list_attr) { // 保存属性
attrServiceInf.save_attr(flbh2, list_attr.getList_attr()); ModelAndView mv = new ModelAndView("redirect:/index.do");
// mv.addObject("flbh2", flbh2);
mv.addObject("url","goto_attr_add.do?flbh2="+flbh2);
mv.addObject("title","添加属性");
return mv;
}

service中的方法:

    /**
* 保存商品属性
*/
@Override
public void save_attr(int flbh2, List<OBJECT_T_MALL_ATTR> list_attr) {
for (int i = 0; i < list_attr.size(); i++) {
// 插入属性,返回主键
OBJECT_T_MALL_ATTR attr = list_attr.get(i);
attrMapper.insert_attr(flbh2, attr); // 获得返回主键批量插入属性值
attrMapper.insert_values(attr.getId(), attr.getList_value());
}
}

实体:

属性值实体:

package com.atguigu.bean;

import java.util.Date;

public class T_MALL_VALUE {

    private int id;
private String shxzh;
private String shfqy;
private int shxm_id;
private String shxzh_mch;
private Date chjshj; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getShxzh() {
return shxzh;
} public void setShxzh(String shxzh) {
this.shxzh = shxzh;
} public String getShfqy() {
return shfqy;
} public void setShfqy(String shfqy) {
this.shfqy = shfqy;
} public int getShxm_id() {
return shxm_id;
} public void setShxm_id(int shxm_id) {
this.shxm_id = shxm_id;
} public String getShxzh_mch() {
return shxzh_mch;
} public void setShxzh_mch(String shxzh_mch) {
this.shxzh_mch = shxzh_mch;
} public Date getChjshj() {
return chjshj;
} public void setChjshj(Date chjshj) {
this.chjshj = chjshj;
} }

属性实体:

package com.atguigu.bean;

import java.util.Date;

public class T_MALL_ATTR {

    private int id;
private String shxm_mch;
private String shfqy;
private int flbh2;
private Date chjshj; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getShxm_mch() {
return shxm_mch;
} public void setShxm_mch(String shxm_mch) {
this.shxm_mch = shxm_mch;
} public String getShfqy() {
return shfqy;
} public void setShfqy(String shfqy) {
this.shfqy = shfqy;
} public int getFlbh2() {
return flbh2;
} public void setFlbh2(int flbh2) {
this.flbh2 = flbh2;
} public Date getChjshj() {
return chjshj;
} public void setChjshj(Date chjshj) {
this.chjshj = chjshj;
} }

商品属性包装对象:将商品的属性和属性值封装为一个对象

package com.atguigu.bean;

import java.util.List;

/**
* 商品属性包装对象
* @author doublening
*
*/
public class OBJECT_T_MALL_ATTR extends T_MALL_ATTR {
//属性值
private List<T_MALL_VALUE> list_value; public List<T_MALL_VALUE> getList_value() {
return list_value;
} public void setList_value(List<T_MALL_VALUE> list_value) {
this.list_value = list_value;
} }

商品属性模型实体:这个实体是因为Controller不能直接接收List<OBJECT_T_MALL_ATTR>集合参数而建立的

package com.atguigu.bean;

import java.util.List;

/**
* 这个对象是对List<OBJECT_T_MALL_ATTR> list_attr的一个封装
* 因为后端不能直接接收前端传递的list_attr
* @author doublening
*
*/
public class MODEL_T_MALL_ATTR { private List<OBJECT_T_MALL_ATTR> list_attr; public List<OBJECT_T_MALL_ATTR> getList_attr() {
return list_attr;
} public void setList_attr(List<OBJECT_T_MALL_ATTR> list_attr) {
this.list_attr = list_attr;
} }

二、删除

三、改

四、查

1. 带有集合的实体装配

sql:

<select id="select_attr_list" parameterType="int" resultMap="select_attr_list_map">
select attr.id as attr_id ,attr.*,val.id as val_id ,val.*
from t_mall_attr attr ,
t_mall_value val where
attr.id = val.shxm_id
and
attr.flbh2 = #{flbh2}
</select> <!-- autoMapping:属性自动映射 -->
<resultMap type="com.atguigu.bean.OBJECT_T_MALL_ATTR" id="select_attr_list_map"
autoMapping="true">
<result column="attr_id" property="id" />
<collection property="list_value" ofType="com.atguigu.bean.T_MALL_VALUE"
autoMapping="true">
<!-- 指定主键映射,其他属性自动映射 -->
<result column="val_id" property="id" />
</collection>
<!-- 如果里面还有对象类型的数据 -->
<!-- <association property=""></association> -->
<!-- 如果还有集合类型的数据 -->
<!-- <collection property=""></collection> -->
</resultMap>

dao层接口:

List<OBJECT_T_MALL_ATTR> select_attr_list(int flbh2);

实体:

// 组合实体
public class OBJECT_T_MALL_ATTR extends T_MALL_ATTR {
private List<T_MALL_VALUE> list_value;
}
// 属性实体
public class T_MALL_ATTR {
private int id;
private String shxm_mch;
private String shfqy;
private int flbh2;
private Date chjshj;
}
// 属性值实体
public class T_MALL_VALUE {
private int id;
private String shxzh;
private String shfqy;
private int shxm_id;
private String shxzh_mch;
private Date chjshj;
}

2. 不带集合的组合装配

xml中的sql:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.atguigu.mapper.ListMapper">
   <!-- 通过属性去查库存列表 -->
<select id="select_list_by_attr" parameterType="Map" resultMap="select_list_by_flbh2_map">
SELECT
spu.id as spu_id, spu.*, sku.id as sku_id, sku.*, tm.id as tm_id ,tm.*
FROM
t_mall_product spu,
t_mall_sku sku,
t_mall_trade_mark tm
WHERE
spu.Id = sku.shp_id
and spu.pp_id = tm.Id
and spu.flbh2 = #{flbh2}
${subSql}
</select> <select id="select_list_by_flbh2" parameterType="int" resultMap="select_list_by_flbh2_map">
SELECT
spu.id as spu_id, spu.*, sku.id as sku_id, sku.*, tm.id as tm_id ,tm.*
FROM
t_mall_product spu,
t_mall_sku sku,
t_mall_trade_mark tm
WHERE
spu.Id = sku.shp_id
and spu.pp_id = tm.Id
and spu.flbh2 = #{flbh2}
</select> <resultMap type="com.atguigu.bean.OBJECT_T_MALL_SKU" id="select_list_by_flbh2_map" autoMapping="true">
<id column="sku_id" property="id" />
     <!--这里的property和组合实体中的属性名一致-->
<association property="spu" javaType="com.atguigu.bean.T_MALL_PRODUCT" autoMapping="true">
<id column="spu_id" property="id" />
</association>
<association property="tm" javaType="com.atguigu.bean.T_MALL_TRADE_MARK" autoMapping="true">
<id column="tm_id" property="id" />
</association>
</resultMap>
</mapper>

mapper接口:

public interface ListMapper {
List<OBJECT_T_MALL_SKU> select_list_by_flbh2(int flbh2);
List<OBJECT_T_MALL_SKU> select_list_by_attr(HashMap<Object, Object> hashMap);
}

实体及其实体关系:

// 组合实体
public class OBJECT_T_MALL_SKU extends T_MALL_SKU {
private T_MALL_PRODUCT spu;
private T_MALL_TRADE_MARK tm;
}
// 库存单元实体
public class T_MALL_SKU {
private int id;
private int shp_id;
private int kc;
private BigDecimal jg;
private Date chjshj;
private String sku_mch;
private String kcdz;
private long sku_xl;
}
// 产品实体
public class T_MALL_PRODUCT {
private int id;
private String shp_mch;
private String shp_tp;
private int flbh1;
private int flbh2;
private int pp_id;
private Date chjshj;
private String shp_msh;
}
// 交易标识
public class T_MALL_TRADE_MARK {
private int id;
private String ppmch;
private String url;
}

参考:

尚硅谷...

mysql 基本sql使用总结-电商项目的更多相关文章

  1. 常见电商项目的数据库表设计(MySQL版)

    转自:https://cloud.tencent.com/developer/article/1164332 简介: 目的: 电商常用功能模块的数据库设计 常见问题的数据库解决方案 环境: MySQL ...

  2. SpringBoot微服务电商项目开发实战 --- api接口安全算法、AOP切面及防SQL注入实现

    上一篇主要讲了整个项目的子模块及第三方依赖的版本号统一管理维护,数据库对接及缓存(Redis)接入,今天我来说说过滤器配置及拦截设置.接口安全处理.AOP切面实现等.作为电商项目,不仅要求考虑高并发带 ...

  3. 从头开始 启动开源电商项目jShop

    1. 引言 干了三年C#, 有了转Java 的念想,所以尝试学习一下java web,java语法本身和C#没有太多的差别,所以打算看看开源的java项目,开源的Java项目还是非常非常多的,曾经看了 ...

  4. Python Django(WEB电商项目构建)

    (坚持每一天,就是成功) Python Django Web框架,Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,模板T和视图V组成. 安装Pyth ...

  5. .NET Core/.NET5/.NET6 开源项目汇总7:电商项目

    系列目录     [已更新最新开发文章,点击查看详细] 谈起.NET/.NET Core的企业级实战案例,电商项目是典型代表.其中高负载.高并发.高可用性等问题是考核.NET技术性能的重要指标.下面整 ...

  6. 用SpringBoot搭建简单电商项目 01

    前几节呢,我们已经简单介绍了SpringBoot框架的使用,从这一节开始,我们尝试着使用SpringBoot框架来一步一步搭建一个简单电商项目.当然了,这不是真正的电商项目,你可以看成是一个CRUD案 ...

  7. C#大型电商项目优化(二)——嫌弃EF与抛弃EF

    上一篇博文中讲述了使用EF开发电商项目的代码基础篇,提到EF后,一语激起千层浪.不少园友纷纷表示:EF不适合增长速度飞快的互联网项目,EF只适合企业级应用等等. 也有部分高手提到了分布式,确实,性能优 ...

  8. C# 大型电商项目性能优化(一)

    经过几个月的忙碌,我厂最近的电商平台项目终于上线,期间遇到的问题以及解决方案,也可以拿来和大家多做交流了. 我厂的项目大多采用C#.net,使用逐渐发展并流行起来的EF(Entity Framewor ...

  9. Mall电商项目总结(一)——项目概述

    项目概述 此电商项目为本人学习项目,后端 使用nginx实现负载均衡转发请求到多台tomcat服务器,使用多台 redis服务器分布式 缓存用户登录信息. 项目已经部署到阿里云服务器,从阿里云linu ...

随机推荐

  1. 干了这杯Java之transient关键字

    看源码的时候,发现transient这个关键字,不甚理解,查找资料发现:不被序列化 疑问: 静态变量是不是不被序列化? public class User implements Serializabl ...

  2. 干货 | LIDAR、ToF相机、双目相机如何科学选择?

    点击"计算机视觉life"关注,置顶更快接收消息! 本文阅读时间约5分钟 本文翻译自卡内基梅隆大学 Chris asteroid 三维视觉技术的选择 传感器参数及定义 LIDAR ...

  3. STM32F103驱动GT911

    0x00 引脚连接: // SCL-------PB10 // SDA-------PB11 // INT--------PB1 // RST--------PB2 IIC的SCL与SDA需要接上拉电 ...

  4. 学习DButils笔记

    DBUtills: *********************** 1:创建对象:QueryRunner的对象,其中创建的方式有两种: ①QueryRunner qr = new QueryRunne ...

  5. windows10的普通用户使用Task Scheduler的问题

    在Create Task 窗口的General选项卡中,在Security options 里有几个单选项,分别是 Run only when user is logged on ,Run wheth ...

  6. sitecore8.2 如何关闭性能计数器

    在Sitecore.config文件或补丁文件修改Counters.Enabled为false值,此key默认为true;然后再修改Sitecore.Tasks.CounterDumpAgent 时间 ...

  7. Linq高级查询,分页查询及查询分页结合

    一.高级查询与分页查询 1.以...开头    StartsWith Repeater1.DataSource=con.Users.Where(r=>r.Nickname.StartsWith( ...

  8. [转载非常好的文章]JLink+GDBServer调试S3C6410裸板的初始化代码 For OK6410开发板

    要调试裸板,有两种初始化方法,一个是用烧好的uboot初始化,再有就是直接用JLink+GDBServer初始化.代码参考了网上的资料,根据手头的OK6410开发板做了修改.整体代码如下: # Con ...

  9. C# Thread.Jion()

    什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的 ...

  10. Oarcle之序列

    序列:是一种数据库对象,用来自动产生一组唯一的序号: 序列:是一种共享式的对象,多个用户可以共同使用序列中的序号. 创建序列 create sequence seq_emp_temp incremen ...