继续第一节的内容, 在配置完基础的spring依赖注入后, 接来下把日志和数据库配置一下.
第一部分:log4j日志, 关于log4j和spring的配置,网上已经文章大把大把的了, 就简单说一下配置过程.
虽然common-logging就可以满足大多基本的日志需求, 不过这里还是引入一下log4j的配置. spring同时还支持SLF4J, 好吧我没说听过.
spring配置log4j
第一步:引入log4j的jar包. 写此文时最新版本已是log4j-1.2.16.jar, spring3.0附送的是log4j-1.2.15.jar.应该没什么差别.
第二步(可省):在web.xml里配置
- <context-param>
- <param-name>webAppRootKey</param-name>
- <param-value>myProject.root</param-value>
- </context-param>
- <context-param>
- <param-name>log4jConfigLocation</param-name>
- <param-value>/WEB-INF/conf/log4j.properties</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
- </listener>
这一步的作用就是让spring帮忙照料下log4j的配置文件管理, 如果跳过第二步, 这里其实就和spring没什么关系,就是单独使用log4j了. (虽然后台还有将log4j交由spring容器接管之类的,我们不用关心了.)
第三步: 写log4j的配置文件, 关于log4j如何配置,网上已有很多资料, 这里不细说了.
推荐一个eclipse下用log4e插件. 可以很方便的生成日志语句, 转换System.out等.
log4j.properties文件:
log4j.rootLogger= DEBUG, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
#org.apache.log4j.HTMLLayout
#org.apache.log4j.PatternLayout
#org.apache.log4j.SimpleLayout
#org.apache.log4j.TTCCLayout
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
#log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
#log4j.appender.FILE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
#这里的${myProject.root}是在第二步中配置出来的. 也可以写绝对路径
#log4j.appender.FILE.File=${myProject.root}/log/sqmslog.log
#log4j.appender.FILE2 = org.apache.log4j.RollingFileAppender
#log4j.appender.FILE2.MaxFileSize = 500KB
log4j.logger.org.springframework=WARN
log4j.logger.test=DEBUG
第二部分: spring-jdbc 数据库配置.
这里所需jar包为: (关于jndi方面的jar包未测试是否已包含)
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.jdbc-3.0.5.RELEASE.jar
org.springframework.transaction-3.0.5.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
commons-logging-1.1.1.jar
commons-dbcp-1.3.jar
commons.pool-1.5.3.jar
当然,还有你要用的数据库的jdbc驱动包. 比如我这里用Mysql的mysql-connector-java-5.1.5-bin.jar
第二步:
这里使用的是将数据库信息写在文件jdbc.properties里, 你也可以将信息直接写在dataSource的bean属性里(将第一个bean去掉),
编辑spring的配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations" value="/WEB-INF/conf/jdbc.properties"/>
- </bean>
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- </bean>
- <bean id="TestBo"
- class="test.TestBo">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <!-- 省略其他 -->
- </beans>
jdbc.properties文件 :
jdbc.driverClassName=org.gjt.mm.mysql.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mysqldb?useUnicode=true
jdbc.username=root
jdbc.password=
第三步:测试, 还是使用在上一节中的测试类, TestBo
- public class TestBo {
- private JdbcTemplate jdbcTemplate;
- public void setDataSource(DataSource dataSource) {
- this.jdbcTemplate = new JdbcTemplate(dataSource);
- }
- }
这样就通过spring注入的dataSource在类中获得了JdbcTemplate, 这个对象基本就能帮你完成事务之外的各种数据库操作.具体操作方法这里不详述了,列出几个官方文档中给出的例子.
- //queryForInt
- int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt(
- "select count(*) from t_actor where first_name = ?", "Joe");
- //queryForString
- String lastName = this.jdbcTemplate.queryForObject(
- "select last_name from t_actor where id = ?",
- new Object[]{1212L}, String.class);
- // queryForObject
- Actor actor = this.jdbcTemplate.queryForObject(
- "select first_name, last_name from t_actor where id = ?",
- new Object[]{1212L},
- new RowMapper<Actor>() {
- public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
- Actor actor = new Actor();
- actor.setFirstName(rs.getString("first_name"));
- actor.setLastName(rs.getString("last_name"));
- return actor;
- }
- });
- //queryForObjectList
- List<Actor> actors = this.jdbcTemplate.query(
- "select first_name, last_name from t_actor",
- new RowMapper<Actor>() {
- public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
- Actor actor = new Actor();
- actor.setFirstName(rs.getString("first_name"));
- actor.setLastName(rs.getString("last_name"));
- return actor;
- }
- });
- //another queryForObjectList
- public List<Actor> findAllActors() {
- return this.jdbcTemplate.query( "select first_name, last_name from t_actor", new ActorMapper());
- }
- private static final class ActorMapper implements RowMapper<Actor> {
- public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
- Actor actor = new Actor();
- actor.setFirstName(rs.getString("first_name"));
- actor.setLastName(rs.getString("last_name"));
- return actor;
- }
- }
- //update and delete
- this.jdbcTemplate.update(
- "update t_actor set = ? where id = ?",
- "Banjo", 5276L);
- )
最后附上jndi的配置xml, 可能需要引入更多的jar包.
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jee="http://www.springframework.org/schema/jee"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/jee
- http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
- <jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/>
- <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
- <!-- other <bean/> definitions here -->
- </beans>