做SSM项目的步骤和优化

SSM框架整合

这里说的SSM整合,主要说的是Spring和mybatis之间的整合。因为spring和springMVC都是spring生态系统中的框架,所以spring和springMVC之间的整合是无缝的整合,即,我们在不知不觉中,其实spring和springMVC已经整合好了,不用你做什么额外的事情了。但是mybatis是第三方的框架,所以我们要手动把spring和mybatis进行整合。

原始整合,即,我们每一层之前怎么学的(mybatis管理dao层,springMVC管理view层),这里就怎么直接用。但是原始整合,你会发现这种整合中,spring和mybatis的整合度不是很高。所以我们之后会解决这些问题,这些问题解决了,SSM框架的整合就已经OK了。这里,我们先学原始的整合方式,然后我们解决原始整合方式存在的问题,解决完了,我们本节“SSM框架整合”的学习就结束了。

原始整合方式

原始整合方式,就是我们直接用SSM框架来做web项目,所以整合的步骤:无。即,你想怎么写这个项目,就怎么写,该用框架的时候就直接用框架来写代码就行了。

没有整合的步骤,那我们来看看我们平常写项目的步骤就行了,平常写项目的步骤做完了,原始整合就结束了。

下面用一个例子来做演示:

步骤:

  1. 编写数据库和表

    建库如下:

    在这里插入图片描述

    建表如下:

    在这里插入图片描述

  2. 创建maven项目,并且创建maven工程可能需要的包。反正就是把项目的结构搭好。

    在这里插入图片描述

  3. 导入项目可能需要用到的架包

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>org.itcast</groupId>
      <artifactId>ssm</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.7</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.0.5.RELEASE</version>
        </dependency>
    
        <!--servlet和jsp-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
        </dependency>
    
        <!--mybatis相关的架包-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.5</version>
        </dependency>
        <!--这个mybatis-spring是我们之后优化整合的时候会用,原始整合不用。-->
    <!--    <dependency>-->
    <!--      <groupId>org.mybatis</groupId>-->
    <!--      <artifactId>mybatis-spring</artifactId>-->
    <!--      <version>1.3.1</version>-->
    <!--    </dependency>-->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.6</version>
        </dependency>
        <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.2</version>
        </dependency>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
              <!--source 和 target根据个人需要自己修改-->
              <source>11</source>
              <target>11</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    
  4. 编写实体类

    实体类如下:

    package com.itcast.domain;
    
    public class Account {
        //建议写Integer,而不是写int
        private Integer id;
        private String name;
        private Double money;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Double getMoney() {
            return money;
        }
    
        public void setMoney(Double money) {
            this.money = money;
        }
    }
    

    注意点:

    实体类用定义属性的时候,建议包装类型来定义。理由如下:

    在这里插入图片描述

  5. 编写Mapper接口和可能会用到的方法

    package com.itcast.mapper;
    
    import com.itcast.domain.Account;
    import java.util.List;
    
    public interface AccountMapper {
        public void save(Account account);
        public List<Account> findAll();
    }
    
    
  6. 编写Service层的接口和可能会用到的方法

    package com.itcast.service;
    
    import com.itcast.domain.Account;
    import java.util.List;
    
    public interface AccountService {
        public void save(Account account);
        public List<Account> findAll();
    }
    
  7. 编写Service层的接口实现类和实现方法

    package com.itcast.service.impl;
    
    import com.itcast.domain.Account;
    import com.itcast.service.AccountService;
    import java.util.List;
    
    public class AccountServiceImpl implements AccountService {
        @Override
        public void save(Account account) {
    
        }
    
        @Override
        public List<Account> findAll() {
            return null;
        }
    }
    

    service实现类的具体实现,我们先空着,之后写。

    在这里插入图片描述

  8. 编写Controller

    这里我们具体实现也先空着。先把框架搭好。

    在这里插入图片描述

  9. 编写前端的页面

    在这里插入图片描述

    在这里插入图片描述

    注意:

    因为WEB-INF下的资源是受保护的,所以我们不能直接访问到。我们放在WEB-INF文件夹外的资源,我们可以浏览器输入地址直接访问。但是在WEB-INF文件夹内的资源,我们只能通过controller的转发机制访问。

  10. 编写配置文件(这些配置文件的结构先搭好,里面具体写什么得用得时候才知道,所以我们先空着)

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  11. 补齐配置文件中的配置:

    AccountMapper.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">
    <mapper namespace="com.itcast.mapper.AccountMapper">
        <insert id="save" parameterType="account">
            insert into account value(#{id},#{name},#{money})
        </insert>
        <select id="findAll" resultType="Account">
            select * from account
        </select>
    </mapper>
    

    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    ">
        <!--组件扫描 -->
        <context:component-scan base-package="com.itcast">
            <!--我们扫这个com.itcast包,那么com.itcast包下的@Controller注解也会被扫描到,但是这个@Controller注解的类一般是表示层的类,所以我们到时候应该让他被springmvc来管理的,所以我们这里spring就不去控制它了,我们就需要这个@Controller注解给排除掉去,到时候让springmvc的配置文件来扫描-->
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    </beans>
    

    jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=root
    jdbc.password=815924
    

    log4j.properties

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### direct messages to file mylog.log ###
    #log4j.appender.file=org.apache.log4j.FileAppender
    #log4j.appender.file.File=hibernate.log
    #log4j.appender.file.layout=org.apache.log4j.PatternLayout
    #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    
    log4j.rootLogger=all, stdout
    

    spring-mvc.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                                http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--组件扫描,主要扫描@Controller注解-->
        <context:component-scan base-package="com.itcast.controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <!--配置mvc注解驱动-->
        <mvc:annotation-driven/>
    
        <!--配置内部资源视图解析器-->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
        <!--开放静态资源访问-->
        <mvc:default-servlet-handler/>
    </beans>
    

    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>
        <!--加载properties文件-->
        <properties resource="jdbc.properties"></properties>
    
        <!--定义别名-->
        <typeAliases>
            <!--<typeAlias type="com.itcast.domain.Account" alias="account"></typeAlias>-->
            <!--上面这种定义别名的方式是,把这个com.itcast.domain.Account定义一个别名,别名叫account-->
            <!--下面我们介绍另一种定义别名的方式,扫描包的方式。比如下面这样写的话,我们这个com.itcast.domain包下所有的类都将会被设置别名。设置什么别名,看例子:比如,我们这个com.itcast.domain包下有一个Account类和User类,那么,你用了下面这个扫描包的这个方式,就相当于给这个com.itcast.domain包下的Account类设置了account和Account两个别名。给com.itcast.domain包下的User类设置了User和user两个别名-->
            <package name="com.itcast.domain"></package>
        </typeAliases>
    
        <!--数据源环境-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--加载映射文件-->
        <mappers>
            <!--<mapper resource="com\itcast\mapper\AccountMapper.xml"/>-->
            <!--上面这个加载映射文件的方式是一个个加载的,所以,要想加载多个映射文件,你得写多个mapper标签。下面,我们来介绍另一种写法,包引入方式,我们在“mybatis-day1.md”中的mappers标签里面讲过,但是使用这种方式有一些注意点,你看之前“mybatis-day1.md”中的mappers标签的笔记就行. -->
            <package name="com.itcast.mapper"/>
        </mappers>
    </configuration>
    
  12. 完成逻辑代码的编写

    package com.itcast.controller;
    
    import com.itcast.domain.Account;
    import com.itcast.service.AccountService;
    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 org.springframework.web.servlet.ModelAndView;
    
    import java.util.List;
    
    @Controller
    @RequestMapping("/account")
    public class AccountController {
        @Autowired
        private AccountService accountService;
        //保存(实际中,我们保存成功应该会跳转到一个列表页面的,这里我们简单点,就直接在页面打印一个字符串意思一下。)
        @RequestMapping("/save")
        @ResponseBody
        public String save(Account account){
            accountService.save(account);
            return "保存成功!";
        }
    
        //查询。查询结束我们返回一个数据,并且返回一个视图。
        public ModelAndView findAll(){
            List<Account> accountList=accountService.findAll();
            ModelAndView modelAndView=new ModelAndView();
            modelAndView.addObject("accountList",accountList);
            modelAndView.setViewName("accountList");
            return modelAndView;
        }
    }
    
    
    package com.itcast.service.impl;
    
    
    import com.itcast.domain.Account;
    import com.itcast.mapper.AccountMapper;
    import com.itcast.service.AccountService;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.springframework.stereotype.Service;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    @Service("accountService")
    public class AccountServiceImpl implements AccountService {
        @Override
        public void save(Account account) {
            try {
                InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
                SqlSession sqlSession = sqlSessionFactory.openSession();
                AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
                mapper.save(account);
                sqlSession.commit();
                sqlSession.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public List<Account> findAll() {
            try {
                InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
                SqlSession sqlSession = sqlSessionFactory.openSession();
                AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
                List<Account> accountList = mapper.findAll();
                sqlSession.close();
                return accountList;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    
  13. 测试

    在这里插入图片描述

    结果:

    在这里插入图片描述

    数据库:

    在这里插入图片描述

    发现,页面显示的时候出现了乱码,但是数据库里面存数据的时候是正确的。

    分析:

    数据库能正确存数据的原因是:我们在web.xml中设置了乱码过滤器,所以服务器获取前端代码的数据的乱码问题解决了,即,我们前端输入了中文的数据,后端正确获取到了中文数据,没有出现乱码,然后存到数据库里面,所以数据库里面存的是正确的。

    那么前端出现乱码的原因是什么呢?你看我们之前没用ssm的时候,我们都直接在servlet的代码块的后半段设置response.setContentType(“text/html;charset=utf-8”)。这样前端页面就不会出现乱码了,这里我们ssm要达到这个效果,我们也得设置一下响应的编码。

    解决方法如下:

    在这里插入图片描述

    测试:

    在这里插入图片描述

    点击"保存"后:

    在这里插入图片描述

    数据库数据如下:

    在这里插入图片描述

  14. 下面我们来完成保存的方法。之前1~13步中,没有把save()方法和他跳转的页面完成,下面我们来把他们完成。

    在这里插入图片描述

    在这里插入图片描述

  15. 测试:

    在这里插入图片描述

原始整合方式的弊端

弊端:

你看上面这里service层中,每次执行某个方法的时候都会执行下面这些语句,即,都会加载配置文件、创建工厂对象、创建Session对象、事务提交、关闭sql会话等。

在这里插入图片描述

解决:

把创建Session工厂的工作、创建AccountMapper对象的工作都交给spring容器来做。并且把事务控制也交给spring来做。

在这里插入图片描述

即,我们要做到让spring创建这个AccountMapper,并且注入到这个AccountServiceImpl的某个AccountMapper类型的成员变量里面,然后这个AccountServiceImpl类里面的所有方法都可以用那个成员变量了,这个类里面也不用创建对象,因为创建对象和绑定到AccountServiceImpl的成员变量的工作都交给spring容器了。

然后我们在spring核心配置文件里面给这个AccountServiceImpl类里面的方法配置上事务控制,这样,那些被设置了事务控制的方法会在执行成功的时候自动提交,执行失败的时候自动回滚了,就取代了我们上面的sqlSessioni.commit()和sqlSessioni.close()了。其实上面这个例子里面,出现异常回滚的代码都没有写,我们通过spring核心配置文件给AccountServiceImpl类里面的方法配置上事务控制,那些方法执行出现异常,就会自动回滚了,也相当于补齐了上面例子中没有写的回滚的功能。

具体怎么整合看下面。

优化后的整合

我们先在spring核心配置文件中加一些配置做到让spring来创建工厂和AccountMapper对象。

在这里插入图片描述

注意:上面这个工厂类是mybatis-spring包下的,所以我们要把之前注释掉的mybatis和spring整合需要用到的架包给解开。

在这里插入图片描述

然后我们就可以把mybatis核心配置文件中那些被移到spring核心配置文件中来配置的东西给删了

删除前:

在这里插入图片描述

删除后:

在这里插入图片描述

修改AccountServiceImpl。

在这里插入图片描述

上面是完成了让spring帮我们创建AccountMapper对象。下面我们来把声明式事务控制做了,这样优化后的SSM整合就ok了。

添加事务控制如下:

在这里插入图片描述

测试:

数据库之前数据:

在这里插入图片描述

输入:

在这里插入图片描述

点击保存后:

在这里插入图片描述

数据库数据:

在这里插入图片描述

输入http://localhost:8080/ssm_war_exploded/account/findAll,显示的结果如下

在这里插入图片描述

OK,整合完成,并且测试通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20216.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git如何将本地分支推送到远程(远程上没有该分支)

Author: wencoo Blog&#xff1a;https://wencoo.blog.csdn.net/ Date: 12/05/2023 Details:文章目录 正文 或 背景7.如果远程新建了一个分支&#xff0c;本地没有该分支。8.如果本地新建了一个分支 branch_name&#xff0c;但是在远程没有。报错解决 参考打赏 正文 或 背景 本…

Python依据某一文件夹中大量文件的名称复制另一文件夹中的同名文件

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件的名称&#xff0c;从另一个文件夹中找到与这一文件夹中文件同名的文件&#xff0c;并将找到的同名文件复制到第三个文件夹中的方法。 首先&#xff0c;我们来明确一下本…

【Java】EasyExecl数据导入

【Java】EasyExecl数据导入 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助…

如何设计API返回码(错误码)?

一、前言 二、HTTP 状态码参考 三、参数约定 四、个性化 Message 五、返回信息的统一处理 一、前言 客户端请求 API&#xff0c;通常需要通过返回码来判断 API 返回的结果是否符合预期&#xff0c;以及该如何处理返回的内容等 相信很多同学都吃过返回码定义混乱的亏&…

聚观早报 |苹果头显得到Oculus创始人认可;AI加持Bing市场份额反降

今日要闻&#xff1a;苹果头显得到Oculus创始人认可&#xff1b;AI加持下Bing市场份额不增反降&#xff1b;AI歌手翻唱大火可能涉及多项侵权&#xff1b;小米辟谣武汉总部35岁以上员工只保留10%&#xff1b;特斯拉2023年度股东大会下周召开 苹果头显得到Oculus创始人认可 5 月…

商场地图怎么画最简单?商场导视图怎么做?

商场购物中心超大的经营规模能为广大顾客提供购物选择的同时&#xff0c;也面临着许多问题&#xff1a;购物体验差&#xff0c;顾客到店率低。以及数据缺失&#xff0c;无法为商家做营销决策提供依据等等&#xff0c;那么&#xff0c;如何快速提升商场店铺运营效果&#xff0c;…

8年测试老鸟总结,软件测试工程师关键成长晋升要素,这些不能不知道...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、技术-依然是最…

cmake学习笔记

单文件入门 基本函数 PROJECT(projectname [CXX] [C] [Java]) SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …) ADD_EXECUTABLE([BINARY] [SOURCE_LIST]) 例子 文件结构如下&#xff1a; // ma…

泰克Tektronix AFG31021 任意波函数发生器产品资料

AFG31021是一款高质量、多功能的任意波形发生器&#xff0c;可以生成高精度、高分辨率的波形信号。该产品的主要特点包括&#xff1a; 可以生成任意波形信号&#xff0c;内置多种标准波形&#xff0c;如正弦波、方波、三角波、锯齿波等&#xff0c;也可以通过用户自定义来生成…

k8基础知识

总述 在构成扁平化网络的基础上实现Pod编排&#xff08;控制、管理&#xff09;、调度&#xff0c;再构成服务&#xff1b;对服务的管理有所欠缺&#xff1b;可以说k8s重点解决资源的问题 服务管理、应用管理&#xff1b;istio重点解决服务的问题 功能 开源、动态伸缩、负载…

使用Visual Studio 2019 创建JNI式的动态库及在Java代码中的使用

文章目录 JNI简介JNI 数据类型与 Java 、C 类型对比JNI式动态库函数编码规则Visual Studio下的编码JNI式动态库在Java代码中的使用改进版通过javah命令自动生成.h文件 JNI简介 JNI (Java Native Interface) 是 Java 沟通 Native 语言&#xff08;主要是C、C&#xff09;的桥梁…

耗子叔-我的互联网引路人

早上一早看到各大程序员群提到左耳朵耗子-陈皓&#xff0c;因为心梗辞世的信息&#xff0c;真的让人难以置信&#xff0c;因为据我所知他还不到50。 虽然我从来没见过他&#xff0c;交谈也很少&#xff0c;但是我知道他的情况&#xff0c;知道他的公司&#xff0c;知道他的好恶…

Policy Gradient策略梯度算法详解

1. 基本思想 Policy Gradient策略梯度&#xff08;PG&#xff09;&#xff0c;是一种基于策略的强化学习算法&#xff0c;不少帖子会讲到从基于值的算法&#xff08;Q-learning/DQN/Saras&#xff09;到基于策略的算法难以理解&#xff0c;我的理解是两者是完全两套思路&#…

在 oracle 中执行 sql 语句时,报错:“ORA-00001: 违反唯一约束条件 SYS_C0024202”

在 oracle 中执行 sql 语句时&#xff0c;报错&#xff1a;“ORA-00001: 违反唯一约束条件 SYS_C0024202” 报错信息如下&#xff1a; 表为“WK_ADMIN_USER” 解决方法&#xff1a; 1、查看违反约束的序列对应的数据库表与字段 select a.constraint_name,a.constraint_type,b…

签名预售活动圆满结束!各位敬等快递,第一个付款的兄弟来领取大礼!

我的新书经过千难万险终于上架&#xff0c; 为了感谢众多老铁的支持&#xff0c; 所以上周日搞了签名预售的活动&#xff0c;挂了300本&#xff0c; 一上线很快就被大家买光了&#xff0c; 留言需要单独写一些话的老铁&#xff0c;我也都尽量满足了&#xff0c; 如果一楼还…

日撸 Java 三百行day50

文章目录 说明day50 小结1.比较分析各种查找算法.2.比较分析各种排序算法3.描述各种排序算法的特点和基本思想4.设计一个自己的 Hash 函数和一个冲突解决机制 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己…

Scala字符串常用函数

Scala字符串常用函数 1. 子字符串-substring2. 字符串切分-split3. 去掉首尾空格-trim4. 与数值之间的转换完整代码参考链接 Scala中的字符串为String类型&#xff0c;其实就是Java中的java.lang.String。其常用函数如下&#xff1a; 1. 子字符串-substring substring()方法返…

4月份公司测试部门来了个卷王之王,让人奔溃...

前段时间公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司干了三年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&am…

C. Classy Numbers(dfs构造 + 组合数学)

Problem - C - Codeforces 让我们称某个正整数为“优美的”&#xff0c;如果它的十进制表示中不超过3个数字不为零。例如&#xff0c;数字4、200000、10203是优美的&#xff0c;而数字4231、102306、7277420000则不是。 给定一个区间[L;R]&#xff0c;请计算在此区间内有多少个…

Camtasia2023.0.1CS电脑录制屏幕动作工具新功能介绍

Camtasia Studio是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等&#xff0c;另外&#xff0c;它还具有即时播放和编 辑压缩的功能&#xff0c;可对视频片段进行剪接、添加转场效果。…