目录
2.2.5、修改mybatis配置文件SqlMapConfig.xml
一、连接池
使用连接池可以避免连接资源的频繁建立所造成的资源消耗,实现创建一部分连接对象放到"池子"中,需要时从"池子"中拿,用完归还,这也就是连接池的通俗解释!
1.1、Mybatis使用连接池
配置SqlMapConfig.xml时候,通过<dataSource type=”pooled”>来实 现 Mybatis 中连接池的配置。
<?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>
<!-- 注意:mybatis的配置文件是有顺序的 -->
<!-- 读取数据源配置文件db.properties 两种方式任选一,推荐方式二-->
<!--方式一:绝对路径使用url -->
<!-- <properties url="file:\D:\mycode\mybatis02\src\main\resources\db.properties"/> -->
<!--方式二:相对路径是用resource -->
<properties resource="db.properties"/>
<!--可以配置多个environment,例如开发环境、测试环境......default通过id指定默认数据库环境 -->
<settings>
<!-- mybatis日志 -->
<setting name="logImpl" value="stdout_logging" />
</settings>
<typeAliases>
<!-- 避免返回值类型写全限定名,可以采取取别名方式,推荐以下扫描包方式,别名为类名小写 -->
<package name="com.bailiban.domain"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<!-- 开启事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--数据源类型常用pooled,带有连接池功能 -->
<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>
<!-- 映射器,推荐下面这种扫描包方式,xml和注解开发均实用 -->
<!--注意:此处若已配置映射器,在代码中就无须再绑定接口configuration.addMapper(UserDao.class), 只能选其一,推荐此方式写在配置文件 -->
<package name="com.bailiban.dao"/>
</mappers>
</configuration>
那么除了pooled之外,还有unpooled、jndi。
二、JNDI实现数据源
2.1、jndi介绍
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性 。--来自百度百科
这种就类似于windows系统的注册表, 如下图
它是由键值对key:value 形式组成,为了防治有相同的key导致注册表数据不唯一,那么同时会有目录进行区分,从而达到每一条注册表都是唯一的。那么JNDI的思想便是参照了windows注册表的实现原理。
2.2、mybatis使用JNDI数据源
2.2.1、创建maven工程
pom文件
<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>com.bailiban</groupId>
<artifactId>mtbatis_jndi_bk</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<url>http://localhost:8080/manager/text</url>
<charset>utf-8</charset>
<update>true</update>
<server>tomcat8</server>
</configuration>
</plugin>
</plugins>
</build>
</project>
使用tomcat8远程部署,需要对本地tomcat8和maven进行配置,具体配置方法请查看另一篇文章-->https://blog.csdn.net/weixin_42133396/article/details/102967772
2.2.2 、实体类User
/**
* Copyright (C) 2019 Baidu, Inc. All Rights Reserved.
*/
package com.bailiban.domain;
import java.util.Date;
/**
* @author zhu
* @version 创建时间:2019年11月4日 上午10:52:58
*/
public class User {
private int id;
private String username;
private Date birthday;
private String address;
private String sex;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the birthday
*/
public Date getBirthday() {
return birthday;
}
/**
* @param birthday the birthday to set
*/
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/**
* @return the address
*/
public String getAddress() {
return address;
}
/**
* @param address the address to set
*/
public void setAddress(String address) {
this.address = address;
}
/**
* @return the sex
*/
public String getSex() {
return sex;
}
/**
* @param sex the sex to set
*/
public void setSex(String sex) {
this.sex = sex;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", address=" + address
+ ", sex=" + sex + "]";
}
}
2.2.3、接口mapper
/**
* Copyright (C) 2019 Baidu, Inc. All Rights Reserved.
*/
package com.bailiban.dao;
import java.util.List;
import com.bailiban.domain.User;
/**
* @author zhu
* @version 创建时间:2019年11月4日 上午10:55:32
*/
public interface UserMapper {
// 查询所有用户信息
public List<User> selectAll();
}
2.2.4 、UserMapper.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.bailiban.dao.UserMapper">
<select id="selectAll" resultType="com.bailiban.domain.User">
select * from user
</select>
</mapper>
2.2.5、修改mybatis配置文件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>
<!-- 注意:mybatis的配置文件是有顺序的 -->
<!-- 读取数据源配置文件db.properties 两种方式任选一,推荐方式二-->
<!--方式一:绝对路径使用url -->
<!-- <properties url="file:\D:\mycode\mybatis02\src\main\resources\db.properties"/> -->
<!--方式二:相对路径是用resource -->
<properties resource="db.properties"/>
<!--可以配置多个environment,例如开发环境、测试环境......default通过id指定默认数据库环境 -->
<settings>
<!-- mybatis日志 -->
<setting name="logImpl" value="stdout_logging" />
</settings>
<typeAliases>
<!-- 避免返回值类型写全限定名,可以采取取别名方式,推荐以下扫描包方式,别名为类名小写 -->
<package name="com.bailiban.domain"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<!-- 开启事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--连接池修改为JNDI -->
<dataSource type="JNDI">
<property name="data_source" value="java:/comp/env/jndi/mybatis" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 映射器,推荐下面这种扫描包方式,xml和注解开发均实用 -->
<!--注意:此处若已配置映射器,在代码中就无须再绑定接口configuration.addMapper(UserDao.class), 只能选其一,推荐此方式写在配置文件 -->
<package name="com.bailiban.dao"/>
</mappers>
</configuration>
需要修改的地方也就是连接池dataSource改为JNDI。
property属性中的name="data_source"为固定写法,value="java:/comp/env/jndi/mybatis",其中java:/comp/env是固定写法,也就类似于注册表中的目录,后面的jndi/mybatis是对应的数据源配置文件的名字。
可以查看源码如下图所示。
以上property也可以分两步写成如下形式。
<property name="data_source" value="jndi/mybatis" />
<property name="initial_context" value="java:/comp/env"/>
2.2.6、配置context.xml
那么jndi数据源的配置是需要写在META-INF目录下的context.xml文件中如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!--
<Resource
name="jndi/mybatis" 数据源的名称
type="javax.sql.DataSource" 数据源类型
auth="Container" 数据源提供者
maxActive="20" 最大活动数
maxWait="10000" 最大等待时间
maxIdle="5" 最大空闲数
username="root" 用户名
password="123456" 密码
driverClassName="com.mysql.jdbc.Driver" 驱动类
url="jdbc:mysql://localhost:3306/mybatis" 连接url字符串
/>
-->
<Resource name="jndi/mybatis"
type="javax.sql.DataSource"
auth="Container"
maxActive="20"
maxWait="10000"
maxIdle="5"
username="root"
password="123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mybatis" />
</Context>
看一下工程目录结构
2.3、测试代码编写
通过jndi方式配置的连接池需要部署到tomcat服务器中,才生效,因此无法通过@test来测试代码,需要进行部署。可以创建servlet进行测试,本文为方便,就没有编写servlet,通过采用jsp进行测试 。代码如下:
<%@page import="org.apache.ibatis.io.Resources"%>
<%@page import="com.bailiban.domain.User"%>
<%@page import="java.util.List"%>
<%@page import="com.bailiban.dao.UserMapper"%>
<%@page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@page import="org.apache.ibatis.session.SqlSessionFactoryBuilder"%>
<%@page import="java.io.InputStream"%>
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>JNDI测试!</h2>
<%
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.根据配置文件构建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用SqlSessionFactory创建SqlSession对象
SqlSession sqlSession = factory.openSession();
//4.使用SqlSession构建Dao的代理对象
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
//5.执行dao中的findAll方法
List<User> users = userDao.selectAll();
for(User user : users){
System.out.println(user);
%> <%=user %> <%
}
//6.释放资源
sqlSession.close();
in.close();
%>
</body>
</html>
三、部署运行
maven中输入命令:tomcat7:deploy -DskipTests
其中-DskipTests为跳过测试代码,即部署的时候不执行测试包下的代码。
如果没有测试代码,可以直接输入tomcat7:deploy,需要先启动tomcat服务器
浏览器输入localhost:8080
同事tomcat黑窗口里面也会打印出来
四、注意事项
使用JNDI连接池需要部署到tomcat容器中,不能部署到内置tomcat插件中,如果使用以下命令
tomcat7:run来执行的话会报错,因此需要采用以上方式进行远程部署
严重: Servlet.service() for servlet [jsp] in context with path [] threw exception [org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in SQL Mapper Configuration
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: There was an error configuring JndiDataSourceTransactionPool. Cause: javax.naming.NameNotFoundException: Name [jndi/mybatis] is not bound in this Context. Unable to find [jndi].] with root cause
javax.naming.NameNotFoundException: Name [jndi/mybatis] is not bound in this Context. Unable to find [jndi].
at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.ibatis.datasource.jndi.JndiDataSourceFactory.setProperties(JndiDataSourceFactory.java:54)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.dataSourceElement(XMLConfigBuilder.java:327)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement(XMLConfigBuilder.java:281)