`
comicme_yanghe
  • 浏览: 8609 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Nano Framework之添加H2数据库并使用JDBC进行持久层开发

    博客分类:
  • Java
阅读更多
    本文基于前几篇为基础进行编写,如有需要请参考前几篇文章内容。
    下面我们进入今天的主题。

1、添加H2数据库依赖
1.1、修改pom.xml
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.189</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.15</version>
</dependency>


1.2、添加监听类
import java.sql.SQLException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.h2.tools.Server;
import org.nanoframework.commons.support.logging.Logger;
import org.nanoframework.commons.support.logging.LoggerFactory;

public class H2DBServerListener implements ServletContextListener {

    private Logger LOG = LoggerFactory.getLogger(H2DBServerListener.class);
    private Server server;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        try {  
            LOG.info("正在启动H2数据库...");
            server = Server.createTcpServer().start(); 
            LOG.info("H2数据库启动完成");
        } catch (SQLException e) {  
            throw new RuntimeException("启动H2数据库出错:" + e.getMessage(), e);  
        }  
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        if(server != null) {
            server.stop();
            server = null;
        }
    }

}


1.3、修改web.xml,添加listener和servlet
<listener>
    <listener-class>org.nanoframework.examples.first.webapp.listener.H2DBServerListener</listener-class>
</listener>
<!-- ... -->

<servlet>
    <servlet-name>H2Console</servlet-name>
    <servlet-class>org.h2.server.web.WebServlet</servlet-class>
    <init-param>
        <param-name>webAllowOthers</param-name>
        <param-value></param-value>
    </init-param>
    <init-param>
        <param-name>trace</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>H2Console</servlet-name>
    <url-pattern>/console/*</url-pattern>
</servlet-mapping>

<!-- 修改Dispatcher-Servlet的启动参数load-on-startup为2,优先启动数据库 -->
<servlet>
    <servlet-name>Dispatcher-Servlet</servlet-name>
    <servlet-class>org.nanoframework.web.server.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>context</param-name>
        <param-value>/context.properties</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Dispatcher-Servlet</servlet-name>
    <url-pattern>/dispatcher/*</url-pattern>
</servlet-mapping>


1.4、启动服务并访问 http://ip:port/first-webapp/console,使用以下信息登录
  • 连接串: jdbc:h2:~/test
  • 用户名: test
  • 密码: test


1.5、新建测试表
create table t_nano_test (
id int primary key,
name varchar(255)
)


2、开发基于JDBC的服务
2.1、context.properties中添加jdbc支持
mapper.package.jdbc=/examples-jdbc.properties


2.2、在src/main/resources下添加数据源属性文件examples-jdbc.properties(模板)
JDBC.environment.id=examples

JDBC.pool.type=DRUID
JDBC.driver=org.h2.Driver
JDBC.url=jdbc:h2:~/test
JDBC.username=test
JDBC.password=test
JDBC.autoCommit=false

################################################################
################   DRUID连接池配置    ############################
################################################################
# 初始化连接数量
druid.initialSize=1

# 最大并发连接数
druid.maxActive=5

# 最大空闲连接数
druid.maxIdle=5

# 最小空闲连接数
druid.minIdle=1

# 配置获取连接等待超时的时间
druid.maxWait=30000

# 超过时间限制是否回收 
druid.removeAbandoned=true

# 超过时间限制多长 
druid.removeAbandonedTimeout=180

# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
druid.timeBetweenEvictionRunsMillis=10000

# 配置一个连接在池中最小生存的时间,单位是毫秒
druid.minEvictableIdleTimeMillis=60000

# 用来检测连接是否有效的sql,要求是一个查询语句
druid.validationQuery=select 1

# 申请连接的时候检测
druid.testWhileIdle=true

# 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能
druid.testOnBorrow=false

# 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能
druid.testOnReturn=false

# 打开PSCache,并且指定每个连接上PSCache的大小
druid.poolPreparedStatements=true

druid.maxPoolPreparedStatementPerConnectionSize=20

# 属性类型是字符串,通过别名的方式配置扩展插件,
# 常用的插件有: 
#   监控统计用的filter:stat 
#   日志用的filter:log4j  
#   防御SQL注入的filter:wall
druid.filters=stat


2.3、添加Domain
import org.nanoframework.commons.entity.BaseEntity;

public class Test extends BaseEntity {
    private Integer id;
    private String name;

    public Test() {}
    public Test(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    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;
    }

}


2.4、添加Dao接口与实现
import org.nanoframework.examples.first.webapp.dao.impl.JdbcExamplesDaoImpl;
import org.nanoframework.examples.first.webapp.domain.Test;
import com.google.inject.ImplementedBy;
...

@ImplementedBy(JdbcExamplesDaoImpl.class)
public interface JdbcExamplesDao {
    long insert(Test test) throws SQLException;
    List<Test> select() throws SQLException;
    Test select(int id) throws SQLException;
}

import static org.nanoframework.orm.jdbc.binding.GlobalJdbcManager.get;
import org.nanoframework.examples.first.webapp.constant.DataSource;
import org.nanoframework.examples.first.webapp.dao.JdbcExamplesDao;
import org.nanoframework.examples.first.webapp.domain.Test;
import org.nanoframework.orm.jdbc.jstl.Result;
...

public class JdbcExamplesDaoImpl implements JdbcExamplesDao {

    private final String insert = "INSERT INTO T_NANO_TEST(ID, NAME) VALUES (?, ?) ";
    private final String select = "SELECT ID, NAME FROM T_NANO_TEST ";
    private final String selectById = "SELECT ID, NAME FROM T_NANO_TEST WHERE ID = ? ";

    @Override
    public long insert(Test test) throws SQLException {
        List<Object> values = new ArrayList<>();
        values.add(test.getId());
        values.add(test.getName());
        return get(DataSource.EXAMPLES).executeUpdate(insert);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Test> select() throws SQLException {
        Result result = get(DataSource.EXAMPLES).executeQuery(select);
        if(result.getRowCount() > 0) {
            List<Test> tests = new ArrayList<>();
            Arrays.asList(result.getRows()).forEach(row -> tests.add(Test._getMapToBean(row, Test.class)));
        } 

        return Collections.emptyList();
    }

    @SuppressWarnings("unchecked")
    @Override
    public Test select(int id) throws SQLException {
        List<Object> values = new ArrayList<>();
        values.add(id);
        Result result = get(DataSource.EXAMPLES).executeQuery(selectById, values);
        if(result.getRowCount() > 0) {
            return Test._getMapToBean(result.getRows()[0], Test.class);
        }

        return null;
    }

}


2.5、添加Component接口与实现
@Component
@ImplementedBy(JdbcExamplesComponentImpl.class)
@RequestMapping("/jdbc")
public interface JdbcExamplesComponent {
    @RequestMapping("/persist")
    Object persist(@RequestParam(name = "id") Integer id, @RequestParam(name = "name") String name);

    @RequestMapping("/find/all")
    Object findAll();

    @RequestMapping("/find/{id}")
    Object findById(@PathVariable("id") Integer id);
}

public class JdbcExamplesComponentImpl implements JdbcExamplesComponent {
    private Logger LOG = LoggerFactory.getLogger(JdbcExamplesComponentImpl.class);

    @Inject
    private JdbcExamplesDao examplsDao;

    @JdbcTransactional(envId = DataSource.EXAMPLES)
    @Override
    public Object persist(Integer id, String name) {
        Test test = new Test(id, name);
        try { 
            long changed = examplsDao.insert(test);
            if(changed > 0)
                return ResultMap.create(200, "写入数据库成功", "SUCCESS");
            else 
                return ResultMap.create(200, "写入数据库失败", "ERROR");
        } catch(Exception e) {
            LOG.error("写入数据库异常: " + e.getMessage(), e);
            return ResultMap.create(500, "写入数据库异常: " + e.getMessage(), e.getClass().getName());
        }
    }

    @Override
    public Object findAll() {
        try {
            List<Test> testList = examplsDao.select();
            Map<String, Object> map = ResultMap.create(200, "OK", "SUCCESS")._getBeanToMap();
            map.put("records", testList.size());
            map.put("rows", testList);
            return map;
        } catch(Exception e) {
            LOG.error("查询数据异常: " + e.getMessage(), e);
            return ResultMap.create(500, "查询数据异常: " + e.getMessage() , e.getClass().getName());
        }
    }

    @Override
    public Object findById(Integer id) {
        try {
            Test test = examplsDao.select(id);
            Map<String, Object> map = ResultMap.create(200, "OK", "SUCCESS")._getBeanToMap();
            map.put("data", test);
            return map;
        } catch(Exception e) {
            LOG.error("查询数据异常: " + e.getMessage(), e);
            return ResultMap.create(500, "查询数据异常: " + e.getMessage() , e.getClass().getName());
        }
    }

}


3、启动服务后进行以下操作
  • http://ip:port/first-webapp/jdbc/persist?id=1&name=test
  • http://ip:port/first-webapp/jdbc/find/all
  • http://ip:port/first-webapp/jdbc/find/1


4、至此,最基本的JDBC示例开发就完成了
0
2
分享到:
评论

相关推荐

    Go-nanoserver演示如何使用nano进行四川麻将游戏服务器程序开发

    在本文中,我们将深入探讨如何使用Go语言和nanoserver框架来开发一款四川麻将游戏的服务器程序。Go语言,也称为Golang,是Google推出的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言,尤其适合构建高...

    英伟达jetson NANO开发套件使用手册.pdf

    英伟达jetson NANO开发套件使用手册

    JetsonNano开发入门手册.pdf

    总结来说,Jetson Nano开发入门手册是一份详细指导用户如何从零开始,一步步深入学习并使用Jetson Nano的工具书。它从硬件到软件,从基础到应用,都提供了全面的指导,使开发者能够快速入门并掌握AI开发的核心技能。...

    super-nano-jdbc:超小纳米JDBC层

    "super-nano-jdbc"是一个轻量级的Java JDBC库,设计目标是提供一个极简的、高效的数据库访问层。它的核心理念是减小体积,提高性能,使得开发者在处理数据库交互时能更加便捷和快速。这个库由Rapidpm-Nano项目开发,...

    jetson nano 开发板官方教程

    总结,Jetson Nano开发板官方教程是一个全面的学习资源,涵盖了从基础设置到高级应用的所有环节,旨在帮助初学者快速掌握使用Jetson Nano进行AI和IoT项目开发的技能。通过深入学习和实践,你将能够充分利用Jetson ...

    altera DE0-NANO开发板使用说明书

    **一般设计流程**:概述使用DE0-NANO系统构建工具进行硬件设计的一般步骤,包括选择器件、创建项目、添加模块等。 **使用DE0-NANO系统构建工具**:详细介绍了如何利用该工具进行具体的硬件设计工作,包括设置参数、...

    一款零配置、无骨架、极小化的Hyperf发行版,通过Nano可以让您仅仅通过1个PHP文件即可快速搭建一个Hyperf应用

    在使用Nano时,开发者首先需要下载并解压nano-master压缩包。这个压缩包包含了所有必要的文件和配置,使得开发者可以直接开始编写业务代码,无需额外设置。在解压后,开发者可以找到启动文件、配置文件以及可能的...

    CubeMx+LL库下在 RT-Thread Nano 上添加控制台与 FinSH

    在嵌入式开发领域,尤其是基于STM32的系统中,使用CubeMX配置硬件和选择合适的库进行软件开发是常见的步骤。本文将深入探讨如何在RT-Thread Nano实时操作系统上,利用CubeMX和LL库来添加控制台以及FinSH命令行接口。...

    Klipper固件使用说明-Nano V31

    以下是对如何使用Klipper固件在Nano V3上进行详细的操作步骤。 **一、准备** 1. **硬件板卡准备** 在开始之前,确保你有一个兼容的Nano V3主板,并且所有必要的硬件组件,如步进电机驱动器、电源、热床、喷头等都...

    nano track aim mes

    "nano track aim mes" 是一个特定的技术框架,主要用于制造执行系统(MES)的开发和实施。这个框架专门设计用于优化追踪、目标定位和生产过程管理。在本文中,我们将深入探讨nano track aim mes的关键概念、功能及其...

    Nano100中文手册.zip_Nano100中文手册_nano100sd38n_panl41_tang nano_手册

    新唐Nano100系列微控制器是嵌入式开发领域中的一个重要选择,尤其对于那些希望在项目中使用中文文档以避免语言障碍的开发者而言。这个压缩包提供的“Nano100中文手册.zip”包含了详尽的新唐Nano100系列微控制器的...

    向日葵远程控制,jetsonNano远程控制所需软件

    总结起来,这些软件为Jetson Nano提供了远程控制功能,用户可以通过VNC Viewer或SunLogin客户端进行图形化远程桌面操作,而PuTTY则提供了命令行远程登录的选项。这对于开发、调试和管理Jetson Nano上的应用程序或...

    nano track

    "nano track"是一个技术主题,很可能与嵌入式系统、物联网(IoT)或软件开发中的追踪技术有关。从描述中的关键词"spec, function spec, framework"我们可以推断,这可能涉及一个特定技术规范、功能规格说明以及一个...

    nano编辑器使用教程

    nano编辑器使用教程 nano 编辑器是 GNU 项目下的一个小巧而功能强大的文本编辑器,广泛应用于 Linux 和 Unix 系统中。作为一款轻量级的编辑器,nano 编辑器拥有许多实用的功能,易于新手快速上手。 安装 nano 编辑...

    DE10_NANO_SoC_GHRD.zip_DE10_soc_SOC_de10_de10 开发板_de10nano

    DE10_NANO_SoC_GHRD.zip 文件是一个与 Altera DE10-Nano 开发板相关的资源压缩包,包含了一系列的示例程序和工程设计资料,方便用户快速上手并进行定制化开发。DE10-Nano 开发板是Altera(现已被Intel收购)推出的一...

    STM32Nano开发版FreeRTOS移植

    STM32Nano开发板是一款基于STM32微控制器的开发平台,特别适合于嵌入式系统的学习和开发。在这个项目中,我们关注的是如何在STM32Nano上移植并运行FreeRTOS操作系统,同时实现跑马灯、蜂鸣器以及串口通信等功能。...

    Dalsa Nano 相机使用例程

    **Dalsa Nano 相机使用例程详解** Dalsa Nano 相机是一款高性能、小巧便携的工业相机,常用于精密检测、自动化生产线等领域。这个使用例程是针对Dalsa Nano相机的C++编程实现,提供了详尽的操作指南,帮助用户实现...

    APICloud+jetson nano+websocket +OpenCV图传APP.rar

    开发者可以使用APICloud提供的API和模块,快速实现各种功能,如网络请求、数据库操作、地图集成等,大大简化了跨平台开发的复杂性。 jetson nano是NVIDIA推出的一款小型、低功耗的嵌入式计算平台,专门设计用于人工...

    Jetson_Nano英伟达nano_Developer_Kit_User_Guide_cn.pdf

    Jetson Nano Developer Kit支持使用JetPack进行开发,JetPack是NVIDIA提供的一个软件开发包,包含了操作系统镜像、系统库、APIs、开发工具以及文档等。通过JetPack,用户可以获得一个完整的开发环境,以便部署和运行...

Global site tag (gtag.js) - Google Analytics