spring jdbc也是持久化層的技術,和mybatis是一個級別的,幫助我們簡化數據庫操作的。
一.舉例:spring jdbc 實現dept表的增刪改查
第一步:創建項目,引入jar包
jar包: spring 核心jar包 spring jdbc的jar包。spring jdbc 要使用數據源連接池,所以我們還要引入dbcp的jar包。
數據庫驅動包。

第二步:創建spring的主配置文件
spring jdbc 要使用數據源連接數據庫,我們需要先創建數據源連接池,這里我們使用dpcp數據源連接池:
<!--創建dbcp數據源連接池對象-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<!--驅動-->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<!--url-->
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<!--用戶名-->
<property name="username" value="scott"></property>
<!--密碼-->
<property name="password" value="tiger"></property>
</bean>
使用spring 的jdbc 一般會使用JdbcTemplate對象,我們在spring工廠中創建這個對象,這個對象有點像mybatis中
的SqlSession
<!--創建spring jdbc的JdbcTemplate對象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
第三步:創建實體類,dao層
創建實體類層
/** * 部門管理實體類 */ public class Dept { private Long deptno; private String dname; private String loc; public Long getDeptno() { return deptno; } public void setDeptno(Long deptno) { this.deptno = deptno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } }
創建DeptDAO.java
/** * 部門管理的dao接口 */ public interface DeptDao { /** * 保存部門 * @param dept */ public void save(Dept dept); /** * 刪除部門 * @param deptno */ public void delete(Long deptno); /** * 修改部門 * @param dept */ public void update(Dept dept); /** * 查詢所有部門 * @return */ public List<Dept> listAll(); /** * 根據主鍵查詢部門 * @param deptno * @return */ public Dept findByDeptno(Long deptno); }
創建dao接口的實現類DeptDaoImpl.java:
/** * 部門管理dao接口的實現 */ @Component public class DeptDaoImpl implements DeptDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public void save(Dept dept) { jdbcTemplate.update("insert into dept values(?,?,?)",dept.getDeptno(),dept.getDname(),dept.getLoc()); } @Override public void delete(Long deptno) { jdbcTemplate.update("delete from dept where deptno=?",deptno); } @Override public void update(Dept dept) { jdbcTemplate.update("update dept set dname=?,loc=? where deptno=?",dept.getDname(),dept.getLoc(),dept.getDeptno()); } //直接new接口的語法叫匿名內部類 //有的接口的實現類可能只需要使用一次,這種情況我們就不需要單獨再創建一下這個接口的實現類了 //可以直接使用匿名內容類來創建這個接口的實現類。 private RowMapper<Dept> rowMapper = new RowMapper<Dept>(){ //第二個參數代表取到數據的行的下標 @Override public Dept mapRow(ResultSet resultSet, int i) throws SQLException { Dept dept = new Dept(); dept.setDeptno(resultSet.getLong("deptno")); dept.setDname(resultSet.getString("dname")); dept.setLoc(resultSet.getString("loc")); return dept; } }; @Override public List<Dept> listAll() { List<Dept> list = jdbcTemplate.query("select * from dept", rowMapper); return list; } @Override public Dept findByDeptno(Long deptno) { Dept dept = jdbcTemplate.queryForObject("select * from dept where deptno=?", rowMapper, deptno); return dept; } }
記在spring 主配置文件中掃描dao包:
<!--掃描dao實現類的包-->
<context:component-scan base-package="com.aaa.springjdbc.dao"></context:component-scan>
第四步:測試
/** * 測試spring jdbc 增刪改查 */ public class Test01 { public static void main(String[] args) { //創建spring工廠類的對象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從工廠中獲取DeptDaoImpl的對象 DeptDao deptDao = context.getBean(DeptDao.class); //測試保存 Dept dept = new Dept(); dept.setDeptno(1L); dept.setDname("技術部"); dept.setLoc("鄭州"); deptDao.save(dept); //測試修改 dept.setDname("銷售部"); deptDao.update(dept); //根據主鍵查詢部門 Dept result = deptDao.findByDeptno(1L); System.out.println("部門編號為1的部門名稱為:"+result.getDname()); //查詢所有部門 List<Dept> depts = deptDao.listAll(); for (Dept d: depts) { System.out.println("部門編號:"+d.getDeptno()); System.out.println("部門名稱:"+d.getDname()); System.out.println("部門位置:"+d.getLoc()); System.out.println("==="); } //刪除部門 deptDao.delete(1L); } }
二.按名稱傳遞參數
剛才我們在DeptDaoImp中傳遞參數使用是按占位符的位置傳遞參數,我們也可以使用按名稱的方式傳遞參數,如
果需要按名稱傳遞參數,我們需要使用NamedParameterJdbcTemplate這類的對象,使用之前應該先在spring工
廠中創建這個類的對象:
<!--創建按名稱傳遞參數需要的jdbc模板對象 這個類中注入dataSource需要使用構造注入-->
<bean id="namedJdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean>
增加按名稱傳遞參數的dao的實現類對象DeptDaoMapper2.java:
/** * 部門管理dao接口的實現 */ @Component public class DeptDaoImpl2 implements DeptDao { @Autowired private NamedParameterJdbcTemplate jdbcTemplate; @Override public void save(Dept dept) { //需要把所有需要傳遞的參數封裝到Map中 HashMap<String, Object> map = new HashMap<>(); map.put("deptno",dept.getDeptno()); map.put("dname",dept.getDname()); map.put("loc",dept.getLoc()); jdbcTemplate.update("insert into dept values(:deptno,:dname,:loc)",map); } @Override public void delete(Long deptno) { HashMap<String, Object> map = new HashMap<>(); map.put("deptno",deptno); jdbcTemplate.update("delete from dept where deptno=:deptno",map); } @Override public void update(Dept dept) { HashMap<String, Object> map = new HashMap<>(); map.put("deptno",dept.getDeptno()); map.put("dname",dept.getDname()); map.put("loc",dept.getLoc()); jdbcTemplate.update("update dept set dname=:dname,loc=:loc where deptno=:deptno",map); } //直接new接口的語法叫匿名內部類 //有的接口的實現類可能只需要使用一次,這種情況我們就不需要單獨再創建一下這個接口的實現類了 //可以直接使用匿名內容類來創建這個接口的實現類。 private RowMapper<Dept> rowMapper = new RowMapper<Dept>(){ //第二個參數代表取到數據的行的下標 @Override public Dept mapRow(ResultSet resultSet, int i) throws SQLException { Dept dept = new Dept(); dept.setDeptno(resultSet.getLong("deptno")); dept.setDname(resultSet.getString("dname")); dept.setLoc(resultSet.getString("loc")); return dept; } }; @Override public List<Dept> listAll() { List<Dept> list = jdbcTemplate.query("select * from dept", rowMapper); return list; } @Override public Dept findByDeptno(Long deptno) { HashMap<String, Object> map = new HashMap<>(); map.put("deptno",deptno); Dept dept = jdbcTemplate.queryForObject("select * from dept where deptno=:deptno",map,rowMapper); return dept; } }