查詢數據庫表,如果用戶表sw_user中存在一條username為lisi的數據,則將這條數據的對象返回
使用原始的方法,操作如下:
1、先寫一個工具類,有實現MySQL數據庫連接的方法,和關閉數據庫連接、關閉ResultSet 結果集、關閉PreparedStatement 的方法。代碼如下:
package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBUtil { //連接MySQL數據庫工具 public static Connection getConn() { Connection conn=null; try { Class.forName("com.mysql.jdbc.Driver"); try { conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root"); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } return conn; } //關閉數據庫連接、sql連接、結果集 public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs) { if(conn!=null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
使用這個DBUtil來查詢數據庫表中是否有一條名字為lisi的數據,將這條數據按User對象返回
package com.swift; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class QueryOneObject { public static User queryOneObject() { Connection conn=DBUtil.getConn(); PreparedStatement ps=null; ResultSet rs=null; User user=null; try { ps=conn.prepareStatement("select * from sw_user where username=? and password=?"); ps.setString(1, "lisi"); ps.setString(2, "abcdef"); } catch (SQLException e) { e.printStackTrace(); } try { rs=ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } try { while(rs.next()) { String username=rs.getString("username"); String password=rs.getString("password"); user=new User(username,password); } } catch (SQLException e) { e.printStackTrace(); } return user; } }
測試類SeverletDemo
package com.swift; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/demo") public class ServletDemo extends HttpServlet { private static final long serialVersionUID = 1L; public ServletDemo() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); User user=QueryOneObject.queryOneObject(); response.getWriter().append(user.toString()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
結果:
下面將用JdbcTemplate的方法完成上面過程:
再用同樣語句查詢 數據庫表中的zhangsan 這條記錄用一個對象返回
瀏覽器中得到結果如上圖,成功獲得zhansan對象
在JdbcTemplateDemo類中增加查詢返回一個對象的方法queryOneObject()
數據源DriverManagerDataSource不變
jdbcTemplate的方法有所改變,使用queryForObject(sql, new MyRowMapper(), "zhangsan","123456");
其中第二個參數是一個接口RowMapper<User>的實現類,可以使用匿名內部類,我使用的是單獨的類MyRowMapper的對象
它要實現重載的方法mapRow(ResultSet rs, int num)只做兩件事
一用ResultSet得到所需User對象數據
二用User進行封裝得到對象並返回
package com.swift; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.stereotype.Component; @Component(value="jdbcTemplateDemo") public class JdbcTemplateDemo { public User queryOneObject() { DriverManagerDataSource dataSource=new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/sw_database"); dataSource.setUsername("root"); dataSource.setPassword("root"); JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource); String sql="select * from sw_user where username=? and password=?"; User user=jdbcTemplate.queryForObject(sql, new MyRowMapper(), "zhangsan","123456"); return user; } public boolean delete(String username) { DriverManagerDataSource dataSource=new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/sw_database"); dataSource.setUsername("root"); dataSource.setPassword("root"); JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource); int count=jdbcTemplate.update("delete from sw_user where username=?", username); if(count!=0) { return true; } return false; } } //沒有用匿名內部類,注意MyRowMapper后沒有<User> class MyRowMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int num) throws SQLException { String username=rs.getString("username"); String password=rs.getString("password"); User user=new User(username,password); return user; } }
實現結果的Servlet類
package com.swift; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; @WebServlet("/demo") public class ServletDemo extends HttpServlet { private static final long serialVersionUID = 1L; public ServletDemo() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); User user=QueryOneObject.queryOneObject(); response.getWriter().append(user.toString()); //使用JdbcTemplat的queryForObject方法 ApplicationContext context=new ClassPathXmlApplicationContext("aop.xml"); JdbcTemplateDemo jdbcTemplateDemo=(JdbcTemplateDemo) context.getBean("jdbcTemplateDemo"); User user1=jdbcTemplateDemo.queryOneObject(); response.getWriter().println(); response.getWriter().append(user1.toString()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
掃描注解的xml配置文件代碼:
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 開啟注解掃描——對象和屬性 --> <context:component-scan base-package="com.swift"></context:component-scan> <!-- 開啟aop注解方法 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
日志文件log4j.properties,運行代碼能夠看清Spring配置文件執行細節
代碼如下:
#日志框架
#最早是System.out.print
#org.apache.log4j.Logger
#org.apache.commons.logging.Log
#java.util.logging.Logger
#org.slf4j.Logger 面向接口編程,選擇實現(選擇都使用這個)
#日志等級
#TRACE:詳細等級,堆棧信息
#debug:類似於System.out.print
#info:類似於Hibernate的show_sql
#warn:不影響運行, 只是提示
#error:出現異常
#全局日志等級配置,輸出位置
log4j.rootLogger=info,stdout,logfile
#stdout控制器
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#輸出格式
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]:%L - %m%n
#文件路徑輸出
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
#默認輸出到tomcat的根路徑或者運行測試工程的根路徑
log4j.appender.logfile.File=pss.log
log4j.appender.logfile.MaxFileSize=512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
#局部日志等級:就近原則
#log4j.logger.固定,后面添加想那個包使用不一樣的日志等級
#log4j.logger.cn.itsource.pss=debug