sql格式

  • String sql=”select * from t_shop where user_id=”+user.getUserId()+” and id=”+goods.getShopId()+””;
  • String sql=”select * from t_goods where name like ‘%”+search+”%’and status!=’已下架’ order by sale DESC,id DESC”;
  • String sql = “update t_user set userName=’”+user.getUserName()+”‘,email=’”+user.getEmail()+”‘,number=’”+user.getNumber()+”‘ where id=”+user.getUserId()+””;
  • String sql = “insert into t_order (status,user_id,totalPrice) values(“+order.getStatus()+”,”+user.getUserId()+”,”+order.getTotalPrice()+”)”;
  • String sql=”delete from t_cart where user_id=”+userId+””;
  • String sql2 = “update t_user set password=SUBSTRING(md5(‘“+user.getPassword()+”‘),1,16) where userName=’”+user.getUserName()+”‘“;
    //截取第一位到第16位共16位密文存入数据库,否则长度32位太长无法插入
    
  • String status=”已下架”;
    String sql = "update t_goods set status='"+status+"' where id="+goodsId+"";
    
  • 获取刚插入记录的id

    sql = "insert into t_role (name) values('"+role+"')"; 
    pstmt = con.prepareStatement(sql);  
    //获取插入后生成的角色ID,但只能是mysql自增长的
    pstmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
    rs = pstmt.getGeneratedKeys();
    if(rs.next()) {
        roleId=rs.getInt(1); //第一个就是刚生成的id
    }
    //代码实例:market2/AdminDao/417行
    
    /**
     * @Author haien
     * @Description 获取刚添加用户的id(根据上下文,不会因并发而出错) 
     * @Date 2019/1/17
     * @Param []
     * @return int
     **/
    @Query("select last_insert_id from users")
    int getLastInsertId();
    

    MySQL代码操作

  • 直接插入格式:

String sql=”insert into t_book value(null,’java牛逼’,888,’B哥’,1)”;

  • String sql = “insert into t_book value(null,’”+bookName+”‘,”+price+”,’”+author+”‘,”+bookTypeId+”)”;

    sql语句注意点

  • where前面不要加“,”
  • 表名和字段名不要用关键字,通常在表名之前加t_是为了防止用到关键字。MySQL关键字
  • where column=’直接写值而不是变量’:注意要加个单引号

    MySQL将查找结果按时间降序排序

    sql=”select * from t_order where user_id=”+userId+” and status=1 order by orderTime DESC,id DESC”;

    sql的一些功能

  • 用IN指定范围(NOT IN 不在该范围内的)
  • 以上可用BETWEEN 21 AND 23代替(NOT BETWEEN AND)则表示不在范围内的
  • 查询字段为空或不为空的
  • 去重复,相同字段不显示,比如,都是一年级就只显示一次一年级
  • concat 聚合
  • 查询每个年级人数
  • 查询年级人数大于3的年级
  • with rollup 加一个总计,数字的话直接累加,字符的话全部显示
  • 从第一条开始查询5条数据

    使用占位符?

  • String sql2 = “insert into t_user values(null,?,?)”; //id值要设好,写(?,?)第一坑变成id

  • pstmt = con.prepareStatement(sql2);

  • pstmt.setString(1, user.getUserName());//给第一个问号设值

  • pstmt.setString(2, user.getPassword());

  • pstmt.executeUpdate(); //括号里不能有sql

检索某个数据是否已存在

//验证用户是否已存在
String sql="select * from t_user where userName=?";
PreparedStatement pstmt =null;
pstmt=con.prepareStatement(sql);
//检索用户名
pstmt.setString(1, user.getUserName());
User resultUser=null;
ResultSet rs=pstmt.executeQuery();
if(rs.next()){
    resultUser=new User();
    resultUser.setUserName(rs.getString("userName"));
    resultUser.setPassword(rs.getString("password"));
}
//若用户已存在
if(resultUser!=null) {
    return false;
}
  • 完整sql语句请点击
  • 执行mysql语句返回的int值,是指当前执行的sql语句所影响的行数n。如果执行的是update语句,那么就说明有n行被update了;若是删除操作,那么就说明有n条记录被删除了。
  • MySQL语句where=后面这个东西如果是个字符串一定要写好格式啊,写好了字符串会变成黑色,格式是’”+字符串+”‘’

    查询结果按中文姓名顺序排序

  • 要把数据库查询到的记录按照人名排序,通常是按姓氏的拼音排序,可以采用MySQL的排序方式

    @Query(value = "select * from user order by convert(name using gbk) asc",nativeQuery = true)
    public List<T> find();
    
  • 注意:nativeQuery = true一定要写,否则sql的一些符号Spring认不出
  • name是排序的依据,using gbk是因为数据库已经被认为指定采用utf-8编码,但是只有gbk编码本身采用的是按拼音排序的方式(只有一级汉字是这样,二级汉字不是,但二级是生僻字也没事)
  • 代码实例:JpaDemo/entity/Identity、Task、Project,repository/GenericDao/ProjectRepository,test/ProjectRepositoryTest

    MySQL快捷键

  • 命令行:上下键切换命令
  • 图形工具:f5刷新

    MySQL数据类型

  • char(10),存放2位,但实际分配10位空间
  • varchar(10),存多少分配多少空间

函数

  • concat(str1,str2):拼接字符串
select concat(str1,str2) from t_user; //str1、2为表字段
  • 有一个str为null则函数返回null

  • ifnull:判断是否为null并赋予一个默认值

select concat(ifnull(str1,"defaultValue"),str2) from t_user; //str1为null则用defaultValue代替str1   
  • 由于concat只能传入二个参数,且返回的依旧是str,所以当需要拼接多个字符串时可以嵌套使用

  • substring(str,startIndex,len):字符串截取,len可省略,首位为1,从第startIndex位开始取,为负数则从倒数开始往右取。

  • substring_index(str,delim,count):从第count个字符串delim开始截取之前所有字符。

//从第2个.开始截取之前all字符:www.example
substring_index('www.example.com', '.', 2);
//从倒数第2个.开始截取之后all字符:example.com
substring_index('www.example.com', '.', -2);
//找不到delim则返回all字符串: www.example.com
substring_index('www.example.com', '.coc', 1);
  • left(str, length): 从左边开始截取length位字符串。
//exa
left('example.com', 3);
  • right(str, length): 从右边开始。
//com
right('example.com', 3);

新建用户并设置权限

  • cmd直接在根目录运行mysql -uroot -p密码,登录mysql.
  • 新建thz用户,密码111111,指定它只能访问thz数据库的所有表,但拥有所有访问权限

    grant all privileges on thz.* to thz@"%" identified by "111111"; 
    // %表示允许远程登录,只许本机登录的话这里换成localhost或127的那个
    
  • 不想给所有权限的话all privileges可以替换成select,insert,update,delete这样用逗号连接,表示只能对表数据进行增删查改,不能改变表结构(删表、建表等)
  • 对表结构进行更改的话是用create,drop等权限,还有几个权限自查吧!
  • 程序配置了该账户则拥有了这些权限:

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/shiro"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    

计算时间差

  • 看个例子,将查询结果按给定时间从近到远排序

    <select id="findAllOrderByTime" resultMap="GoodsResult">
        select *,ABS(TIMESTAMPDIFF(second,#{_parameter},Report_Date_Time)) as diffTime from goods order by diffTime ASC
    </select>
    
  • ABS():计算绝对值
  • TIMESTAMPDIFF(day/our/minute/… , str , str):计算按时间格式输入的字符串的时间差
  • datediff(now(), ‘2015-04-20 00:00:00’): 计算时间差,返回结果以天为单位,不超过一天返回0
  • 字符串与时间互转

    jdbc.url连接数据库

  • 用localhost:3306固然可以,但实际数据库需要解析localhost,会比较耗时,最好用127.0.0.1,这是本地ip,会比较快。
  • 远程连接

    spring.datasource.url=jdbc:mysql://120.77.144.151/llcweb
    
  • 这是师兄的服务器的数据库地址,省略了3306

    连接阿里云服务器上的远程数据库

  • 默认情况下,CentOS的MySQL数据库是不允许被远程访问的,所以我们需要开启权限
  • 登录数据库,使用MySQL系统自带的mysql数据库,它带有用户表

    use mysql;
    
  • 更新用户,允许所有ip访问,当然也可以设置特定的ip(一般是本地计算机的公网ip,不过不是127.0.0.1那个),然后host就要改成特定的ip

    update user set host='%' where user='root';
    ERRER 1062(23000): Duplicate entry '%-root' for key 1 //报错不要紧的
    
  • 查询我们是否创建访问的host成功了

    select host,user,password fron user;
    

enum

MySQL建表语句

//选择一个数据库
drop database if exists shiro;
create database shiro;
use shiro;

//开始建表
CREATE TABLE `award` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
   `aty_id` varchar(100) NOT NULL DEFAULT '' COMMENT '活动场景id',
   `is_awarded` tinyint(1) NOT NULL DEFAULT 0 COMMENT '用户是否领奖',
   `award_time` int(11) NOT NULL DEFAULT 0 COMMENT '领奖时间',
   `password` char(32) NOT NULL DEFAULT '' COMMENT '密码',
   `created_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
   available bool default false,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='获奖信息表';

约束

  • constraint:约束,主要是给约束取一个别名,否则系统会默认随机一个约束名

    CREATE TABLE `users` (
        `id` BIGINT(20) NOT NULL primary key AUTO_INCREMENT, //在这里声明主键
        PRIMARY KEY (`id`), //或在这里
        constraint pk_users primary key(id) //或这里,用constraint起别名,便于删除或修改此约束
    )
    
    //声明外键时也可以用constraint
    CONSTRAINT FK_post_author FOREIGN KEY (author_id)
      REFERENCES tbl_user (id) ON DELETE CASCADE ON UPDATE RESTRICT
    //简单形式
    FOREIGN KEY (author_id)REFERENCES tbl_user (id) ON DELETE CASCADE ON UPDATE RESTRICT
    
  • 代码实例:ideaProjects/shiroHelloWorld/shiro.sql

起别名

select 字段1 as 字段1别名,字段2 as 字段2别名 from 表名 as 表别名