Spring JDBCTemplate使用JNDI数据源

简介: xml配置: 1 3 4 5 6 7 在weblogic/jboss中配置好JNDI数据源后,上述节点改为: 1 2 3 j...

xml配置:

1     <bean id="dataSource"
2         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
3         <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
4         <property name="url" value="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:orcl" />
5         <property name="username" value="cba" />
6         <property name="password" value="***" />
7     </bean>

在weblogic/jboss中配置好JNDI数据源后,上述节点改为:

1     <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
2         <property name="jndiName">
3             <value>java:/ssoDS</value>
4         </property>
5     </bean>

其中:第3行的java:/ssoDS即为web容器中配置好的jndi数据源名称

 

其它地方不用任何修改,使用示例如下:

1     <beans:bean id="userDetailsDao" class="infosky.ckg.sso.dao.impl.UserDetailsDaoImpl">
2         <beans:property name="dataSource" ref="dataSource" />
3         <!-- 登录错误尝试次数 -->
4         <beans:property name="maxAttempts" value="5" />
5     </beans:bean>

UserDetailsDao接口如下:

 1 package infosky.ckg.sso.dao;
 2 
 3 import infosky.ckg.sso.model.UserAttempts;
 4 
 5 public interface UserDetailsDao {
 6 
 7     void updateFailAttempts(String username);
 8 
 9     void resetFailAttempts(String username);
10 
11     UserAttempts getUserAttempts(String username);
12 
13 }

对应的实现类:

  1 package infosky.ckg.sso.dao.impl;
  2 
  3 import infosky.ckg.sso.dao.UserDetailsDao;
  4 import infosky.ckg.sso.model.UserAttempts;
  5 
  6 import java.sql.ResultSet;
  7 import java.sql.SQLException;
  8 import java.util.Date;
  9 
 10 import javax.annotation.PostConstruct;
 11 import javax.sql.DataSource;
 12 
 13 import org.springframework.beans.factory.annotation.Autowired;
 14 import org.springframework.dao.EmptyResultDataAccessException;
 15 import org.springframework.jdbc.core.RowMapper;
 16 import org.springframework.jdbc.core.support.JdbcDaoSupport;
 17 import org.springframework.stereotype.Repository;
 18 import org.springframework.security.authentication.LockedException;
 19 
 20 @Repository
 21 public class UserDetailsDaoImpl extends JdbcDaoSupport implements
 22         UserDetailsDao {
 23 
 24     private static final String SQL_USERS_UPDATE_LOCKED = "UPDATE t_users SET d_accountnonlocked = ? WHERE d_username = ?";
 25     private static final String SQL_USERS_COUNT = "SELECT COUNT(*) FROM t_users WHERE d_username = ?";
 26 
 27     private static final String SQL_USER_ATTEMPTS_GET = "SELECT d_username username,d_attempts attempts,d_lastmodified lastmodified FROM t_user_attempts WHERE d_username = ?";
 28     private static final String SQL_USER_ATTEMPTS_INSERT = "INSERT INTO t_user_attempts (d_username, d_attempts, d_lastmodified) VALUES(?,?,?)";
 29     private static final String SQL_USER_ATTEMPTS_UPDATE_ATTEMPTS = "UPDATE t_user_attempts SET d_attempts = d_attempts + 1, d_lastmodified = ? WHERE d_username = ?";
 30     private static final String SQL_USER_ATTEMPTS_RESET_ATTEMPTS = "UPDATE t_user_attempts SET d_attempts = 0, d_lastmodified = null WHERE d_username = ?";
 31 
 32     private int maxAttempts = 3;
 33 
 34     @Autowired
 35     private DataSource dataSource;
 36 
 37     @PostConstruct
 38     private void initialize() {
 39         setDataSource(dataSource);
 40     }
 41 
 42     @Override
 43     public void updateFailAttempts(String username) {
 44         UserAttempts user = getUserAttempts(username);
 45         if (user == null) {
 46             if (isUserExists(username)) {
 47                 // if no record, insert a new
 48                 getJdbcTemplate().update(SQL_USER_ATTEMPTS_INSERT,
 49                         new Object[] { username, 1, new Date() });
 50             }
 51         } else {
 52 
 53             if (isUserExists(username)) {
 54                 // update attempts count, +1
 55                 getJdbcTemplate().update(SQL_USER_ATTEMPTS_UPDATE_ATTEMPTS,
 56                         new Object[] { new Date(), username });
 57             }
 58 
 59             if (user.getAttempts() + 1 >= maxAttempts) {
 60                 // locked user
 61                 getJdbcTemplate().update(SQL_USERS_UPDATE_LOCKED,
 62                         new Object[] { false, username });
 63                 // throw exception
 64                 throw new LockedException("登录错误次数太多,该用户已被锁定!");
 65             }
 66 
 67         }
 68     }
 69 
 70     @Override
 71     public void resetFailAttempts(String username) {
 72         getJdbcTemplate().update(SQL_USER_ATTEMPTS_RESET_ATTEMPTS,
 73                 new Object[] { username });
 74 
 75     }
 76 
 77     @Override
 78     public UserAttempts getUserAttempts(String username) {
 79         try {
 80 
 81             UserAttempts userAttempts = getJdbcTemplate().queryForObject(
 82                     SQL_USER_ATTEMPTS_GET, new Object[] { username },
 83                     new RowMapper<UserAttempts>() {
 84                         public UserAttempts mapRow(ResultSet rs, int rowNum)
 85                                 throws SQLException {
 86 
 87                             UserAttempts user = new UserAttempts();
 88                             user.setUsername(rs.getString("username"));
 89                             user.setAttempts(rs.getInt("attempts"));
 90                             user.setLastModified(rs.getDate("lastModified"));
 91 
 92                             return user;
 93                         }
 94 
 95                     });
 96             return userAttempts;
 97 
 98         } catch (EmptyResultDataAccessException e) {
 99             return null;
100         }
101 
102     }
103 
104     private boolean isUserExists(String username) {
105 
106         boolean result = false;
107 
108         int count = getJdbcTemplate().queryForObject(SQL_USERS_COUNT,
109                 new Object[] { username }, Integer.class);
110         if (count > 0) {
111             result = true;
112         }
113 
114         return result;
115     }
116 
117     public int getMaxAttempts() {
118         return maxAttempts;
119     }
120 
121     public void setMaxAttempts(int maxAttempts) {
122         this.maxAttempts = maxAttempts;
123     }
124 
125 }

注意:34,35行在运行时,系统会自动注入dataSource对象

目录
相关文章
|
6月前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
|
3月前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
3月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
3月前
|
SQL XML Java
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
这篇文章是Spring5框架的实战教程,详细讲解了如何使用JdbcTemplate进行数据库的增删改查操作,包括在项目中引入依赖、配置数据库连接池、创建实体类、定义DAO接口及其实现,并提供了具体的代码示例和测试结果,最后还提供了完整的XML配置文件和测试代码。
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
|
5月前
|
SQL Java 数据库连接
Spring5系列学习文章分享---第四篇(JdbcTemplate+概念配置+增删改查数据+批量操作 )
Spring5系列学习文章分享---第四篇(JdbcTemplate+概念配置+增删改查数据+批量操作 )
35 0
|
5月前
|
存储 Java 数据库
Spring Boot中的动态数据源切换
Spring Boot中的动态数据源切换
|
5月前
|
Java Spring
spring基于注解配置数据源
spring基于注解配置数据源
|
6月前
|
设计模式 Java 数据库连接
【Spring源码】JDBC数据源访问实现
我们再来看看阅读线索三,这方面我们从设计模式进行入手。阅读线索三:从这个模块可以学到什么我们看下以下代码,PreparedStatement实例的是由PreparedStatementCreator实现的。再来看看PreparedStatementCreator接口,一共有三个子类实现。也就是说PreparedStatement的三种不同实现被封装到三个子类中,而具体需要哪种实现,只需要传入不同。
【Spring源码】JDBC数据源访问实现
|
6月前
|
SQL Java 数据库连接
jpa、hibernate、spring-data-jpa、jdbcTemplate
jpa、hibernate、spring-data-jpa、jdbcTemplate
|
6月前
|
Java 数据库连接 数据库
Spring系列文章:Spring使用JdbcTemplate
Spring系列文章:Spring使用JdbcTemplate
下一篇
无影云桌面