从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 新闻合订本
    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 新闻合订本
    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

    • Redis

    • Mybatis

      • Mybatis 介绍
      • Mybatis 入门案例
      • Mybatis 入门案例-注解
      • Mybatis 入门案例-实现类
      • Mybatis 内部执行原理概述
      • 实现一个微型的 Mybatis-配置文件版
      • 实现一个微型的 Mybatis-注解版
      • Mybatis 实现 CRUD
      • Mybatis 中传递对象参数
      • Mybatis 中的列名和属性名的映射
      • Mybatis 实现 DAO 层的开发
      • Mybatis 实现类的执行过程-查询方法
      • properties 标签的使用及细节
      • typeAliases 标签和 package 标签
      • Mybatis 连接池和事务
      • Mybatis 与 JNDI
        • 使用 JNDI 之前
        • 环境准备
        • 新建 context.xml
        • 修改 Mybatis 配置文件
        • 新建 Servlet
        • 配置 web.xml
        • 新建 index.jsp
        • 测试
        • 源码
      • Mybatis 中的动态 SQL
      • Mybatis 多表查询
      • Mybatis 中的多对多查询
      • Mybatis 的延迟加载
      • Mybatis 的缓存
      • Mybatis 的注解开发-CRUD
      • Mybatis 的注解开发-多表查询
    • Lucene

    • Elasticsearch

    • MQ

    • MyCat

    • Lombok

  • SpringMVC

  • SpringBoot

  • Java
  • 主流框架
  • Mybatis
2023-04-25
目录

Mybatis 与 JNDI

# 141.Mybatis 与 JNDI

JNDI,全称 Java Naming and Directory Interface,Java 命名与目录接口,是 SUN 公司推出的一套规范,属于 JavaEE 技术之一,目的是模仿 Windows 系统中的注册表,提供一些资源给应用 ‍

# 使用 JNDI 之前

我们之前都是将数据库连接信息直接存放到配置文件中的,此时有一些问题存在:

  1. 数据库连接信息是敏感的,直接写在代码里不合适,容易暴露 ;
  2. 数据库服务器连接信息,可能会定期变化,导致得重新修改配置文件并重启;
  3. .....

上述情况其实很常见。在笔者的公司里,开发人员是不能知道生产环境的数据库密码的!即使是运维人员,也是分开掌握一半的密码,当需要用到的时候才两人一起输入。

此外,为了安全期间,密码应该定期更换,降低暴力破解成功的可能性。

对于程序员来说,应该不需要关心具体 “数据库后台是什么?JDBC 驱动程序是什么?JDBC URL 格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给 J2EE 容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

为此,JNDI 技术出现了,JNDI 可以简单理解为一个字典、Map 容器,我们可以往里面存储一些信息,每个信息有自己的名字。

例如,我们可以在 JNDI 里存储数据源的信息,然后在 Java 程序里,使用 JNDI 来获取数据源,这样,就将数据源 和 应用程序 解耦了。数据源的连接信息,或者密码等信息修改,并不会影响应用程序的运行。不仅仅是 Tomcat,像一些商用的 Web 服务器,也是支持 JNDI 的,例如 WAS 和 WebLogic

# 环境准备

目前我们的项目有很多的代码,为了方便演示 JNDI,我们先切换分支到 demo1,也就是 Mybatis 的第一个案例中用到的代码;

然后,新增两个依赖:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12

新建一个 src/main/webapp 目录,用来存放 web 相关的文件

‍

# 新建 context.xml

我们在 web 目录下新建 META-INF 目录,然后在里面新建 context.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource
            name="jdbc/LearnMybatis"
            type="javax.sql.DataSource" 
            auth="Container"          
            maxActive="20"            
            maxWait="10000"           
            maxIdle="5"               
            username="LearnMybatisUser"
            password="LearnMybatisUserPassword"
            driverClassName="com.mysql.cj.jdbc.Driver"
            url="jdbc:mysql:///LearnMybatis"
    />
</Context>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

‍ 属性说明:

  • name:JDNI 资源的名称
  • type:我们要存储什么样的资源,这里表示是数据源类型的资源。
  • auth:数据源提供者,也就是容器,例如 Tomcat
  • maxActive:最大活动数
  • maxWait:最大等待时间,单位为秒
  • maxIdle:最大空闲数
  • 剩下四个就是数据库连接信息

这里我们还是新建了一个配置文件,存放了数据库密码;但一般来说,该文件是在 Tomcat 的配置文件里设置的,例如 Tomcat 自己也有 context.xml:apache-tomcat-9.0.73\conf\context.xml。我们为了方便直接在项目里创建了 context.xml。

在一些 web 服务器中,例如 WebShare,Weblogic,都是有可视化界面配置数据源的。

# 修改 Mybatis 配置文件

我们修改 Mybatis 的主配置文件:关键部分在第 4 ~ 第 6 行




 
 
 



<environments default="mysql">
    <environment id="mysql">
        <transactionManager type="JDBC"/>
        <dataSource type="JNDI">
            <property name="data_source" value="java:comp/env/jdbc/LearnMybatis"/>
        </dataSource>
    </environment>
</environments>
1
2
3
4
5
6
7
8

‍ value 属性中,前面的写法是固定的,不能修改的 java:comp/env/ ‍

# 新建 Servlet

package com.peterjxl.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/index.jsp").forward(req, resp);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

‍

# 配置 web.xml

在 web.xml 里配置映射关系:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>com.peterjxl.servlet.ServletDemo1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 新建 index.jsp

在 webapp 目录下新建 index.jsp,内容如下:

<%@ page import="java.io.InputStream" %>
<%@ page import="org.apache.ibatis.io.Resources" %>
<%@ page import="org.apache.ibatis.session.SqlSessionFactoryBuilder" %>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory" %>
<%@ page import="org.apache.ibatis.session.SqlSession" %>
<%@ page import="com.peterjxl.dao.IUserDao" %>
<%@ page import="com.peterjxl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Hello JNDI</title>
    </head>
    <body>
        <%
            InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(in);
            SqlSession sqlSession = factory.openSession();
            IUserDao userDao = sqlSession.getMapper(IUserDao.class);
            List<User> users = userDao.findAll();
            for(User user : users){
                System.out.println(user);
            }
            sqlSession.clearCache();
            in.close();
        %>
    </body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

‍ 其实 index.jsp 的内容, 就是测试方法了的内容。因为此时测试类里的方法是不能运行的,因为 Junit 不是 容器,无法提供 JNDI 服务。而 JSP 是经过服务器的,所以可以获取到数据源信息。

注意 JSP 里有内置对象 session,所以之前我们的 SqlSession session 变量得换个名字,这里改名为 sqlSession

# 测试

我们打个 war 包

mvn package
1

‍ 然后讲该 war 包重命名为 LearnMybatis.war,并放到 Tomcat 的 webapp 目录下,启动 Tomcat,访问 http://localhost: 8080/LearnMybatis,可以看到日志里能正常打印查询出来的数据。

‍

# 源码

本文所有代码已上传到了 GitHub (opens new window) 和 Gitee (opens new window) 上,并且创建了分支 demo16,读者可以通过切换分支来查看本文的示例代码。

上次更新: 2025/6/3 09:31:54
Mybatis 连接池和事务
Mybatis 中的动态 SQL

← Mybatis 连接池和事务 Mybatis 中的动态 SQL→

最近更新
01
新闻合订本 2025-10
10-31
02
2025 年 10 月记
10-30
03
用 AI 批量优化思源笔记排版
10-15
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式