spring的jdbc


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;
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM