Java web开发


前言

我将使用MyBits+Tomcat+Severlet开发1个图书管理系统,以熟悉Java Web开发过程。

一、Project Lombok

在编写Java项目时,尤其想要对类私有字段进行操作时,需要在类中定义大量的set/get方法,即使是IDEAR可以自动生产,也会使代码变得不简洁。

而使用Lombok+注解就可以很优雅地解决代码冗余的问题;

Lombok在javac进行编译的时候,根据代码的注解,对原代码进行代码添加从而产生新的代码被编译。

1.下载Lombok JAR包

首先我们需要去Lombok官网下载它的JAR包。

2.IDEAR下载Lombok插件

3.@AllArgsConstructor

package com.test;


import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@AllArgsConstructor //生成带所有属性的构造器方法  //Student student = new Student(100, "小根", "男"
@NoArgsConstructor(staticName = "create")  //Student student1 = Student.create();
public class Student {
    Integer sid;
    String name;
    String sex;
}

4.@Getter 和@Setter注解

package com.test;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Accessors(chain = true) //对象支持链式操作
@Setter                //自动生成所有字段的set方法
@Getter              //自动生成所有字段的get方法
@AllArgsConstructor    //自动生成带所有字段参数的构造方法 new Student(1, "张根", true);
class Student {
    Integer sid;
    String name;
    @Getter(AccessLevel.PRIVATE) //设置Pricate属性
    boolean sex;
}

5.@ToString注解

package com.test;

import lombok.*;
import lombok.experimental.Accessors;

@ToString(includeFieldNames = false, exclude = {"sex"})
@Setter                //自动生成所有字段的set方法
@Getter              //自动生成所有字段的get方法
@AllArgsConstructor
        //自动生成带所有字段参数的构造方法 new Student(1, "张根", true);
class Student {
//    @ToString.Include(rank = 1)
    Integer sid;
    String name;
    boolean sex;
}

6.@EqualsAndHashCode注解

package com.test;

import lombok.*;
import lombok.experimental.Accessors;

@EqualsAndHashCode //重写Equals和HashCode方法
@ToString
@AllArgsConstructor
class Student {
    Integer sid;
    String name;
    boolean sex;
}

7.@Data

 代表设置了@Setter、@Getter、.@EqualsAndHashCode、@ToString所有注解,一旦使用@Data注解就不建议此类有继承关系。

package com.test;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data  //代表设置了@Setter、@Getter、.@EqualsAndHashCode、@ToString所有注解
public class Student {
    Integer sid;
    String name;
    String sex;
}

8.@Value 

@Value注解与@Data注解类似,但是并不会生成@Setter,所有成员属性都是final的。

@Value //
public class Student {
    Integer sid;
    String name;
    Strin

9.@SneakyThrows和@Cleanup

package com.test;

import lombok.Cleanup;
import lombok.SneakyThrows;

import java.io.FileInputStream;
import java.io.InputStream;

public class Main {

    @SneakyThrows  //自动生成TryCatcj语句块
    public static void main(String[] args) {
        @Cleanup //自动调用Close方法
        InputStream inputStream = new FileInputStream("lombok.jar");
    }
}

10.@Builder

package com.test;


import lombok.*;

@Builder    //Student.StudentBuilder student = Student.builder().sid(1).name("小根").sex("男");
public class Student {
    Integer sid;
    String name;
    String sex;
}

二、MyBatis

MyBatis是Java中1个半自动化的ORM框架;

1.初识MyBatis

 MyBatis配置文件

<?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">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.0.98:3306/zhanggen"/>
                <property name="username" value="weike"/>
                <property name="password" value="weike@123"/>
            dataSource>
        environment>
    environments>
    <mappers>
        <mapper url="file:conf/staffMapper.xml"/>
    mappers>
configuration>
mybatis-config.xml

mapper(映射器)配置文件

<?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">
<mapper namespace="staffMapper1">
    <select id="selectStaff" resultType="com.test.entity.Staffs">
    select * from staffs;
  select>
    <select id="selectOne" resultType="com.test.entity.Staffs">
    select * from staffs where id= #{id};
  select>
mapper>
staffMapper.xml

映射类

package com.test.entity;

import lombok.Data;

@Data
public class Staffs {
    String username;
    Integer age;
    double salary;
}

操作数据库

package com.test;

import com.sun.xml.internal.ws.api.message.HeaderList;
import com.test.entity.Staffs;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) throws Exception {
        //读取数据库配置文件,创建1个数据连接工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("./conf/mybatis-config.xml"));
        //打开1个Sessio开启SQL自动提交
        try (SqlSession session = sqlSessionFactory.openSession(true);) {
            //查询列表
            List staffList = session.selectList("selectStaff");
            staffList.forEach(System.out::println);
            //查询单条数据
            Staffs staff2 = session.selectOne("selectOne", 2);
            System.out.println(staff2.getUsername());
        }


    }
}

2.Mybatis配置文件

注意Mybatis的配置项是有先后顺序的;

<?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>
    
    <typeAliases>
        <typeAlias alias="Staff" type="com.test.entity.Staffs"/>
    typeAliases>
    
    <environments default="development">
        <environment id="development">
            
            <transactionManager type="JDBC"/>
            
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.0.98:3306/zhanggen"/>
                <property name="username" value="weike"/>
                <property name="password" value="weike@123"/>
                
                
                <property name="poolMaximumActiveConnections" value="300"/>
                
                <property name="poolMaximumIdleConnections" value="0"/>
                
                <property name="poolMaximumCheckoutTime" value="20000"/>
                
                <property name="poolTimeToWait" value="20000"/>
                
                <property name="poolPingEnabled" value="true"/>
                
                <property name="poolPingConnectionsNotUsedFor" value="3600000"/>
                
                <property name="poolPingQuery" value="select 1"/>
                
            dataSource>
        environment>
    environments>
    <mappers>
        
        <mapper resource="com/test/mapper/staffMapper.xml"/>
    mappers>
configuration>

3.基本增删改查

映射器配置文件

<?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">

<mapper namespace="com.test.mapper.MyMapper">
    
    <resultMap id="staffMap1" type="Staff555">
        <result column="username" property="username"/>
        <result column="age" property="age"/>
        <result column="salary" property="salary"/>
    resultMap>
    


    <select id="selectStaff" resultMap="staffMap1">
          select * from staffs;
    select>
    <select id="selectOne" resultMap="staffMap1">
         select * from staffs where id= #{id};
    select>

    <insert id="addStaff">
        insert into staffs(username, age, salary) values (#{username},#{age},#{salary})
    insert>
    <update id="updateStaff">
        UPDATE staffs
          SET username=#{username},age=#{age},salary=#{salary}
        WHERE id=#{id};
    update>

    <delete id="deleteStaff">
        delete from staffs where id=#{id};
    delete>
mapper>

映射器配置接口

package com.test.mapper;

import com.test.entity.Staffs;

import java.util.List;

public interface MyMapper {
    List selectStaff();

    Staffs selectOne(Integer id);

    Integer addStaff(Staffs staff);

    Integer updateStaff(Staffs staff);

    Integer deleteStaff(int id);

}

映射器配置类

package com.test.entity;

import lombok.Data;

@Data
public class Staffs {
    Integer id;
    String username;
    Integer age;
    double salary;
}

操作数据库

package com.test;

import com.sun.xml.internal.ws.api.message.HeaderList;
import com.test.entity.Staffs;
import com.test.mapper.MyMapper;
import org.apache.ibatis.io.ResolverUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) throws Exception {
        try (SqlSession session = MybatisUtil.getsession(true)) {
            //1.查询多条记录
            MyMapper mapper = session.getMapper(MyMapper.class);
            mapper.selectStaff().forEach(System.out::println);

            //2.查询单条记录
            System.out.println(mapper.selectOne(2).getUsername());

            //3.增加
            Staffs newStaff = new Staffs();
            newStaff.setUsername("张大千1");
            newStaff.setAge(181);
            newStaff.setSalary(111.1);
            System.out.println(mapper.addStaff(newStaff));

            //4.删除数据
            mapper.deleteStaff(27);

            //5.修改数据
            Staffs updateStaff = new Staffs();
            updateStaff.setUsername("张大千");
            updateStaff.setSalary(122.3);
            updateStaff.setAge(122);
            updateStaff.setId(2);
            mapper.updateStaff(updateStaff);


        }

    }
}

参考