MyBatis通过配置mybatis-config.xml文件的dataSource标签配置数据源类型以及属性。除UNPOOLED和POOLED外,mybatis支持JNDI方式从外部服务中获取数据源配置。
JNDI(Java命名与目录接口)是SUN公司提供的一种标准的Java命名系统接口,通过名称获取到服务对象。以Tomcat为例的服务器自带数据库连接池,默认采用DBCP连接池,jar包位于lib目录下。此时,Web应用使用Tomcat提供的数据库连接池服务,通过JNDI名称查找数据源。
mybatis-config.xml配置
mybatis主要配置dataSource的type属性为JNDI,并设置JNDI名称,用于系统查找数据源。
<?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"></transactionManager>
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jdbc/mybatis"/>
</dataSource>
</environment>
</environments>
</configuration>
配置数据源
数据源有多种配置方式,包括全局配置和局部配置。其中全局配置是对Tomcat /conf目录的context.xml文件进行配置,局部配置只在当前项目中生效,在项目目录webapp/META_INF目录创建context.xml文件,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/mybatis" 数据源的名称
type="javax.sql.DataSource" 数据源类型--通过name获取到type类型的服务
auth="Container" 数据源提供者 tomcat
maxActive="20" 最大活动数
maxWait="10000" 最大等待时间 s
maxIdle="5" 最大空闲数
username="root" 用户名
password="123456" 密码
driverClassName="com.mysql.jdbc.Driver" 驱动类
url="jdbc:mysql://localhost:3306/mybatis" 连接url字符串
/>
</Context>
测试JNDI获取数据源
采用Servlet进行简单测试。自servlet3.0后可以不用再web.xml里面配置servlet,只需要加上@WebServlet
注解就可以修改该servlet的属性。
@WebServlet("/jndi")
public class JNDIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Connection conn = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/mybatis");
conn = ds.getConnection();
System.out.println(conn);
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
浏览器访问http://localhost:8080/advanced_java_war_exploded/jndi,控制台会打印出数据源信息。
1520309599, URL=jdbc:mysql://localhost:3306/mybatis, UserName=root@localhost, MySQL Connector/J
当然也可以使用JSP测试,效果是一样的。
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.sql.DataSource" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="java.sql.SQLException" %>
<html>
<body>
<h2>Hello World!</h2>
<%
Connection conn = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/mybatis");
conn = ds.getConnection();
System.out.println(conn);
} catch (NamingException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn.close();
}
%>
</body>
</html>
参考文档
http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html