2 3   4    Y 5    c:adFile 6     [mysql] mysql-myibatis-整理 - 11GX
首页 > [mysql] mysql-myibatis-整理

[mysql] mysql-myibatis-整理

==================================== insert ==========================================
语句1<insert id="insertEcsUsers" parameterType="com.goldenvista.kjt.entity.message.EcsUsers" useGeneratedKeys="true" keyProperty="userId">
insert into 
ecshop_new.ecs_users
(
reg_time,
mobile_phone,
is_validated
)
values
(
unix_timestamp(NOW()) - 8*3600,
#{mobilePhone},
'0'
)
insert>语句2<insert id="insertEcsOrderInfo" parameterType="com.goldenvista.kjt.entity.message.EcsOrderInfoM" useGeneratedKeys="true" keyProperty="orderId">
insert
into kjt.ecs_order_info
(
order_sn,
user_id,
password2
<if test="empId != null">
,emp_id
if>
)
values
(
#{orderSn,jdbcType=VARCHAR},
#{userId,jdbcType=DECIMAL},
#{password2,jdbcType=VARCHAR}
<if test="empId != null">
,#{empId}
if>
)
insert>知识点:
1、Mybatis主键自动生成: 
在mysql、sql server等支持主键自动增长的数据库中,mybatis插入时,对自动生成的字段的写法:<insert id=”insertAuthor” parameterType=”传参类型,可以是bean/map” useGeneratedKeys=”true” keyProperty=“主键id”> 
insert into
(uername, password, email ) 
vlaues
(#{username}, #{password}, #{email}) 
<insert>2、可以用控制语句控制是否插入某字段
<if test="empId != null">
,emp_id
if>3、在插入时可以指定该字段的字段类型
#{orderSn,jdbcType=VARCHAR}4、参数类型一般是相应的bean5、mysql的日期函数FROM_UNIXTIME(dateSerial,partten)
UNIX_TIMESTAMP(date)
NOW()mysql> SELECT UNIX_TIMESTAMP() ; (获得当前时间序列)
->1249524739mysql> SELECT FROM_UNIXTIME( 1249488000, '%Y年%m月%d' ) 
->2007年11月20mysql> SELECT UNIX_TIMESTAMP('2009-08-06') ;
->1249488000mysql> SELECT * FROM `student` WHERE regTime > UNIX_TIMESTAMP(curdate()) //今天所有学生注册记录。==================================== update ==========================================语句1<update id="updateEcsUsersOpenId" parameterType="java.util.Map">
update 
ecshop_new.ecs_users u 
set 
u.kjt_open_id = #{openId} 
where 
(u.user_name = #{userName} or u.mobile_phone = #{userName})
and 
u.password = #{password}
update>语句2<update id="updateOrderStatus" parameterType="java.util.Map">
update 
kjt.ecs_order_info og 
set 
og.order_status='6',
og.password2 = #{password},
og.store_receive_date =UNIX_TIMESTAMP()
WHERE 
og.order_sn = #{orderSn}
update>知识点:
1 或条件查询连接一定要加上括号,否则查询或更改就会出错
where (u.user_name = #{userName} or u.mobile_phone = #{userName}) and u.password = #{password}
where u.user_name = #{userName} or u.mobile_phone = #{userName} and u.password = #{password}
这两个语句的查询结果是不一样的2 参数类型一般是 java.util.Map
parameterType="java.util.Map"==================================== select ==========================================语句1:<select id="querySaleEmployee" resultType="com.goldenvista.kjt.entity.message.EcsUsers">
select 
e.emp_id as empId,
e.emp_name as empName,
e.sheng_code as empShengCode,
e.shi_code as empShiCode,
e.xian_code as empXianCode,
(select r1.region_name from kjt.ecs_region r1 where r1.region_id = e.sheng_code) as empShengName,
(select r2.region_name from kjt.ecs_region r2 where r2.region_id = e.shi_code) as empShiName,
(select r3.region_name from kjt.ecs_region r3 where r3.region_id = e.xian_code) as empXianName
from kjt.sale_employee_info e 
where 1 = 1
<if test="empId != null">
and e.emp_id = #{empId}
if>
select>1 两表联查(最外层单表)
(select r1.region_name from kjt.ecs_region r1 where r1.region_id = e.sheng_code) as empShengName
通过 r1.region_id = e.sheng_code 从 ecs_region 表获取省名称2 resultType
查到的数据的类型
as empXianName 的 empXianName 必须和 resultType 的数据类型的字段名一致语句2:<select id="queryEcsUsersInfo" resultType="com.goldenvista.kjt.entity.message.EcsUsers">
select 
u.user_id as userId,
ifnull(e.emp_id,'') as empId,
ifnull(e.sheng_code,'') as empShengCode,
ifnull((select r1.region_name from kjt.ecs_region r1 where r1.region_id = e.sheng_code),'') as empShengName
from 
ecshop_new.ecs_users u 
left join 
kjt.emp_user_info eu on u.user_id = eu.user_id 
left join 
kjt.sale_employee_info e on eu.emp_id = e.emp_id 
where 
u.is_validated = '0'
<if test="openId != null">
and (u.kjt_open_id = #{openId} or u.user_id = #{openId})
if>
<if test="userName != null">
and (u.user_name = #{userName} or u.mobile_phone = #{userName})
if> 
<if test="password != null">
and u.password = #{password}
if>
select>1 外层多表联查LEFT JOIN 内层两表联查
实例:当查询某销售本月的销售额的时候,如果不使用left join 连接,那么查询结果不包含销售额为0/null的销售代表的记录
但如果使用left join 则将销售代表个人信息表放在最前面,会得到全部销售的销售额,为0/null的就显示0/null语句3<select id="queryOrderInfoByOrderSn" parameterType="java.util.Map" resultType="com.goldenvista.kjt.entity.message.EcsOrderInfo">
select 
o.order_id as orderId,
CASE 
WHEN o.pay_status = 2 THEN (o.money_paid + o.surplus + o.cash_money + o.post_money)
ELSE o.order_amount
END as orderAmount,
o.surplus as surplus,
from_unixtime(o.add_time) as addTime,
o.password2 as password2
from 
kjt.ecs_order_info o
where 
o.order_sn = #{orderSn}
select>知识点:① SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 
2、where子句基于指定的条件对记录行进行筛选;  
3group by子句将数据划分为多个分组;  
4、使用聚集函数进行计算; 
5、使用having子句筛选分组;  
6、计算所有的表达式;  
7、使用order by对结果集进行排序。举例:1.select 列列表 from 表列表名/视图列表名 where 条件.          
2.select 列列表 from 表列表名/视图列表名 where 条件 group by (列列表) having 条件 3.select 列列表 from 表列表名/视图列表名 where 条件 group by (列列表) having 条件 order by 列列表 4.select 列列表 from 表1 join 表2 on 表1.列1=表2.列1...join 表n on 表n.列1=表(n-1).列1 where 表1.条件 and 表2.条件...表n. 执行顺序: 分析:
1. 先where 后select(先选出符合where子句的元组,再在元组中抽取指定的列组成二维表)
2. 先where 再group 再having 后select
3. 先where 再group 再having 再select 后order          
4. 先join 再where 后select综上执行顺序为:
join - where - group by - having - select - order by② 逻辑处理(多选择分支语句)
CASE 
WHEN o.pay_status = 1 THEN (o.money_paid + o.surplus)
WHEN o.pay_status = 2 THEN (o.money_paid + o.surplus + o.cash_money + o.post_money)
ELSE o.order_amount
END as orderAmount对最终筛选出来的元组进行最后的逻辑处理,因此是在select里进行处理的③ 时间函数
from_unixtime(o.add_time) as addTime语句4<select id="queryEcsGoods" parameterType="java.math.BigDecimal" resultType="com.goldenvista.kjt.entity.message.EcsGoodsInfo">
select 
goods_id as goodsId,
goods_number as goodsNumber
from kjt.ecs_goods 
where goods_id = #{goodsId}
select>根据主键查询 参数类型为 BigDecimal
parameterType="java.math.BigDecimal"语句5<!-- 查询用户今天消费的记录 -->
<select id="queryUserConsumeDailyByCardId" parameterType="java.lang.String" resultType="com.goldenvista.kjt.entity.mapping.EcsUserConsumeDaily">
select
c.id as id,
c.identify_no as identifyNo,
c.real_name as realName,
c.consume_money as consumeMoney,
c.tax as tax,
c.consume_date as consumeDate
from 
ecshop_new.ecs_user_consume_daily c
where 
c.identify_no = #{cardIdNo}
and 
c.consume_date = curdate()
select>参数类型:parameterType="java.lang.String"
“今天”:c.consume_date = curdate()语句6<!-- 根据userId查询用户最后一个订单所属货柜 -->
<select id="queryCabinetByUserId" resultType="com.goldenvista.kjt.entity.message.EcsOrderInfoM">
select 
t1.order_id as orderId,
t1.order_sn as orderSn,
t1.station_no as stationNo,
t1.station_name as stationName,
t1.cabinet_no1 as cabinetNo1,
t1.box_no as boxNo 
from 
kjt.ecs_order_info t1, ecshop_new.ecs_users t2
where 
t1.user_id = t2.user_id
and 
t1.user_id = #{userId}
and 
t1.shipping_id = '9'
and 
t1.cabinet_no1 is not null
order by
t1.add_time desc
select>注意:null 和 "" 和 0 是不一样的,is not null 用于查询不为 null 的元组语句7<!-- 按销量从高到低查询商品 -->
<select id="queryGoodsByNumInfo" parameterType="java.util.Map" resultType="com.goldenvista.kjt.entity.message.KjtGoodsInfoModel" >
SELECT 
g.GOODS_ID as goodsID,
g.goods_sn as goodsSn,
g.tax     as taxPrice,
g.MEASURE_UNIT     as goodsUnit,
g.IS_WEIGHT     as isWeight,
g.shop_price     as goodsPrice,
g.GOODS_NAME as goodsName,
g.GOODS_IMG as goodsImg,
g.CAT_ID     as catId,
g.STORE_ID     as storeId,
SUM(o.GOODS_NUMBER) as goodsSum 
FROM
kjt.ecs_order_goods o,kjt.ecs_goods g
WHERE 
o.GOODS_ID = g.GOODS_ID 
GROUP BY 
g.GOODS_ID
ORDER BY 
goodsSum DESC
select>sum() 聚集函数常用于统计金额和数量 有聚集函数必定有 group by 子句 且group by 的字段最好使用不常改变的id类字段SUM(o.GOODS_NUMBER) as goodsSum 
GROUP BY g.GOODS_ID语句8 <select id="queryEmployeeList" parameterType="java.util.Map" resultType="com.goldenvista.kjt.entity.message.SaleEmployeeInfo">
SELECT
s.emp_id as empId,
s.emp_name as empName
FROM 
kjt.sale_employee_info s
WHERE 
s.status = '1'
<if test="empName != null">
and (s.mobile like CONCAT('%',#{empName},'%') or s.emp_name like CONCAT('%',#{empName},'%'))
if>
order by s.emp_id desc
select>模糊查询
s.mobile like CONCAT('%',#{empName},'%')语句9 <!-- 统计销售每月发展的会员数 -->
<select id="queryPersonNumMonth" parameterType="java.math.BigDecimal" resultType="java.math.BigDecimal">
select
count(*)
from 
ecshop_new.ecs_users u, kjt.emp_user_info e
where 
u.user_id = e.user_id
and 
e.emp_id = #{empId}
and 
year(from_unixtime(u.reg_time + 3600*8)) = year(now())
and 
month(from_unixtime(u.reg_time + 3600*8)) = month(now())
select>日期函数
year()
month()语句10<!-- 统计销售每月的销售额 -->
<select id="querySaleMoneyMonth" parameterType="java.math.BigDecimal" resultType="java.math.BigDecimal">
select
sum(o.money_paid + o.surplus + o.cash_money + o.post_money)
from kjt.ecs_order_info o
where o.emp_id = #{empId}
and year(from_unixtime(o.add_time)) = year(now())
and month(from_unixtime(o.add_time)) = month(now())
and o.pay_status = 2
select>语句11<!-- 统计某段时间内销售代表发展的会员数 -->
<select id="queryPersonNumByDate" parameterType="java.util.Map" resultType="java.math.BigDecimal">
select
count(*)
from ecshop_new.ecs_users u, kjt.emp_user_info e
where u.user_id = e.user_id
and e.emp_id = #{empId}
<if test="startDate != null">
and from_unixtime(u.reg_time + 3600*8) >= #{startDate}
if>
<if test="endDate != null">
<![CDATA[
and from_unixtime(u.reg_time + 3600*8) <= date_add(#{endDate}, interval 1 day)
]]>
if>
select>1 时间段查询2 日期加减计算
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)date 是一个 DATETIME 或DATE值,用来指定起始时间。 
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。
type 为关键词,它指示了表达式被解释的方式。===============================================================
mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
-> '1998-01-01 00:00:00'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 SECOND);
-> '1998-01-01 00:00:00'
===============================================================
mysql> SELECT INTERVAL 1 DAY + '1997-12-31';
-> '1998-01-01'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',INTERVAL 1 DAY);
-> '1998-01-01 23:59:59'
===============================================================
mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;
-> '1997-12-31 23:59:59'
===============================================================语句 12 <!-- 分页查询订单列表 -->
<select id="queryKjtOrderList" resultType="com.goldenvista.kjt.entity.mapping.KjtStoreOrderInfo">
SELECT 
ROW_.*
FROM (
select 
t1.order_id as orderId,
t1.order_sn as orderSn,
CASE 
WHEN t1.pay_status = 2 
THEN (t1.money_paid + t1.surplus + t1.cash_money + t1.post_money)
ELSE t1.order_amount
END as orderTaxPrice,
t1.goods_amount as orderPrice
from 
kjt.ecs_order_info t1, ecshop_new.ecs_users t2
where 
t1.user_id = t2.user_id
<if test="userId != null">
and t1.user_id = #{userId}
if>
order by t1.add_time desc
<![CDATA[
) ROW_
limit #{startRecord},#{pageSize}
]]>
select>分页使用 limit 起始索引 每页条数语句13 多表联合查询select 
max(s.emp_id) as empId,
max(s.emp_name) as empName,
ifnull(max(g.goods_name),'-') as goodsName,
ifnull(SUM(g.goods_number*g.goods_price),'0') as totalMoney
from 
kjt.sale_employee_info s 
LEFT JOIN 
kjt.ecs_order_info o on s.emp_id = o.emp_id
LEFT JOIN 
kjt.ecs_order_goods g on o.order_id = g.order_id
where 1=1
group by 
g.goods_id,s.emp_id
order by 
SUM(g.goods_number*g.goods_price) DESC============================ 拓展知识点 =========================① Mybatis主键自动生成: 在MYSQL、sql server等支持主键自动增长的数据库中!mybatis插入时,对自动生成的字段的写法: 
<insert id=”insertAuthor” parameterType=”类型” useGeneratedKeys=”true” keyProperty=“自动生成的字段名”> 
insert into 
数据表名(uername, password, email ) 
vlaues
(#{username}, #{password}, #{email}) 
<insert>    对不支持自动生成功能的数据库,mybatis提供以下写法,不过,此写法生成的ID是随机的
<insert  id=”insertAuthor” parameterType=“类型”> 
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">   SELECT LAST_INSERT_ID() AS id   selectKey> 
insert into 数据表名(id, username, password, email ) 
values  
(#{id},#{username},#{password},#{email}) 
insert> ② Mybaits-SQL语句包含: 
<sql id=”Columns”> select/update/delete/insert 等操作sql>
<select id=”selectUser” parameterType=int” resultType=”hashMap”>    
select  
<include  refid=”Columns”/>       
from  
表名
where 
id=#{id} 
select>③ Mybatis动态SQL语句 a、if语句 
select 字段名 
from  表名 
where  state=1<if test =”字段名!=null>          
AND 条件      
if>b、choose, when , otherwise select 字段名 from 表名  
where  state=1<choose>  <when test=”字段名!=null>
And 条件          
when> <when test=”条件表达式”>             
And 条件          
when>          
<otherwise >               
And 条件           
otherwise>        
choose> c、trim, where , set      1, where 
Select 字段名 from 表名             
<where>               
条件           
where> 
注 : 加 <where> 后则确保一定是 where 开头2, set 
Update  表名          
<set> <if test=”条件”>
字段名=#{参数}
if>
set> Where  条件 d、foreach 通常构建在in条件中 
Select  字段名  from 表名             
Where 字段名 in  
<foreach  item=”参数名” index=index” collection=”list” Open=”(” separator=”,” close=”)” >
#{参数名} 
foreach>   e、作用例:批量删除  <delete id = "delete" parameterType = "java.util.List">   <![CDATA[   delete from tests where id in
]]>   <foreach collection="list" item = "要删除的id" open="(" separator="," close=")"> 
#{要删除的id}   foreach>   
delete>  f、模糊查询: 
select 字段名 from 表名 where  字段名 like  "%"  #{参数}  "%" ④ sql元素Sql元素用来定义一个可以复用的SQL 语句段,供其它语句调用。<!-- 复用sql语句 查询student表所有字段 -->
<sql id="selectStudentAll">
SELECT ST.STUDENT_ID,
ST.STUDENT_NAME,
ST.STUDENT_SEX,
ST.STUDENT_BIRTHDAY,
ST.CLASS_ID
FROM STUDENT_TBL ST 
sql>这样,在select的语句中就可以直接引用使用了<!-- 查询学生,根据id -->   
<select id="getStudent" parameterType="String" resultMap="studentResultMap">   
<include refid="selectStudentAll"/>   
WHERE ST.STUDENT_ID = #{studentID}
select>   ⑤ parameters 
MyBatis可以使用的基本数据类型和Java的复杂数据类型。         
基本数据类型包括String,int,date等。但是使用基本数据类型,只能提供一个参数,所以需要使用Java实体类或Map类型做参数类型。
通过#{}可以直接得到其属性。

 

更多相关:

  •     先吐为敬!   最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆“代码拷贝党”、“留一手”、“缺斤少两”、“不说人话”、“自己都没跑通还出来发blog”、“各种缺少依赖包”、“各种注释都没有”、“自己都不知道在写什么”的程序大神纷纷为了增加自己博客一个帖子的名额而发布了各种千奇百�...

  • 阅读ceph源码过程中需要明确当前操作是由哪个线程发出,此时需要根据线程id来确认线程名称 C++获取线程id是通过系统调用来直接获取 函数描述 头文件: 函数名称:syscall(SYS_gettid) 该函数直接返回了一个pid_t int类型的数字,即为当前线程id 此外函数pthread_s...

  • 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实际生产环境中必须考虑的问题。 面试题剖析 基于数据库的实现方案 数据库自增 id 这个就是说你的...

  • ORM操作    单表、一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(m...

  • 建立如下表: 建表语句: class表创建语句 create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset=utf8;student表创建语句 c...

  • select {appearance: none;/*隐藏原生select下拉框的向下箭头▼*/ }...

  • 一、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:mssq...

  • 一、介绍   GreenPlum分布式数据仓库,大规模并行计算技术。  无共享/MPP核心架构  Greenplum数据库软件将数据平均分布到系统的所有节点服务器上,所以节点存储每张表或表分区的部分行,所有数据加载和查询都是自动在各个节点服务器上并行运行,并且该架构支持扩展到上万个节点。 混合的存储和执行(按列或按行)  Greenp...

  • from selenium.webdriver.support.ui import Select Select(d.find_element_by_id(u'key_开户行')).first_selected_option.text 转载于:https://www.cnblogs.com/paisen/p/3669272.html...

  • 我们都知道面试的时候通常都会考数据库部分的知识,所以在此整理了下我们常用的面试中常用的一些查询语句SQL,本人测试数据库为SQL Server2008 首先在数据库中建立一个测试库,此处用DavidTest代替 数据表与相应测试数据 USE [DavidTest] GO /****** Object: Table [dbo].[T...

  •     最近一直在学习三层架构,前些天同样也写了一篇同样的博客,今天主要是通过一个登录的实例给大家讲解每部分的作用和相应代码的实现。     先将实现三层架构的UML图给大家,帮助大家更好的理解三层。               1. UI作用 (1) 向用户展示特定业务数据 (2) 采集用户的输入信息和操作 Publ...

  •  经常看见MOP上有人贴那种动态的图片,就是把一个字符串作为参数传给一个动态网页,就会生成一个带有这个字符串的图片,这个叫做文字水印。像什么原来的熊猫系列,还有后来的大树和金条,都挺有意思。这东西看着挺好玩的,想做个玩玩。查了查资料,发现用.net来做这个是很容易的,就用Asp.net写了一个非常简单的。全部的代码如下: <%@...

  • 那天去了达内,试听了2个小时的课,刚好讲的他们的当当网项目,讲hibernate表关系映射这段来了,不过也够呛,投影仪看的眼睛点都不舒服,当时讲的也没认真听,听了个大概,就记住那个老师一句话了,说是有经验的人用的,一般人不告诉,就是说这个join fetch 用法,回来查了一下,用起来比较爽,今晚突然来了兴致,小记一下。 join f...

  •           这两天在和斌做后台中的报表,暂定使用水晶报表,目前还只是处于对水晶报表的初级应用阶段,也就是知道如何 汇个总、写个函数、传个参数。           问题总是层出不穷,在最后整合报表,进行报表显示测试的时候,发现每次更新数据显示(除第一次)时都会蹦出一个“登录数据库的信息提示界面”很是苦闷,并且这肯�...

  •  1 2 3   4    Y 5    c:adFile 6