1. 程式人生 > 其它 >Spring JdbcTemplate簡介,百度筆試題目及答案

Spring JdbcTemplate簡介,百度筆試題目及答案

二、Spring??JdbcTemplate相對於hibernate優勢所在


本人在開發的過程中接觸比較多的是hibernate、mybatis。兩種持久層框架都感覺不盡如人意。hibernate就不說了為什麼很多人不願意用hibernate了?

mybatis是持久層的輕量級封裝,在mybatis中如果需要進行某一個操作,首先需要定義mapper,然後再定義mapper.xml。在mapper.xml中需要完成model對映,需要寫上介面相關的sql,這個過程作者認為重複性的工作比較多。如果能在java類中直接寫sql,同時還能進行簡單的物件操作,那麼程式將即擁有hibernate的部分優點,又能擁有mybatis的部分優點,豈不是很香,Spring??JdbcTemplate應運而生。

三、Spring??JdbcTemplate簡介


Spring對資料庫的操作在jdbc上面做了深層次的封裝,使用spring的注入功能,可以把DataSource註冊到JdbcTemplate中。

JdbcTemplate位於中。其全限定命名為org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemplate還需要一個這個包含了事務和異常控制。

四、JdbcTemplate提供的方法


1、execute方法

可以用於執行任何SQL語句,一般用於執行DDL語句。

2、update方法和batchUpdate方法

update方法用於執行新增、修改、刪除等語句;batchUpdate方法用於執行批量處理相關語句。

3、query方法及queryForXXX方法

用於執行查詢相關語句。

4、call方法

用於執行儲存過程、函式相關語句。

五、案例分析


1、在src下新建一個屬性配置檔案


jdbc.user=root

jdbc.password=123456

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.jdbcUrl=jdbc\:mysql\:///test

我們通常將資料庫的配置資訊單獨放到一個檔案中,這樣也為了方便後期維護。

2、配置Spring配置檔案applicationContext.xml


<context:property-placeholder location="classpath:db.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="user" value="${jdbc.user}"></property>

    <property name="password" value="${jdbc.password}"></property>

    <property name="driverClass" value="${jdbc.driverClass}"></property>

    <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>

</bean>

 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

    <property name="dataSource" ref="dataSource"></property>

</bean>

第一行程式碼:用來讀取db.properties檔案中的資料。

第二行程式碼:用來配置一個數據源,這裡資料實現類來此C3P0中的一個屬性類,其中屬性的值就是來自於db.properties。

第九行程式碼:配置一個JdbcTemplate例項,並注入一個dataSource資料來源。

3、update()方法

(1)通過update插入資料


//啟動IoC容器

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

//獲取IoC容器中JdbcTemplate例項

JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");

String sql="insert into user (name,deptid) values (?,?)";

int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3});

System.out.println(count);

這裡update方法,第二參可以為可變引數。在資料庫中可以看到,資料以被正確插入

(2)通過update修改資料


String sql="update user set name=?,deptid=? where id=?";

jdbcTemplate.update(sql,new Object[]{"zhh",5,51});

(3)通過update刪除資料


String sql="delete from user where id=?";

jdbcTemplate.update(sql,51);

4、batchUpdate()批量插入、更新和刪除方法

批量插入


String sql="insert into user (name,deptid) values (?,?)";

 

List<Object[]> batchArgs=new ArrayList<Object[]>();

batchArgs.add(new Object[]{"caoyc",6});

batchArgs.add(new Object[]{"zhh",8});

batchArgs.add(new Object[]{"cjx",8});

 

jdbcTemplate.batchUpdate(sql, batchArgs);

batchUpdate方法第二引數是一個元素為Object[]陣列型別的List集合。

5、從資料庫中讀取資料到實體物件

(1)先定義一個User實體類


package com.proc;

 

public class User {

    private Integer id;

    private String name;

    private Integer deptid;

    public Integer getId() {

        return id;

    }

    public void setId(Integer id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public Integer getDeptid() {

        return deptid;

    }

    public void setDeptid(Integer deptid) {

        this.deptid = deptid;

    }

 

    public String toString() {

        return "User [id=" + id + ", name=" + name + ", deptid=" + deptid + "]";

    }

}

(2)讀取單個物件


String sql="select id,name,deptid from user where id=?";

RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);

User user= jdbcTemplate.queryForObject(sql, rowMapper,52);

System.out.println(user);

輸出結果


User [id=52, name=caoyc, deptid=6]

注意:

  • 使用BeanPropertyMapper要求sql資料查詢出來的列和實體屬性需要一一對應。如果資料中列名和屬性名不一致,在sql語句中需要用as重新取一個別名。

  • 使用JdbcTemplate物件不能獲取關聯物件

最後

關於面試刷題也是有方法可言的,建議最好是按照專題來進行,然後由基礎到高階,由淺入深來,效果會更好。當然,這些內容我也全部整理在一份pdf文件內,分成了以下幾大專題:

  • Java基礎部分
  • 演算法與程式設計
  • 資料庫部分
  • 流行的框架與新技術(Spring+SpringCloud+SpringCloudAlibaba)

這份面試文件當然不止這些內容,實際上像JVM、設計模式、ZK、MQ、資料結構等其他部分的面試內容均有涉及,因為文章篇幅,就不全部在這裡闡述了。

作為一名程式設計師,階段性的學習是必不可少的,而且需要保持一定的持續性,這次在這個階段內,我對一些重點的知識點進行了系統的複習,一方面鞏固了自己的基礎,另一方面也提升了自己的知識廣度和深度。

最後提醒一下哦,如果你想要學習,卻無奈於沒有乾貨學習資料,只需你多多支援一下即可

CodeChina開源專案:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】