使用Spring-jdbc包自带的jdbcTemplate我们可以直接进行数据库操作(不使用持久层框架),使我们的应用程序更加灵活,但是使用Spring框架的时候难免要使用配置文件,
但是有些场景我们可能不需要那么重的配置。举例:我们的通用模块中可能要做到管控dubbo服务访问权限,而权限列表就放在mysql表中,那么我们可能在通用模块中需要操作数据库查询,但是用到查询的地方特别少,这时候我们加上spring配置,是有点浪费的。那么我们可不可以不使用配置去获得数据库连接或者jdbcTemplate去查询数据?当然是可以的,不过我们自己实现的话,首先比较困难,另外是没必要。我们此处使用最简化的方式实现这个功能:
一、新建maven项目&添加最简依赖
新建一个maven项目,在pom文件中添加以下依赖
<!-- 数据库连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- spring中jdbc相关操作依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.2</version>
</dependency>
二、添加属性文件
在src/main/resources下添加jdbc.properties
文件内容配置如下:
属性文件中字段名命名有规则,参考下一步
三、新建工具类
既然是工具类,我们尽量定义成abstract或者final类型,可以选择让调用方式继承或者直接调用静态方法,尽量不允许new新对象,代码实现如下:
/**
* 简化数据源配置类
*
* @author Typhoon
* @date 2017-08-22 11:27 Tuesday
* @since V1.3.1
*/
public class DataSourceUtils {
public static Properties p = null;
public static String confile = "jdbc.properties";
static {
p = new Properties();
InputStream inputStream = null;
try {
inputStream = DataSourceUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
inputStream = new BufferedInputStream(inputStream);
p.load(inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*获取数据源,私有方法不对外暴露
*/
private static DataSource getDataSource() {
try {
return DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
*获取JdbcTemplate(使用getDataSource()获取获取源)
*/
public static JdbcTemplate getJdbcTemplate() {
DataSource dataSource = getDataSource();
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate;
}
/**
*获取NamedParameterJdbcTemplate
* 在某些场景下比JdbcTemplate使用起来方便
*/
public static NamedParameterJdbcTemplate getNamedJdbcTemplate() {
DataSource dataSource = getDataSource();
NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
return namedJdbcTemplate;
}
}
这里边最重要的一段代码是:
这里将从jdbc.properties读取的数据传给DruidDataSourceFactory去创建连接,进入源码中可以看到:
到这里我们就发现此处会将从jdbc.properties读取的属性赋值给该类中的字段,所以上一步中我们定义的jdbc.properties属性文件的字段要和DruidDataSourceFactory中定义的保持一致.
然后我们就可以使用getJdbcTemplate()和getNamedJdbcTemplate()获取jdbc操作工具,然后我们就可以直接去执行sql操作了
四、新建Dao
新建UserDao,并使用上边定义的工具类注入JdbcTemplate
/**
* 用户操作dao
*
* @author Typhoon
* @date 2017-08-22 15:32 Tuesday
* @since V1.3.1
*/
public class UserDao {
/**
* 获取jdbcTemplate
*/
private JdbcTemplate jdbcTemplate = DataSourceUtils.getJdbcTemplate();
/**
* 查询列表
*
* @return
*/
public List<User> queryAll() {
return jdbcTemplate.query(" select * from User ", BeanPropertyRowMapper.newInstance(User.class), new Object[] {});
}
}
题外话: spring3.x版本使用ParameterizedBeanPropertyRowMapper做数据映射,spring4.x取消了该类,可以使用替代类BeanPropertyRowMapper做数据映射
五、模拟调用方并测试
新建测试类模拟Dao调用方,并测试JdbcTemplate是否访问数据库成功且正确返回数据
/**
* 模拟调用方
*
* @author Typhoon
* @date 2017-08-22 15:34 Tuesday
* @since V1.3.1
*/
public class Consumer {
public static void main(String[] args) {
UserDao userDao = new UserDao();
List<User> list = userDao.queryAll();
for(User u : list) {
System.out.println(u);
}
}
}
使用java Application方式运行上述代码,可以看到如下结果:
可见我们已经基于免Spring配置的方式实现的通过jdbcTemplate与数据库交互.
总结
在一些通用模块中数据库交互比较少的场景下,可以使用这种免配置方式替代繁重的配置文件方式实现数据库访问.
- 优点:免配置,使用方便.
- 缺点:不适合比较繁杂的数据交互比较多的场景
ps:原创不易,多多支持!