IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring boot + mybatis + maven 构建新工程 -> 正文阅读

[Java知识库]spring boot + mybatis + maven 构建新工程

前言

? ? ? ? 公司转型,新项目需要用java作为老员工,也只能转型了 ,最近开始重新捡起java 多年不碰了新构架新的开始。至少 jdbc hss? 还会? 学一下新框架 spring boot, mybatis 吧, maven 是真好用啊。

一.工程建立。

使用 Spring Initializr工具直接建立。

?springboot 依赖库 我选择Lombok ,DevTools,SpringWeb,MybatisFrameWork,MS SQL Server。等

Lombok 可以减少 beans? 的 代码量。数据库持久层 用Mybatis 没用?Hibernate, 尝尝鲜, 电脑上装了MSSQLServer 就用这吧 懒得装mysql 了 而且说实话 sqlserver 确实比 mysql 效率高。数据量超过千万量级后 mysql 明显比不过 mssqlserver了 不知道是不是我 mysql 理解的不够透彻导致的。

三.框架目录结构

这里包括了 控制层controller,持久层pojo,dao层mapper,业务逻辑层service,通用工具utils

四.pom文件中添加依赖和插件。

添加一下 mybatis 的驱动依赖

        <!--  mybatis 驱动  -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>

既然使用了mybatis 那就直接添加 mybatis.generator 这个插件 可以自动生成相关映射文件。化繁为简吗,手撕代码很烦的。当然生成后可以加工美化一下。自动生成的代码有点冗长。

      <build>
        <plugins>     
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>

                <dependencies>
                    <dependency>
                        <groupId>com.microsoft.sqlserver</groupId>
                        <artifactId>mssql-jdbc</artifactId>
                        <version>10.2.1.jre8</version>
                    </dependency>
                </dependencies>
                <!--指定配置文件位置-->
                <configuration>
                    <configurationFile>./src/main/resources/generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
    </build>

这里可以在configuration标签里指定一下 generator配置文件位置。否则无法使用插件

下面配置一下?generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="MysqlTables" targetRuntime="MyBatis3"  defaultModelType="flat">
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8" />
        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter" />
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter" />
        <!--beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,例如:ORACLE使用双引号,MYSQL默认是`反引号; -->
        <property name="beginningDelimiter" value="`" />
        <property name="endingDelimiter" value="`" />
        <!-- lombok插件,減少生成代碼 -->

        <!-- 使用自带序列化插件 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressDate" value="true" />
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 数据库链接配置 -->
        <jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                        connectionURL="jdbc:sqlserver://192.168.8.66:1433;DatabaseName=IotCard;integratedSecurity=false;encrypt=false;trustServerCertificate=false"
                        userId="sa" password="******">
        </jdbcConnection>

        <!-- 实体类生成未知 -->
        <javaModelGenerator
                targetPackage="com.cliot.pojo" targetProject="./src/main/java/">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- mapping文件生成位置 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="./src/main/resources/">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- dao接口生成位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.cliot.mapper" targetProject="./src/main/java/">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 表配置 tableName 表名 domainObjectName java类名,首字母必须大写,否则报字符串越界错误 -->
        <table tableName="cardinfo" domainObjectName="CardInfo"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
        <table tableName="card_pooled_monthly_usage" domainObjectName="CardPooledMonthlyUsage"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
        <table tableName="card_pooled_12month_usage" domainObjectName="CardPooled12MonthUsage"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

配置一下数据库驱动,连接字符串 用户名密码等,配置一下 mapper dao接口生成路径,mapper.xml文件生成路劲 pojo 映射文件生成路劲等 ,根据自己的时间需求配置把。

然后配置一下 数据库表的信息,完成

五. 生成mybatis映射文件。

点击生成文件?

?

?啊文件生成了

我们来看看

不错不错方便 真想。 看看代码吧

?不看了 反正能用就行,为了避坑 我们还是需要对代码加工一下。就是加几个注释。

?

package com.cliot.mapper;

import com.cliot.pojo.CardInfo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Repository
@Mapper
public interface CardInfoMapper {
    int deleteByPrimaryKey(Long cardId);

    int insert(CardInfo record);

    int insertSelective(CardInfo record);

    CardInfo selectByPrimaryKey(Long cardId);

    int updateByPrimaryKeySelective(CardInfo record);

    int updateByPrimaryKey(CardInfo record);
}

?在 mapper接口文件上加入 @Repository 和@Mapper? 可以让springboot方便扫描到映射文件可以自动装载。踩过的坑还是要提一嘴。

哦 还有要在启动函数上加注释? ,@Mapperscan(“******”) ,可以让容器自动注入 mapper免得后面报红 说找不到 映射文件。

?六.配置springboot 配置文件

不多说了直接上文件了。大家都看得懂。

spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.username=sa
spring.datasource.password=******
spring.datasource.url=jdbc:sqlserver://192.168.8.66:1433;DatabaseName=IotCard;integratedSecurity=false;encrypt=false;trustServerCertificate=false

spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=60
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name= DatebookHikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout= 15000
spring.datasource.hikari.connection-test-query: SELECT 1

mybatis.mapper-locations= classpath:mapper/*.xml
mybatis.type-aliases-package=com.cliot.pojo

这里设置了 数据源参数,连接池参数 ,持久层mapper的存放地址 映射文件pojo的映射文件等

懂得都懂 不懂得 度娘一下都懂了 就不一一赘述了。

七.测试是否成功

建立测试的controller类

package com.cliot.controller;

import com.cliot.pojo.CardPooledMonthlyUsage;
import com.cliot.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class TestController {
    @Autowired
    TestService testService;
    @RequestMapping("/")
    @ResponseBody
    public List<CardPooledMonthlyUsage> test() throws Exception {
        List<CardPooledMonthlyUsage> cards=testService.queryCard();
        return cards;
    }
}

?建立service类处理业务逻辑

package com.cliot.service;

import com.cliot.mapper.CardPooledMonthlyUsageMapper;
import com.cliot.pojo.CardPooledMonthlyUsage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestService {

    @Autowired
    CardPooledMonthlyUsageMapper monthlyUsageMapper;

    public List<CardPooledMonthlyUsage> queryCard() {
        return monthlyUsageMapper.queryAll();
    }

}

修改 dao层 mapper文件 增加测试 的sql 处理语句。

?

<?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.cliot.mapper.CardPooledMonthlyUsageMapper">
  <resultMap id="BaseResultMap" type="com.cliot.pojo.CardPooledMonthlyUsage">
    <id column="usage_id" jdbcType="BIGINT" property="usageId" />
    <result column="card_id" jdbcType="BIGINT" property="cardId" />
    <result column="iccid" jdbcType="NVARCHAR" property="iccid" />
    <result column="used_flow" jdbcType="DOUBLE" property="usedFlow" />
    <result column="usage_month" jdbcType="NVARCHAR" property="usageMonth" />
    <result column="DESC_CNT" jdbcType="NVARCHAR" property="descCnt" />
  </resultMap>
  <sql id="Base_Column_List">
    usage_id, card_id, iccid, used_flow, usage_month, DESC_CNT
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from card_pooled_monthly_usage
    where usage_id = #{usageId,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    delete from card_pooled_monthly_usage
    where usage_id = #{usageId,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.cliot.pojo.CardPooledMonthlyUsage">
    insert into card_pooled_monthly_usage (usage_id, card_id, iccid, 
      used_flow, usage_month, DESC_CNT
      )
    values (#{usageId,jdbcType=BIGINT}, #{cardId,jdbcType=BIGINT}, #{iccid,jdbcType=NVARCHAR}, 
      #{usedFlow,jdbcType=DOUBLE}, #{usageMonth,jdbcType=NVARCHAR}, #{descCnt,jdbcType=NVARCHAR}
      )
  </insert>
  <insert id="insertSelective" parameterType="com.cliot.pojo.CardPooledMonthlyUsage">
    insert into card_pooled_monthly_usage
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="usageId != null">
        usage_id,
      </if>
      <if test="cardId != null">
        card_id,
      </if>
      <if test="iccid != null">
        iccid,
      </if>
      <if test="usedFlow != null">
        used_flow,
      </if>
      <if test="usageMonth != null">
        usage_month,
      </if>
      <if test="descCnt != null">
        DESC_CNT,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="usageId != null">
        #{usageId,jdbcType=BIGINT},
      </if>
      <if test="cardId != null">
        #{cardId,jdbcType=BIGINT},
      </if>
      <if test="iccid != null">
        #{iccid,jdbcType=NVARCHAR},
      </if>
      <if test="usedFlow != null">
        #{usedFlow,jdbcType=DOUBLE},
      </if>
      <if test="usageMonth != null">
        #{usageMonth,jdbcType=NVARCHAR},
      </if>
      <if test="descCnt != null">
        #{descCnt,jdbcType=NVARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.cliot.pojo.CardPooledMonthlyUsage">
    update card_pooled_monthly_usage
    <set>
      <if test="cardId != null">
        card_id = #{cardId,jdbcType=BIGINT},
      </if>
      <if test="iccid != null">
        iccid = #{iccid,jdbcType=NVARCHAR},
      </if>
      <if test="usedFlow != null">
        used_flow = #{usedFlow,jdbcType=DOUBLE},
      </if>
      <if test="usageMonth != null">
        usage_month = #{usageMonth,jdbcType=NVARCHAR},
      </if>
      <if test="descCnt != null">
        DESC_CNT = #{descCnt,jdbcType=NVARCHAR},
      </if>
    </set>
    where usage_id = #{usageId,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.cliot.pojo.CardPooledMonthlyUsage">
    update card_pooled_monthly_usage
    set card_id = #{cardId,jdbcType=BIGINT},
      iccid = #{iccid,jdbcType=NVARCHAR},
      used_flow = #{usedFlow,jdbcType=DOUBLE},
      usage_month = #{usageMonth,jdbcType=NVARCHAR},
      DESC_CNT = #{descCnt,jdbcType=NVARCHAR}
    where usage_id = #{usageId,jdbcType=BIGINT}
  </update>
  <update id="updateTest">
    BEGIN TRANSACTION
    select iccid from card_pooled_monthly_usage  WITH (UPDLOCK, READPAST) where usage_month = #{usageMonth} and iccid=#{iccid}
    update card_pooled_monthly_usage set DESC_CNT='2' where usage_month = #{usageMonth} and iccid=#{iccid}
    COMMIT TRANSACTION
  </update>
  <select id="queryAll" resultMap="BaseResultMap">
    select  distinct top 10  iccid,min(usage_month) as usage_month from card_pooled_monthly_usage where usage_month >'202107' group by iccid
  </select>
</mapper>

自动生成的代码好多啊,乱七八糟的 难受。我们只看最后的 queryAll 这个标记。 要添加否则mapper接口映射不到会报错。

好了 构架做完了 可以开始测试了

运行启动程序

程序启动 运行在 8080端口 我们访问一下看

?运行成功 ,工程建立完成。

总结

? ? ? ? 新构架 在磕磕绊绊中基本入门了。时间有限就不深入研究了。等有空了去看看构架的文档吧,反正常用的功能都能用了 可以开始开发 web 项目了。开工咯。遇到坑在学校总结吧。

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:22:54  更:2022-07-21 21:25:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:54:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码