这是一种相比传统的Jdbc要方便一些的数据库操作模板吧。
常规的JDBC
JDBC是一个非常基础的数据存取API,并且它封装了对关系型数据库的访问。
但它还是属于比较低层次的API
2.冗长的错误处理代码
来确保ResultSets,Statements以及Connection 在使用后的关闭
3.不提供异常的层次
利用 Spring 中的 JdbcTemplate 类进行数据库访问
结合手头的一个框架,Spring MVC,利用 JdbcTemplate 进行数据库操作。
Spring MVC 框架已经搭建完毕。
数据源配置如下(mvc-dispatcher-servlet.xml):
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>${db.driverClass}</value>
</property>
<property name="url">
<value>${db.url}</value>
</property>
<property name="username">
<value>${db.username}</value>
</property>
<property name="password">
<value>${db.password}</value>
</property>
</bean>
数据库信息写在了配置文件(db-config.properties)里
//被自己蠢哭了,url都抄不对。。看看下面这个url有什么不对
db.url=jdbc:mysql//ip:port/yourdb?useUnicode=true&characterEncoding=gbk
db.username=root
db.password=xxxxxx
db.driverClass=com.mysql.jdbc.Driver
mysql后面少了冒号:
db.url=jdbc:mysql://ip:port/yourdb?useUnicode=true&characterEncoding=gbk
在要用到的文件里引入即可
<!-- 获取配置文件 -->
<bean id="config"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db-config.properties</value>
</list>
</property>
</bean>
使用 JdbcTemplate 需要引入spring-jdbc-core 包
org.springframework.jdbc.core.JdbcTemplate
使用 Maven 添加该包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
spring.version已在前面定义
<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
有时候 maven 反应比较迟钝,有可能是没有打开 auto enable,有可能就是 maven 没有反应过来。这时候,我会把那个dependency Ctrl+X ,再 Ctrl+C,反复几次。或者就是直接IDE(Intellij IDEA)重启。
包下载好后,在 mvc-dispatcher-servlet.xml 中添加
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
jdbcTemplate编程
我最先是搭建过SSH的框架,起点好高,而且还是注解式的,按理来说,搭建时,一搜一堆的教程,东抄抄,西借借,虽然问题蹦出一大堆,但只要把搭建时哪些问题解决掉,框架搭起来以后,用的时候简直不要更多模板,就跟手工复制似的,我觉得学到的很少。
会用,但不懂,这个问题其实是很严重的。
今天,我在用JdbcTemplate访问数据库操作时,犯了很多错误。
错误1
就是前面提到的 db.url 写少了一个冒号 : 。
错误2
我没有引入 mysql-connector-java 的包。
所以它才会一直说Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.driver'
我的内心是崩溃的,为什么就找不到一个driver呢?
刚开始,我以为是我配置的问题,我换了c3p0(不要问我为什么这么蠢,都没看出来问题),maven了(这个当动词用,感觉不错)c3po的包(格式?我后面在告诉你,先说重点)。
com.mysql.jdbc.Driver 是 mysql-connector-java 包里的一个类。大小写还是得区分的吧,所以应该是Driver,而不是driver(当然,前面介绍的那个是对的,不知道怎么被我无头无脑的改了)。
//一些包的maven格式
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5-pre8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
错误3
这个问题就涉及到注入了
前面有一个 bean 的 id 为 jdbcTemplate ,这种属于在文件里配置的。
用的时候,直接声明一下,就可以直接用了,不用再去new了。//是我的问题,这里还少一个 @Autowired private JdbcTemplate jdbcTemplate;
update方法啊,query系列方法等等。
我用网上搜到的方法,同 jdbcTemplate 一样设置service实现类,并没有成功,name 属性始终提示有错,我不懂怎么解决。
然后我用了老一套,注解,因为本身Controller就是用的注解的方式,比较方便。
@Service("productService")
public Class ProductServiceImp implement ProductService{
@Override的一些方法,略
}
ProductService是一个接口类,~Imp就是它的实现类。