当前位置: 365bet亚洲官方投注 > 编程知识 > 正文

php生成UUID唯一序列的代码示例365bet亚洲官方投注

时间:2019-12-22 11:11来源:编程知识
gitHub地址: log4j.properties # Global logging configuration# 在开发环境下日志级别要设置成debug,生产环境设置成info或errorlog4j.rootLogger=debug, stdout#Console output...log4j.appender.stdout=org.apache.log4j.Conso

gitHub地址:

log4j.properties

# Global logging configuration
# 在开发环境下日志级别要设置成debug,生产环境设置成info或error
log4j.rootLogger=debug, stdout
#Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 

1、安装依赖

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理,事务控制由mybatis -->
            <transactionManager type="JDBC"/>
            <!-- 数据库连接池,由mybatis管理  -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="xxxx"/>
                <property name="password" value="xxxxxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>

</configuration>
/**
  * Generates an UUID
  *
  * @author     Anis uddin Ahmad 
  * @param      string  an optional prefix
  * @return     string  the formatted uuid
  */
  function uuid($prefix = '')
  {
    $chars = md5(uniqid(mt_rand(), true));
    $uuid  = substr($chars,0,8) . '-';
    $uuid .= substr($chars,8,4) . '-';
    $uuid .= substr($chars,12,4) . '-';
    $uuid .= substr($chars,16,4) . '-';
    $uuid .= substr($chars,20,12);
    return $prefix . $uuid;
  }  

//Example of using the function -
//Using without prefix.
echo uuid(); //Returns like ‘1225c695-cfb8-4ebb-aaaa-80da344e8352′   

//Using with prefix
echo uuid(‘urn:uuid:’);//Returns like ‘urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344e8352′
composer require emadadly/laravel-uuid

工程结构

365bet亚洲官方投注 1

注意:

1.这里要把config这个包设置为source包

365bet亚洲官方投注 2


否则无法加载包内的xml文件
2.讲一个我一开始遇到的问题,就是我在运行时报了一个isClosed() method is abstract的错误,在查遍全网都没有解决方案的时候,我试着重新下了一个mysql连接的jar包,问题就解决了,我推荐一个下载jar包的网站
http://www.java2s.com/Code/Jar/c/Downloadc3p0095pre4jar.htm

*************************************************************************************

2、然后在config/app.php的providers里添加ServiceProvider

1.根据用户id(主键)查询用户信息

也可以直接用sql语句生成如:
直接在insert语句中插入UUID作主键的用法(简便):
insert into Price( Name, UUID, Price, BID) values('FEIFEI_TEST', uuid(), 32, 3);

'providers' => [ ... EmadadlyLaravelUuidLaravelUuidServiceProvider::class, ],
映射文件

mapper代理开发映射文件命名:xxxMapper.xml
在映射文件中配置sql语句

@Test
    public void findUserByIdTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过sqlSession操作数据库
        //第一个参数:映射文件中statement的id,等于namespace+"."statement的id
        //第二个参数:指定映射文件中所匹配的parameterType类型的参数
        //sqlSession.selectOne结果是与映射文件中所匹配的resultType类型的对象
        User user = sqlSession.selectOne("test.findUserById",1);
        System.out.println(user);
        //释放资源
        sqlSession.close();
    }

User.xml原型

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊的重要作用
-->
<mapper namespace="test">
</mapper>

查询时的配置

<select id="findUserById" parameterType="int" resultType="com.TiHom.mybatis.po.User">
        select * from user where id=#{value}
    </select>

注意:

1.id:标识,映射文件中的sql,称为statement的id
2.paramType:指定输入参数的类型,如int、String等等
3.#{}表示一个占位符号
4.#{id}:其中的id表示接收输入的参数,参数名称是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
5.resultType:指定sql输出结果所映射的java对象类型,select指定resultType表示将单条记录映射成java对象

************************************************************************************

3、然后根目录执行

2.根据用户姓名进行模糊查询

@Test
    public void findUserByNameTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过sqlSession操作数据库
        //list中的user和映射文件中resultType所指定的类型一致
        List<User> userList = sqlSession.selectList("test.findUserByName","as");
        System.out.println(userList);
        sqlSession.close();
    }

    <select id="findUserByName" parameterType="java.lang.String" resultType="com.TiHom.mybatis.po.User">
        SELECT * FROM user WHERE username LIKE '%${value}%'
    </select>

注意:

1.#{}表示一个占位符,#{}接收输入的参数
2.${}表示一个拼接符号,会引用sql注入,所以不建议使用

php生成uuid 来表示唯一码

php artisan vendor:publish --provider="EmadadlyLaravelUuidLaravelUuidServiceProvider"

3.添加用户

<insert id="insertUser" parameterType="com.TiHom.mybatis.po.User">
        INSERT INTO user(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})
    </insert>

@Test
    public void insertUserTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setUsername("王小军");
        user.setBirthday(new Date());
        user.setSex("m");
        user.setAddress("广东");
        sqlSession.insert("test.insertUser",user);
        //提交事务
        sqlSession.commit();
        //关闭
        sqlSession.close();
    }

注意:

  1. #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 (pojo——>简单的JavaBean对象)

uuid是什么?guid是什么?php如何生成uuid?(google 搜索相关内容时使用uuid + mysql得到的结果较uuid+php要多些)

执行完的效果是:在config下生成uuid.php

4.删除用户

<delete id="deleteUser" parameterType="java.lang.Integer">
        DELETE FROM user WHERE id=#{id}
    </delete>

@Test
    public void deleteUserTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.delete("test.deleteUser",5);
        sqlSession.commit();
        sqlSession.close();
    }

这里有一篇关于UUID的说明 蛮详细

4、使用

5.更新用户

注意:

1.分析:
需要传入用户的id
需要传入用户的更新信息
parameterType指定user对象,包括id和更新信息,注意:id必存在
#{id}:从输入user对象中获取id属性值

<update id="updateUser" parameterType="com.TiHom.mybatis.po.User">
        UPDATE user SET username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} WHERE id=#{id}
    </update>

@Test
    public void updateUserTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setId(5);
        user.setUsername("lihua");
        user.setSex("m");
        user.setBirthday(new Date());
        user.setAddress("北京");
        sqlSession.update("test.updateUser",user);
        sqlSession.commit();
        sqlSession.close();
    }

主键id不使用uuid,新建一行储存uuid的列

6.总结:

1.selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)
2.selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne
3.#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashMap。如果你接收的是简单类型,#{}中可以写成value或者其他的名称

以下部分内容为转载:

在config/uuid.php

重点:

我唯一还算熟悉的数据库就 算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢?可能是自己做的 KeyGenerator,也可能是我们下面要说的UUID。

'default_uuid_column' => 'uuid',

自增主键的返回

1.mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚插入记录的自增主键 :LAST_INSERT_ID()
是在insert之后调用,修改insert配置

<insert id="insertUser" parameterType="com.TiHom.mybatis.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            <!--
            将插入数据的主键返回,返回到user对象中
            SELECT LAST_INDEX_ID():得到刚insert进去记录的主键值,只适用于自增主键
            keyProperty:将查询到的主键值设置到parameterType指定的对象的哪个属性
            order:执行顺序,相对insert语句来说
            resultType:指定结果的类型
            -->
            SELECT LAST_INDEX_ID()
        </selectKey>
        INSERT INTO user(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})
    </insert>

据说在Oracle的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。

主键id就直接使用uuid

非自增主键返回(使用uuid())

2.使用mysql的uuid()函数生成主键,需要修改表中id字段类型为String,长度类型设置为35位。

  • 执行思路:先通过uuid()查询到主键,将主键输入到sql语句中。执行uuid()语句顺序相对于insert语句之前执行。

那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。

在config/uuid.php中将uuid改成id

如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:

'default_uuid_column' => 'id',

mysql> select uuid();
+--------------------------------------+
| uuid()                               |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+

在migration中建表时:

现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。

Schema::create('sys_user', function  { $table->uuid; .... $table->timestamps;

优点:

在实体类如User.php中使用uuid,加入

能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

use Uuids; .... /** * Indicates if the IDs are auto-incrementing. * * @var bool */ public $incrementing = false;

缺点:

然后在Controller中在新增数据时id默认可以直接使用uuid

比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。

For Example:

下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨。至于说使用UUID后,URL 显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词, 仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下 面这个形式的:/order.php/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现 URL是/order.php/id/1000,晚上再下一个订单发现URL是/order.php/id/2000,那么我就可以估计出此网站一天的订 单数大致是1000左右,甚至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。

 public function store { $data = $request->json; $Article=Article::create; return response; }

效率?

修改自带的created_at和updated_at

如果上面说的UUID的所谓缺点都不成立的话,那么是否使用UUID做主键,唯一的问题就是效率了。据说在PostgreSQL等数据库里,都有专门的 UUID类型,在这样的数据库里,使用UUID做主键,效率没有任何问题,可惜在MySQL里没有这样的字段,如果想在MySQL里保存UUID做主键, 一般是使用CHAR(36)来模拟,因为不是一个原生的UUID类型,所以主键的效率到底如何有待测试,另外,UUID做主键的效率和UUID本身的算法 实现也有很大关系。

 const UPDATED_AT='update_date'; const CREATED_AT = 'create_date';

我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。

以上这篇Laravel自动生成UUID,从建表到使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

至于在MySQL上使用UUID(用char(36)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!!

如何生成UUID?下面这种方法生成的貌似不是UUID,因为MD5实际上是可能存在重复值的(参考

de> function uuid($prefix = '')

     {

     $chars = md5(uniqid(mt_rand(), true));

     $uuid     = substr($chars,0,8) . '-';

     $uuid .= substr($chars,8,4) . '-';

     $uuid .= substr($chars,12,4) . '-';

     $uuid .= substr($chars,16,4) . '-';

     $uuid .= substr($chars,20,12);

     return $prefix . $uuid;

     } de>

在mysql中插入uuid使用mysql的uuid()函数

INSERT INTO Table(id,..) VALUES( UUID(), ...)

当然也可以用 SELECT UUID() 先得到一个uuid值再插入进去

题外:

可能相比较使用整型做主键,效率稍差,
另外一个问题是可能导致URL太长,比如显示某个id下的分类时
通常这样category.php?cid=2 但是现在可能是category.php?uuid=a93f16c5-9634-102c-824f-3ea0651c5b77
是否能更改为整型做主键

版权声明:本文为博主原创文章,未经博主允许不得转载。


编辑:编程知识 本文来源:php生成UUID唯一序列的代码示例365bet亚洲官方投注

关键词: