添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Partner – Jmix Haulmont – NPI EA (cat= Architecture)
announcement - icon

Building or modernizing a Java enterprise web app has always been a long process, historically. Not even remotely quick.

That's the main goal of Jmix is to make the process quick without losing flexibility - with the open-source RAD platform enabling fast development of business applications.

Critically, it has very minimal impact on your server's performance, with most of the profiling work done separately - so it needs no server changes, agents or separate services.

Simply put, a single Java or Kotlin developer can now quickly implement an entire modular feature, from DB schema, data model, fine-grained access control, business logic, BPM, all the way to the UI.

Jmix supports both developer experiences – visual tools and coding , and a host of super useful plugins as well:

>> Try out Jmix

Partner – AEGIK AB – NPI EA (tag = SQL)
announcement - icon

Slow MySQL query performance is all too common. Of course it is. A good way to go is, naturally, a dedicated profiler that actually understands the ins and outs of MySQL.

The Jet Profiler was built for MySQL only , so it can do things like real-time query performance, focus on most used tables or most frequent queries, quickly identify performance issues and basically help you optimize your queries.

Critically, it has very minimal impact on your server's performance, with most of the profiling work done separately - so it needs no server changes, agents or separate services.

Basically, you install the desktop application, connect to your MySQL server , hit the record button, and you'll have results within minutes:

out the Profiler

Partner – DBSchema – NPI EA (tag = SQL)
announcement - icon

DbSchema is a super-flexible database designer, which can take you from designing the DB with your team all the way to safely deploying the schema .

The way it does all of that is by using a design model , a database-independent image of the schema, which can be shared in a team using GIT and compared or deployed on to any database.

And, of course, it can be heavily visual, allowing you to interact with the database using diagrams, visually compose queries, explore the data, generate random data, import data or build HTML5 database reports.

Take a look at DBSchema

Partner – CAST AI – NPI EA (tag = kubernetes)
announcement - icon

The Kubernetes ecosystem is huge and quite complex, so it’s easy to forget about costs when trying out all of the exciting tools.

To avoid overspending on your Kubernetes cluster, definitely have a look at the free K8s cost monitoring tool from the automation platform CAST AI. You can view your costs in real time, allocate them, calculate burn rates for projects, spot anomalies or spikes, and get insightful reports you can share with your team.

Connect your cluster and start monitoring your K8s costs right away:

Kubernetes cost monitoring

Course – LS – All

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Introduction

In this quick tutorial, we'll introduce OpenCSV 4, a fantastic library for writing, reading, serializing, deserializing, and/or parsing .csv files. Then we'll go through several examples demonstrating how to set up and use OpenCSV 4 for our endeavors.

2. Set Up

First, we'll add OpenCSV to our project by way of a pom.xml dependency:

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>4.1</version>
</dependency>

The .jars for OpenCSV can be found at the official site or through a quick search at the Maven Repository.

Our .csv file will be really simple; we'll keep it to two columns and four rows:

colA,colB

3. To Bean or Not to Bean

After adding OpenCSV to our pom.xml, we can implement CSV-handling methods in two convenient ways:

  • using the handy CSVReader and CSVWriter objects (for simpler operations)
  • using CsvToBean to convert .csv files into beans (which are implemented as annotated plain-old-java-objects)
  • We'll stick with synchronous (or blocking) examples for this article, so we can focus on the basics.

    Remember, a synchronous method will prevent surrounding or subsequent code from executing until it's done. Production environments will likely use asynchronous (or non-blocking) methods that will allow other processes or methods to complete while the asynchronous method finishes up.

    We'll dive into asynchronous examples for OpenCSV in a future article.

    3.1. The CSVReader

    Let's explore CSVReader through the supplied readAll() and readNext() methods. We'll look at how to use readAll() synchronously:

    public List<String[]> readAllLines(Path filePath) throws Exception {
        try (Reader reader = Files.newBufferedReader(filePath)) {
            try (CSVReader csvReader = new CSVReader(reader)) {
                return csvReader.readAll();
    

    Then we can call that method by passing in a file Path:

    public List<String[]> readAllExample() throws Exception {
        Path path = Paths.get(
          ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())
        return CsvReaderExamples.readAllLines(path);
    

    Similarly, we can abstract readNext(), which reads a supplied .csv line by line:

    public List<String[]> readLineByLine(Path filePath) throws Exception {
        List<String[]> list = new ArrayList<>();
        try (Reader reader = Files.newBufferedReader(filePath)) {
            try (CSVReader csvReader = new CSVReader(reader)) {
                String[] line;
                while ((line = csvReader.readNext()) != null) {
                    list.add(line);
        return list;
    

    Finally, we can call that method here by passing in a file Path:

    public List<String[]> readLineByLineExample() throws Exception {
        Path path = Paths.get(
          ClassLoader.getSystemResource("csv/twoColumn.csv").toURI())
        return CsvReaderExamples.readLineByLine(path);
    

    Alternatively, for greater flexibility and configuration options, we can use CSVReaderBuilder:

    CSVParser parser = new CSVParserBuilder()
        .withSeparator(',')
        .withIgnoreQuotations(true)
        .build();
    CSVReader csvReader = new CSVReaderBuilder(reader)
        .withSkipLines(0)
        .withCSVParser(parser)
        .build();

    CSVReaderBuilder allows us to skip the column headings and set parsing rules through CSVParserBuilder.

    Using CSVParserBuilder, we can choose a custom column separator, ignore or handle quotations marks, state how we'll handle null fields, and how we'll interpret escaped characters. For more information on these configuration settings, please refer to the official specification docs.

    As always, we need to remember to close all our Readers to prevent memory leaks.

    3.2. The CSVWriter

    CSVWriter similarly supplies the ability to write to a .csv file all at once or line by line.

    Let's see how to write to a .csv line by line:

    public String writeLineByLine(List<String[]> lines, Path path) throws Exception {
        try (CSVWriter writer = new CSVWriter(new FileWriter(path.toString()))) {
            for (String[] line : lines) {
                writer.writeNext(array);
        return Helpers.readFile(path);
    

    Then we'll specify where we want to save that file, and call the method we just wrote:

    public String writeLinebylineExample() throws Exception {
        Path path = Paths.get(
          ClassLoader.getSystemResource("csv/writtenOneByOne.csv").toURI()
        return CsvWriterExamples.writeLineByLine(Helpers.fourColumnCsvString(), path); 
    

    We can also write our .csv all at once by passing in a List of String arrays representing the rows of our .csv:

    public String writeAllLines(List<String[]> lines, Path path) throws Exception {
        try (CSVWriter writer = new CSVWriter(new FileWriter(path.toString()))) {
            writer.writeAll(stringArray);
        return Helpers.readFile(path);
    

    Finally, here's how we call it:

    public String writeAllExample() throws Exception {
        Path path = Paths.get(
          ClassLoader.getSystemResource("csv/writtenAll.csv").toURI()
        return CsvWriterExamples.writeAllLines(Helpers.fourColumnCsvString(), path);
    

    3.3. Bean-Based Reading

    OpenCSV is able to serialize .csv files into preset and reusable schemas implemented as annotated Java pojo beans. CsvToBean is constructed using CsvToBeanBuilder. As of OpenCSV 4, CsvToBeanBuilder is the recommended way to work with com.opencsv.bean.CsvToBean.

    Here's a simple bean we can use to serialize our two-column .csv from earlier:

    public class SimplePositionBean  {
        @CsvBindByPosition(position = 0)
        private String exampleColOne;
        @CsvBindByPosition(position = 1)
        private String exampleColTwo;
        // getters and setters
    

    Each column in the .csv file is associated with a field in the bean. We can perform the mappings between .csv column headings using the @CsvBindByPosition or the @CsvBindByName annotations, which specify a mapping by position or heading string match, respectively.

    First, we'll create a superclass called CsvBean, which will allow us to reuse and generalize the methods we'll build below:

    public class CsvBean { }

    Here's an example child class:

    public class NamedColumnBean extends CsvBean {
        @CsvBindByName(column = "name")
        private String name;
        // Automatically infer column name as 'Age'
        @CsvBindByName
        private int age;
        // getters and setters
    

    Next, we'll abstract a synchronously returned List using the CsvToBean:

    public List<CsvBean> beanBuilderExample(Path path, Class clazz) throws Exception {
        CsvTransfer csvTransfer = new CsvTransfer();
        try (Reader reader = Files.newBufferedReader(path)) {
            CsvToBean<CsvBean> cb = new CsvToBeanBuilder<CsvBean>(reader)
             .withType(clazz)
             .build();
            csvTransfer.setCsvList(cb.parse());
        return csvTransfer.getCsvList();
    

    Then we pass in our bean (clazz) and in doing so, we associate the fields of our beans with the respective columns of our .csv rows.

    We can call that here using the SimplePositionBean subclass of the CsvBean we wrote above:

    public List<CsvBean> simplePositionBeanExample() throws Exception {
        Path path = Paths.get(
          ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()); 
        return BeanExamples.beanBuilderExample(path, SimplePositionBean.class); 
    

    We can also call it here using the NamedColumnBean, another subclass of the CsvBean:

    public List<CsvBean> namedColumnBeanExample() throws Exception {
        Path path = Paths.get(
          ClassLoader.getSystemResource("csv/namedColumn.csv").toURI()); 
        return BeanExamples.beanBuilderExample(path, NamedColumnBean.class);
    

    3.4. Bean-Based Writing

    Finally, let's take a look at how to use the StatefulBeanToCsv class to write to a .csv file:

    public String writeCsvFromBean(Path path) throws Exception {
        List<CsvBean> sampleData = Arrays.asList(
            new WriteExampleBean("Test1", "sfdsf", "fdfd"),
            new WriteExampleBean("Test2", "ipso", "facto")
        try (Writer writer  = new FileWriter(path.toString())) {
            StatefulBeanToCsv<CsvBean> sbc = new StatefulBeanToCsvBuilder<CsvBean>(writer)
              .withQuotechar('\'')
              .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
              .build();
            sbc.write(sampleData);
        return Helpers.readFile(path);
    

    Here we're specifying how we'll delimit and quote our data, which is supplied as a List of specified CsvBean objects.

    We can then call our method writeCsvFromBean() after passing in the desired output file path:

    public String writeCsvFromBeanExample() {
        Path path = Paths.get(
          ClassLoader.getSystemResource("csv/writtenBean.csv").toURI()); 
        return BeanExamples.writeCsvFromBean(path); 
    

    4. Conclusion

    In this brief article, we discussed synchronous code examples for OpenCSV using beans, CSVReader, and CSVWriter. For more information, check out the official docs here.

    As always, the code samples are provided over on GitHub.

    Course – LS – All

    Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

    >> CHECK OUT THE COURSE
    res – REST with Spring (eBook) (everywhere)