JBarcode生成一维条形码工具

转自网络,工具类:import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.*;import java.util.ArrayList;import java.util.List;import org.jbarcode.JBarcode;import org.jbarcode.JBarcodeFactory;import org.jbarcode.encode.Code128Encoder;import org.jbarcode.encode.InvalidAtributeException;import org.jbarcode.paint.TextPainter;import org.jbarcode.util.ImageUtil;/** * Author: Cheng * Date: 2019/7/29 * Time: 15:11 * Description: No Description */public class JbarcodeUtil {    //设置条形码高度    private static final int BARCODE_HEIGHT = 40;    //设置条形码默认分辨率    private static final int BARCODE_DPI = ImageUtil.DEFAULT_DPI;    //设置条形码字体样式    private static final String FONT_FAMILY = "console";    //设置条形码字体大小    private static final int FONT_SIZE = 15;    //设置条形码文本    public static String TEXT = "";    //创建jbarcode    private static JBarcode jbc = null;    static JBarcode getJBarcode() throws InvalidAtributeException {        /**         * 参考设置样式:         *barcode.setEncoder(Code128Encoder.getInstance()); //设置编码         *barcode.setPainter(WidthCodedPainter.getInstance());// 设置Painter         *barcode.setTextPainter(BaseLineTextPainter.getInstance()); //设置TextPainter         *barcode.setBarHeight(17); //设置高度         *barcode.setWideRatio(Double.valueOf(30).doubleValue());// 设置宽度比率         *barcode.setXDimension(Double.valueOf(2).doubleValue()); // 设置尺寸,大小 密集程度         *barcode.setShowText(true); //是否显示文本         *barcode.setCheckDigit(true); //是否检查数字         *barcode.setShowCheckDigit(false); //是否显示检查数字         */        if (jbc == null) {            //生成code128            jbc = JBarcodeFactory.getInstance().createCode128();            jbc.setEncoder(Code128Encoder.getInstance());            jbc.setTextPainter(CustomTextPainter.getInstance());            jbc.setBarHeight(22);            jbc.setXDimension(Double.valueOf(0.8).doubleValue());            jbc.setShowText(false);        }        return jbc;    }    /**     * @descript:生成条形码文件     * @param message  条形码内容     * @param file   生成文件     */    public static void createBarcode(String message, File file,String text) {        try {            FileOutputStream fos = new FileOutputStream(file);            createBarcode(message, fos,text);            fos.close();        } catch (IOException e) {            throw new RuntimeException(e);        }    }    /**     * @descript:生成条形码并写入指定输出流     * @param message   条形码内容     * @param os   输出流     */    public static BufferedImage createBarcode(String message, OutputStream os,String text) {        try {            //设置条形码文本            TEXT=text;            //创建条形码的BufferedImage图像            BufferedImage image = getJBarcode().createBarcode(message);            ImageUtil.encodeAndWrite(image, ImageUtil.PNG, os, BARCODE_DPI, BARCODE_DPI);            os.flush();            return image;        } catch (Exception e) {            throw new RuntimeException(e);        }    }    /**     * 静态内部类     * 自定义的 TextPainter, 允许定义字体,大小,文本等     * 参考底层实现:BaseLineTextPainter.getInstance()     */    protected static class CustomTextPainter implements TextPainter {        private static CustomTextPainter instance =new CustomTextPainter();        public static CustomTextPainter getInstance() {            return instance;        }        @Override        public void paintText(BufferedImage barCodeImage, String text, int width) {            //绘图            Graphics g2d = barCodeImage.getGraphics();            //创建字体            Font font = new Font(FONT_FAMILY, Font.PLAIN, FONT_SIZE * width);            g2d.setFont(font);            FontMetrics fm = g2d.getFontMetrics();            int height = fm.getHeight();            int center = (barCodeImage.getWidth() - fm.stringWidth(text)) / 2;            g2d.setColor(Color.WHITE);            g2d.fillRect(0, 0, barCodeImage.getWidth(), barCodeImage.getHeight() * 1 / 20);            g2d.fillRect(0, barCodeImage.getHeight() - (height * 9 / 10), barCodeImage.getWidth(), (height * 9 / 10));            g2d.setColor(Color.BLACK);            //绘制文本            g2d.drawString(TEXT, 0, 145);            //绘制条形码            g2d.drawString(text, center, barCodeImage.getHeight() - (height / 10) - 2);        }    }    //测试    public static void main(String[] args) throws FileNotFoundException, IOException {        List<String> list=new ArrayList<String>();        list.add("KJ4.1-0127-0001");        list.add("KJ4.1-0128-0001");        list.add("KJ4.1-0129-0001");        list.add("KJ4.1-0130-0001");        if(list!=null && list.size()>0){            for(String message:list){                JbarcodeUtil.createBarcode(message, new File("D:\\pdf\\"+message+".png"),"苏交科");//                ByteArrayOutputStream os = new ByteArrayOutputStream();//                JbarcodeUtil.createBarcode(message,os,"苏交科");//                System.out.println(os);            }        }    }}这里我调用了上面的BufferedImage createBarcode(...)方法,返回图片类型使用在下列即可。在itext方法的单元格中加入二维码图片,其中cl2是其中一个单元格。            ByteArrayOutputStream barOut = new ByteArrayOutputStream();            ImageIO.write(codeImage, "png", barOut);            cl2.addElement(Image.getInstance(barOut.toByteArray())); //cl2为单元格

Oracle数据库入门教程与常用语法介绍

Oracle安装好后配置文件夹C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN中修改listener.ora文件,将HOST=后边字符改成本机ip地址或者本机的计算机名。# listener.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\listener.ora# Generated by Oracle configuration tools.SID_LIST_LISTENER =  (SID_LIST =    (SID_DESC =      (SID_NAME = PLSExtProc)      (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)      (PROGRAM = extproc)    )  )LISTENER =  (DESCRIPTION_LIST =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))      (ADDRESS = (PROTOCOL = TCP)(HOST = PC-7DE0D8D1)(PORT = 1521))    )  )同理修改tnsnames.ora# tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora# Generated by Oracle configuration tools.ORCL =  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = PC-7DE0D8D1)(PORT = 1521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = orcl)    )  )EXTPROC_CONNECTION_DATA =  (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))    )    (CONNECT_DATA =      (SID = PLSExtProc)      (PRESENTATION = RO)    )  )在计算机管理中启动下列两个服务PL/SQL登录oracle第一次登陆点取消,进去点Tools->Preference,设置instantclient的路径与oci登录Datebase例如:192.168.43.218:1521/orcl若想自动登陆,可将tnsnames.ora放在本地任意文件夹,例如我还是放在路径中,配置环境变量TNS_ADMIND:\java\instantclient_12_1Oracle简介数据库oracle数据库是物理储存,和mysql不同的是mysql中管理表的是数据库,而oracle是用户。实例一个 Oracle 实例(Oracle Instance)有一系列的后台进程(Backguound Processes)和内存结构(Memory Structures)组成。一个数据库可以有 n 个实例。用户用户是在实例下建立的。不同实例可以建相同名字的用户。表空间表空间是 Oracle 对物理数据库上相关数据文件(ORA 或者 DBF 文件)的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每 个数据库至少有一个表空间(称之为 system 表空间)。每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。数据文件(dbf、ora)数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。不同用户可以在同一个表空间建立同名表,因为它是根据用户管理的。具体SQL操作创建表空间create tablespace users --创建表空间datafile 'c:\users.dbf' --定义物理路径size 100m --定义大小autoextend on --大小超过100m自动扩容next 10m; --每次扩容大小创建的数据文件不能被删除,删除可先删除表空间再删除文件drop tablespace users创建用户--创建用户create user zhangsan --账号identified by mima --密码default tablespace users; --所属表空间用户授权connect--连接角色,基本角色resource--开发者角色dba--超级管理员角色grant dba to zhangsan; --给张三授予dba角色在管理员账号执行数据类型Varchar, varchar2 表示一个字符串NUMBER NUMBER(n)表示一个整数,长度是 nNUMBER(m,n):表示一个小数,总长度是 m,小数是 n,整数是 m-nDATA 表示日期类型CLOB 大对象,表示大文本数据类型,可存 4GBLOB 大对象,表示二进制数据,可存 4G创建修改表及增删改查---创建一个person表create table person(       pid number(20),       pname varchar2(10));---修改表结构---添加一列alter table person add (gender number(1));---修改列类型alter table person modify gender char(1);---修改列名称alter table person rename column gender to sex;---删除一列alter table person drop column sex;---查询表中记录select * from person;----添加一条记录insert into person (pid, pname) values (1, '小明');commit;----修改一条记录update person set pname = '小马' where pid = 1;commit;----三个删除--删除表中全部记录delete from person;--删除表结构drop table person;--先删除表,再次创建表。效果等同于删除表中全部记录。--在数据量大的情况下,尤其在表中带有索引的情况下,该操作效率高。--索引可以提供查询效率,但是会影响增删改效率。truncate table person;增删改记得提交commit,rollback回滚用序列完成ID自增Oracle不像mysql等数据库有自增列,实现主键id自增可以用数列实现。----序列不真的属于任何一张表,但是可以逻辑和表做绑定。----序列:默认从1开始,依次递增,主要用来给主键赋值使用。----dual:虚表,只是为了补全语法,没有任何意义。create sequence s_person;select s_person.nextval from dual;----添加一条记录insert into person (pid, pname) values (s_person.nextval, '小明');commit;select * from person;select seqpersonid.nextval from dual;select seqpersonid.currval from dual;第一次执行,先执行next才能使用currval 查到当前数据初学者Scott用户scott用户内包含一些简单的示例表,方便学习,使用前先用管理员账号解锁该用户。----scott用户,密码tiger。--解锁scott用户alter user scott account unlock;--解锁scott用户的密码【此句也可以用来重置密码】alter user scott identified by tiger;--切换到scott用户下单行函数--单行函数:作用于一行,返回一个值。---字符函数select upper('yes') from dual;--YESselect lower('YES') from dual;--yes----数值函数select round(56.16, -2) from dual;---四舍五入,后面的参数表示保留的位数,正数往后面余,负数往前面,例如上句舍后为100select trunc(56.16, -1) from dual;---直接截取,不在看后面位数的数字是否大于5.select mod(10, 3) from dual;---求余数----日期函数----查询出emp表中所有员工入职距离现在几天。select sysdate-e.hiredate from emp e;----算出明天此刻select sysdate+1 from dual;----查询出emp表中所有员工入职距离现在几月。select months_between(sysdate,e.hiredate) from emp e;----查询出emp表中所有员工入职距离现在几年。select months_between(sysdate,e.hiredate)/12 from emp e;----查询出emp表中所有员工入职距离现在几周。select round((sysdate-e.hiredate)/7) from emp e;----转换函数---日期转字符串 fm去除时间显示中填充0 例如下列 2019-7-28 1:1:1select to_char(sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual;---字符串转日期select to_date('2018-6-7 16:39:50', 'fm yyyy-mm-dd hh24:mi:ss') from dual;----通用函数 nvl可排除null值 给null指定默认值---算出emp表中所有员工的年薪 ----奖金里面有null值,如果null值和任意数字做算术运算,结果都是null。select e.sal*12+nvl(e.comm, 0) from emp e;条件表达式虽然oracle专用写法更简单,但建议写通用的。---条件表达式的通用写法,mysql和oracle通用---给emp表中员工起中文名 下列else可以省略select e.ename,        case e.ename         when 'SMITH' then '曹贼'           when 'ALLEN' then '大耳贼'             when 'WARD' then '诸葛小儿'               --else '无名'                 endfrom emp e;---判断emp表中员工工资,如果高于3000显示高收入,如果高于1500低于3000显示中等收入,-----其余显示低收入select e.sal,        case          when e.sal>3000 then '高收入'           when e.sal>1500 then '中等收入'               else '低收入'                 endfrom emp e;----oracle中除了起别名,都用单引号。别名只能加双引号或不加引号。----oracle专用条件表达式select e.ename,         decode(e.ename,          'SMITH',  '曹贼',            'ALLEN',  '大耳贼',              'WARD',  '诸葛小儿',                '无名') "中文名"             from emp e;多行/分组函数注意:与MySQL不同的是,Oracle中group by后面出现的列才能在select上写,而不是可以select *显示所有列字段--多行函数【聚合函数】:作用于多行,返回一个值。--count(*)底层就是count(1)select count(1) from emp;---查询总数量select sum(sal) from emp;---工资总和select max(sal) from emp;---最大工资select min(sal) from emp;---最低工资select avg(sal) from emp;---平均工资---分组查询---查询出每个部门的平均工资---分组查询中,出现在group by后面的原始列,才能出现在select后面---没有出现在group by后面的列,想在select后面,必须加上聚合函数。---聚合函数有一个特性,可以把多行记录变成一个值。select e.deptno, avg(e.sal)--, e.enamefrom emp egroup by e.deptno;---查询出平均工资高于2000的部门信息select e.deptno, avg(e.sal) asalfrom emp egroup by e.deptnohaving avg(e.sal)>2000;---所有条件都不能使用别名来判断。--比如下面的条件语句也不能使用别名当条件select ename, sal s from emp where sal>1500;---查询出每个部门工资高于800的员工的平均工资---条件无论是where还是having都不能用别名select e.deptno, avg(e.sal) asalfrom emp ewhere e.sal>800group by e.deptno;----where是过滤分组前的数据,having是过滤分组后的数据。---表现形式:where必须在group by之前,having是在group by之后。---查询出每个部门工资高于800的员工的平均工资---然后再查询出平均工资高于2000的部门select e.deptno, avg(e.sal) asalfrom emp ewhere e.sal>800group by e.deptnohaving avg(e.sal)>2000;多表查询---笛卡尔积select *from emp e, dept d;---等值连接(推荐)select *from emp e, dept dwhere e.deptno=d.deptno;---内连接 与等值连接相同select *from emp e inner join dept don e.deptno = d.deptno;---查询出所有部门,以及部门下的员工信息。【外连接】select *from emp e right join dept don e.deptno=d.deptno;---查询所有员工信息,以及员工所属部门select *from emp e left join dept don e.deptno=d.deptno;---oracle中专用外连接 例如下列等于上方right joinselect *from emp e, dept dwhere e.deptno(+) = d.deptno;---还是以前建议,能用通用就别用专用自连接select * from emp;---查询出员工姓名,员工领导姓名---自连接:自连接其实就是站在不同的角度把一张表看成多张表。select e1.ename, e2.enamefrom emp e1, emp e2where e1.mgr = e2.empno;------查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称select e1.ename, d1.dname, e2.ename, d2.dnamefrom emp e1, emp e2, dept d1, dept d2where e1.mgr = e2.empnoand e1.deptno=d1.deptnoand e2.deptno=d2.deptno;子查询---子查询返回一个值---查询出工资和SCOTT一样的员工信息select * from emp where sal in(select sal from emp where ename = 'SCOTT')---子查询返回一个集合---查询出工资和10号部门任意员工一样的员工信息select * from emp where sal in(select sal from emp where deptno = 10);---子查询返回一张表---查询出每个部门最低工资,和最低工资员工姓名,和该员工所在部门名称---1,先查询出每个部门最低工资select deptno, min(sal) msalfrom emp group by deptno;---2,三表联查,得到最终结果。select t.deptno, t.msal, e.ename, d.dnamefrom (select deptno, min(sal) msal      from emp       group by deptno) t, emp e, dept dwhere t.deptno = e.deptnoand t.msal = e.saland e.deptno = d.deptno;分页查询----oracle中的分页---rownum行号:当我们做select操作的时候,--每查询出一行记录,就会在该行上加上一个行号,--行号从1开始,依次递增,不能跳着走。----排序操作会影响rownum的顺序select rownum, e.* from emp e order by e.sal desc----如果涉及到排序,但是还要使用rownum的话,我们可以再次嵌套查询。select rownum, t.* from(select rownum, e.* from emp e order by e.sal desc) t;----emp表工资倒叙排列后,每页五条记录,查询第二页。----rownum行号不能写上大于一个正数。select * from(    select rownum rn, tt.* from(          select * from emp order by sal desc    ) tt where rownum<11) where rn>5改成mybatis形式解读select * from(    select rownum rn, tt.* from(                 SELECT * FROM TYD) tt where rownum<=10  --size*page) where rn>5  --SIZE*(page-1)另一种写法(不推荐,做order by操作不能用)select * from (select rownum r ,emp.* from emp) bwhere b.r >5 and b.r <11Mybatis分页SELECT *FROM (SELECT tb.*, ROWNUM ROW_IDFROM (...) tbWHERE ROWNUM <![CDATA[<=]]> #{page} * #{rows})WHERE ROW_ID <![CDATA[>]]> (#{page} - 1) * #{rows}

Oracle数据库入门教程与常用语法介绍