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、参数类型一般是相应的bean

5、mysql的日期函数

FROM_UNIXTIME(dateSerial,partten)
UNIX_TIMESTAMP(date)
NOW()

mysql> SELECT UNIX_TIMESTAMP() ; (获得当前时间序列)
->1249524739

mysql> SELECT FROM_UNIXTIME( 1249488000, ‘%Y年%m月%d‘ )
->2007年11月20

mysql> SELECT UNIX_TIMESTAMP(‘2009-08-06‘) ;
->1249488000

mysql> 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子句基于指定的条件对记录行进行筛选;
3、group 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类型做参数类型。
通过#{}可以直接得到其属性。

mysql-myibatis-整理,布布扣,bubuko.com

时间: 2024-08-27 22:37:22

mysql-myibatis-整理的相关文章

mysql待整理

前面讲到的:insert - select - where not exist 其实好像也是为了实现:插入数据时,如果有重复则不插入.参见:http://snowolf.iteye.com/blog/1568926 和INSERT IGNORE INTO 差不多,不过前者可以自己加条件,后者只能根据主键来判断是否重复. MySql一些开发规范:http://www.2cto.com/database/201403/285170.html 1. MYSQL SQL_NO_CACHE的真正含义 ht

mysql 命令整理

登录命令 mysql -uroot -p21313 新建用户 insert into mysql.user(Host,User,Password) values("localhost","phplamp",password("1234")); 刷新权限 flush privileges; 创建数据库 create database 数据库名; 显示数据库 show database; 切换数据库 use 数据库名: 数据库授权 grant all

Mysql基本操作整理

1.登录数据库 格式: mysql -h主机地址 -u用户名 -p用户密码 –P端口 –D数据库 –e “SQL 内容”>mysql -uroot -p 数据库名称~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2.修改密码 格式:mysqladmin -u用户名 -p旧密码 password 新密码Mysqladmin  -uroot  -password ab12注:因为开始时root没有密码,所以-p旧密码一项就可以省略了.例2:再将root的密码改为djg345.my

mysql数据类型整理

mysql 数据类型的概念 定义数据类型的本质上是定义列 类似于描述列 数据分类的意义 分配合适的存储空间 采用不同的操作方法 对应不同的需求 整数类型 正负0 造成 负数多一个 tinyint 1byte 0-255 -128 ~ 127 smallint 2b 0~65535 mediumt 3b int 4b bigint 8b 带小数的类型 float 4b 0,(3.4) double 8b decimal M>D M+2 M<D D+2 decimal 最大支持 (65,30) 默

mysql optimize整理表碎片

当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删 除操作后在数据文件中留下碎片所致.optimize table 可以去除删除操作后留下的数据文件碎片,减小文件尺寸,加快未来的读写操作.您只要在做完批量删除,或定期(如 每一两个月)进行一次数据表优化操作即可. OPTIMIZE TABLE通过制作原来的表的一个临时副本来工作 OPTIMIZE TABLE语法OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [,

mysql索引整理

一.索引: 1.创建一般索引 create index index_name on table_name(columnname[...]); 2.分析sql执行语句 在select 之前加explain eg:explain select * from table_name; 3.mysql从5.5.5之后默认采用innerdb为默认的存储引擎,该引擎支持的两种常见索引:b+树索引和hash索引,hash索引的效率高于b+树,但hash索引只支持=类型. b+树可以支持范围的eg:>< ,b+

Mysql体系结构整理

MySQL由数据文件和数据库实例组成,是单进程多线程架构组成. 数据库文件:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件可以是frm.myd.myi.ibd等结尾的文件,当使用ndb存储引擎时候,不是os文件,是存放于内存中的文件; 数据库实例:由数据库后台进程/线程以及一个共享内存区组成的内存结构,共享内存可以被运行的后台进程/线程所共享.数据库关闭,数据实例就不存在了,数据库文件还是保存在磁盘上. 主要组件介绍: 1.Connectors指的是不同开发语言中与SQL的接口程

mysql引擎整理

MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引 擎:ISAM.MYISAM和HEAP.另外两种类型INNODB和BERKLEY(BDB),也常常可以使用.如果技术高超,还可以使用MySQL++ API自己做一个引擎.下面介绍几种数据库引擎:     ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操

MySQL 语法整理

注:MySql 中的 sql 语句是以“:”为结束点的,即只要遇到“:”时编译器就认为其上的所有语句就是一整句 sql 语句 但是结束标签可以更改:mysql>delimiter // 基本常用语法: 1.mysql> select version(),current_date;   =======>   获得服务器的版本号和当前日期 2.mysql> show databases;   ====>找出服务器上当前存在什么数据库:(mysql是必需的,因为它描述用户访问权限,

MySQL知识点整理

一.MySQL安装 1.Windows:运行可执行文件 压缩包 放置任意目录 2.初始化: 服务端:E:mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --initialize-insecure #此时会获得一个 用户名 root 密码:空 启动服务端: E:mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld\mysqld 客户端连接: E:mysql-5.7.16-winx64\mysql-