一、增加

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. git提交到一半关闭时

    一:出现问题 最近写东西,在提交代码时,突然出现一大推文件... 忘记加.gitignore文件了,导致所有的安装依赖也都上传了.所以,点击了关闭按钮,当下一次提交时,出现了错误. Another g ...

  2. .NET 内存分配笔记

    阅读博客http://jonskeet.uk/csharp/memory.html的笔记(个人水平有限,如若翻译.记录有误,请提,谢谢~) 误区:引用类型保持在堆中,值类型保持在栈中. 问题:前半句正 ...

  3. hybrid简单了解

    技术点总有它的来由. 文章概要: 1.hybrid 基本概念 2.前端和客户端的交互 3.前端和客户端的交互实现 4.前端交互实现关注点 5.小结 1.hybrid 基本概念 ⑴.什么是hybrid? ...

  4. JavaIO流——简单对文件的写入及读取(三)

    已经讲了写入和读取了,那么想要把一个文件的内容复制到另一个文件呢 不说太多,直接见代码 public static void copyFile(String srcFilename, String d ...

  5. 关于常用mysql的文件

    这个一般在做项目的时候会用到,直接建立函数啥的,后部直接调用 代码: class_database.py import pymysql SERVER_HOST = "192.168.1.1& ...

  6. 201808_summary

    @Consumes @Produces分别表示入参和出参数吗 可以这样讲.但是不是很到位.是限定作用,类似于filterconsumes: 指定处理请求的提交内容类型(Content-Type),例如 ...

  7. mysql修改用户密码笔记(转)

    方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...

  8. UGUI-Text——自适应

    Text组件上勾选Best Fit,当内容变多时,按原来大小装不下时,会总体缩放显示

  9. RocketMQ基本概念

    RocketMQ基本概念 一.生产者 生产者发送业务系统产生的消息给broker.RocketMQ提供了多种发送方式:同步的.异步的.单向的. 1.1 生产者组 具有相同角色的生产者被分到一组.假如原 ...

  10. dataguard日志自动删除

    dataguard日志自动删除 1.判断日志是否已经应用到今天.2.删除3天前的日志.3.主机.备机分别配置 ----check_del_arch.sh#!/bin/shORACLE_HOME=/ho ...