标签:mysql

MyBatis插入对象后返回获得自增的主键

很多情况下,我们的主键都是自增的,我们可能在插入后马上就获取到刚刚插入的数据的主键,下面就来记录一下:

插入记录在MyBatis中的写法:

<insert id="saveXxx" parameterType="com.wjy329.entity.xxx">
      <selectKey resultType="Integer" order="AFTER" keyProperty="id">
          SELECT LAST_INSERT_ID()
      </selectKey>
        insert into tableName
		(
			`line2`,
			`line3`
		)
		values
		(
			#{line2},
			#{line3}
		)
</insert>

关键在于

 <selectKey resultType="Integer" order="AFTER" keyProperty="id">
          SELECT LAST_INSERT_ID()
 </selectKey>

你以为仅仅获取到这个就行了?那是不可能的,直接获取返回的int,你会发现是一个固定的数字,它代表刚才插入数据影响的行。

在执行完插入操作后,我们只需在后面直接用getId()方法就行,例如: 

studentDao.saveStudent(student);
Integer id = student.getId;

MySQL必知必会(一)

和题目一样,通过《MySQL必知必会》这本书记录一下MySQL应该掌握的知识。

前提当然是你已经安装了MySQL,至于如何安装MySQL,网上也有很多,这里不做记录

1.使用MySQL
打开终端,输入:                                                               

mysql -u username -p

然后回车,输入相应的密码即可;

#显示当前所有的数据库
show databases;
#选择数据库,dataname就是你要选择的数据库名字
use dataname;
#显示当前数据库下的所有表
show tables;
#显示tablename这个表的列
show columns from tablename;
#显示tablename列的第二种方法(更加简洁)
describe tablename;

关于show语句还有很多,我们可以输入help show来显示允许使用的show的语句,同时,我们也可以使用 help  xxx 来显示所支持的xxx的相关语句。

上面几行命令简单的介绍了MySQL的基本操作;

2.检索数据

#检索单个列,表示从studnet表中查出名为id的列
select id from student;
#检索多个列,表示从student中查出名为id和name的列,多个字段用,隔开
select id,name from student;
#检索所有列,使用 * 表示返回表中所有的列
select * from student;
#去重,使用distinct可以只显示不同的id
select distinct id from student;
#限制结果,返回不多于5行的数据
select id from student limit 5;
#返回从行3开始的5行数据,第一个数字为开始位置,第二个数字为检索的行数
select id from student limit 3,5;

3.排序检索数据

#根据id排序查询出来的id
select id from student order by id;
#多个列排序,先按照id排序,如果id相同则按照name排序
select id,name from studnet order by id,name;
#指定排序顺序,asc 升序(默认)    desc 降序
select id from student order by id desc;
#使用order by 和 limit 组合可以找出最高或最低的数据
#查询年龄最大的学生的年龄
select age from student order by age desc limit 1;

4.过滤数据

where语句的使用;

#查询id为1的学生的年龄
select age from student where id = 1;

where语句常用的操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
between 在指定的两个值之间

组合语句过滤:

#查询id为1和年龄小于20的所有学生的名字和年龄
select name,age from student where id = 1 and age < 20;
#查询id为1或者2的学生的姓名
select name from student where id =1 or id = 2;

where可以包含任意数目的and和or操作符,但是需要注意优先级,and的优先级高于or,但是一般推荐组合时使用()

#查询id为1和5的学生的年龄
select age from student where id in (1,5);
#查询除id为1、5的学生的年龄
select age from student where id not in (1,5);

用通配符进行过滤-like的用法

#查询名字以wjy开头的所有学生的信息
select * from student where name like 'wjy%';
#查询名字包含wjy的学生的信息
select * from student where name like '%wjy%';
#查询名字以w开头,y结尾的学生的信息
select * from student where name like 'w%y';
#查询名字为w_y,_代表一个字符
select * from student where name like 'w_y';

“_”“%”的区别就是:% 可以代表任意字符,_只可以匹配单个字符;

通配符的处理所花时间较长,不要过度使用。

5.函数

函数一般用在数据上的执行,给数据的转换和处理提供了方便。

常用的文本处理的函数:

函数 说明
Left() 返回串左边的字符
Length() 返回串的长度
Locate() 找出串的一个子串
Lower() 将串转为小写
LTrim() 去掉串左边的空格
Right() 返回串右边的字符
RTrim() 去掉串右边的空格
Soundex() 返回串的SOUNDEX值
SubString() 返回子串的字符
Upper()

将串转换为小写

当然还有时间处理的函数、数值处理的函数等等,这里不对这些介绍,接下来看看数据汇总的一些函数。

AVG()函数:求平均值

#求出student表中所有的年龄的平均值 as 用来表示结果的别名;
select avg(age) as avg_age from student;

COUNT() 函数:进行计数

#返回学生表中学生的总数
select count(*) as num_studnet from student;
#返回address的总数,表示表中登记了地址的学生数
select count(address) as num_student from student;

MAX()函数:返回指定列中的最大值

#返回学生中年龄最大的年龄值
select max(age) from student;

MIN()函数:返回最小值,不作示例

SUM()函数:返回指定列的和

#计算所有学生的年龄和
select sum(age) from student;

6.分组

#根据班级class_id分别统计出每个班级的学生数
select class_id,count(*) as num from student group by class_id;

MySQL也允许过滤分组,之前的where是对行进行过滤,对分组进行过滤需要使用having

#过滤出学生数大于20的班级
select class_id,count(*) as num from student group by class_id having count(*) > 20;

7.子查询

子查询就是嵌套在其他查询中的查询;

比如说有三张表客户表customers、订单表orders、订单明细表orderitems;

需要列出订购物品book121的所有客户,我们可以分为3步:

(1)在订单明细表中查出包含book121的所有订单编号;

(2)根据订单编号在订单表中查出客户id;

(3)根据客户id在客户表中查询详细信息;

#执行上面的第一步
select order_num from ordersitems where prod_id = 'book121';
#假设返回的结果是 10001,10005 两个订单号
#执行第二步,根据10001,10005查询客户id
select cust_id from orders where order_num in (10001,10005);
#假设返回的结果是 20001,20005另个客户id
#执行第三步,根据客户id查询客户信息
select cust_name,cust_contact from customers where cust_id in (20001,20005);

上面的sql语句是每一步的执行过程,这时候我们将它们嵌套一下:

select cust_name,cust_contact from customers
from customers
where cust_id in (select cust_id
                    from orders
                    where order_num in (select order_num
                                        from orderitems
                                        where prod_id = 'book121'));

CentOS7-mysql 5.7 安装

1、配置YUM源

# 下载mysql源安装包shell> wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
# 安装mysql源shell> yum localinstall mysql57-community-release-el7-8.noarch.rpm

2、安装MySQL

shell> yum install mysql-community-server

3、启动MySQL服务

shell> systemctl start mysqld

查看MySQL的启动状态
shell> systemctl status mysqld

4、开机启动

shell> systemctl enable mysqld
shell> systemctl daemon-reload

5、修改root默认密码

shell> grep 'temporary password' /var/log/mysqld.log

这个可以看到初始的密码,我们需要修改为自己想要的。

shell> mysql -uroot -p

然后输入上面的密码,连接上mysql

mysql> set password for 'root'@'localhost'=password('MyNewPass4!'); 

注意: mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。

修改密码策略

在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略

选择0(LOW),1(MEDIUM),2(STRONG)
validate_password_policy=0

如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:

validate_password = off

重新启动mysql服务使配置生效:

systemctl restart mysqld

6、添加远程登录用户

mysql> GRANT ALL PRIVILEGES ON . TO ‘用户名’@’%’ IDENTIFIED BY ‘密码’ WITH GRANT OPTION;

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;