Spring JdbcTemplate使用實例

簡介

  • JdbcTemplate是Spring提供的訪問數(shù)據(jù)庫的方式之一缓升,是Spring中最基本痴奏、最底層的訪問數(shù)據(jù)庫的實現(xiàn)方式。
  • 通過使用JdbcTemplate湃鹊,開發(fā)者無需關(guān)心數(shù)據(jù)庫連接的創(chuàng)建和關(guān)閉細(xì)節(jié)冕香,只需要專注于實現(xiàn)業(yè)務(wù)邏輯即可蛹尝。
  • 在使用JdbcTemplate的時候,只需要聲明即可悉尾,無需自己初始化突那,因為Spring在初始化數(shù)據(jù)源datasource的時候會自己創(chuàng)建JdbcTemplate的實例。

準(zhǔn)備

首先构眯,我們需要新建一個Spring Boot工程愕难,然后需要引入web、jdbc模塊惫霸,還需要mysql的java驅(qū)動包猫缭。在pom文件中表現(xiàn)如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

PS:web模塊的引入是必須的,否則運(yùn)行報錯它褪。

然后饵骨,我們需要配置數(shù)據(jù)源翘悉,在application.properties中配置如下信息:

#GMT%2B8代表東八區(qū)
spring.datasource.url=jdbc:mysql://localhost:3306/test01?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
#無需再手動指定驅(qū)動類型
#Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver

PS:數(shù)據(jù)庫的驅(qū)動類無需再人為手動指定茫打,系統(tǒng)會自動加載。

其后,我們需要創(chuàng)建好數(shù)據(jù)庫和表老赤,并插入數(shù)據(jù)轮洋,然后準(zhǔn)備一個Java實體類,這部分不是本文重點抬旺,此處略過弊予。

最后,在使用JdbcTemplate之前开财,我們需要在service實現(xiàn)類中聲明它:

@Service
public class StudentServiceImpl implements StudentService {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
}

JdbcTemplate的實例化由Spring自動創(chuàng)建汉柒,開發(fā)人員直接使用即可。

我們使用單元測試來驗證程序執(zhí)行的正確性责鳍,為此碾褂,需要準(zhǔn)備如下的測試類:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = BootJdbcApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class StudentServiceImplTest {

    @Autowired
    private StudentService studentService;
    
}

一、查詢

1.1 查詢記錄數(shù)

    @Override
    public int countStudentByName(String name) {
        String sql = "select count(*) from test_student where name = ?";
        return this.jdbcTemplate.queryForObject(sql, Integer.class, name);
    }
    @Test
    public void countStudent(){
        Integer cnt = studentService.countStudentByName("Jack");
        assertEquals(new Integer("2"), cnt);
    }

1.2 查詢對象

關(guān)于如下實例中Row Mapper的使用可以參考下一篇文章《Spring JdbcTemplate中關(guān)于RowMapper的使用實例》历葛。

    @Override
    public Student getStudentByName(String name) {
        String sql = "select name, gender from test_student where name = ?";
        Student student = this.jdbcTemplate.queryForObject(sql, new Object[]{name}, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet rs, int i) throws SQLException {
                Student s = new Student();
                s.setName(rs.getString("name"));
                s.setGender(rs.getString("gender"));
                return s;
            }
        });
        return student;
    }
    @Test
    public void getStudentByName(){
        Student student = studentService.getStudentByName("李白");
        assertEquals("李白",student.getName());
        assertEquals("男",student.getGender());
    }

1.3 查詢對象列表

    @Override
    public List<Student> getStudentsByName(String name) {
        String sql = "select name, gender from test_student where name = ?";
        List<Student> students = this.jdbcTemplate.query(sql, new Object[]{name}, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet rs, int i) throws SQLException {
                Student s = new Student();
                s.setName(rs.getString("name"));
                s.setGender(rs.getString("gender"));
                return s;
            }
        });
        return students;
    }
    @Test
    public void getStudentsByName(){
        List<Student> studentList = studentService.getStudentsByName("Jack");
        assertTrue(2 == studentList.size());
    }

二正塌、新增

    @Override
    public int addStudent(Student student) {
        String sql = "insert into test_student(name,gender,age,address,email,grade)values(?,?,?,?,?,?)";
        return jdbcTemplate.update(sql, student.getName(), student.getGender(), student.getAge(), student.getAddress(), student.getEmail(), student.getGrade());
    }
   @Test
    public void addStudent() {
        Student student = new Student();
        student.setName("Jack");
        student.setGender("男");
        student.setAddress("NewYork");
        student.setEmail("123@qq.com");
        student.setGrade("3");
        int num = studentService.addStudent(student);
        assertEquals(Integer.parseInt("1"), num);
    }

三、更新

    @Override
    public int updateStudentGenderByName(String gender, String name) {
        String sql = "update test_student set gender = ? where name = ?";
        return jdbcTemplate.update(sql, gender, name);
    }
    @Test
    public void updateStudentGenderByName() {
        Integer cnt = studentService.updateStudentGenderByName("male", "李白");
        assertEquals(new Integer("1"), cnt);
    }

四恤溶、刪除

    @Override
    public int deleteStudentByName(String name) {
        String sql = "delete from test_student where name = ?";
        return jdbcTemplate.update(sql, name);
    }
    @Test
    public void deleteStudentByName(){
        Integer cnt = studentService.deleteStudentByName("Jack");
        assertEquals(new Integer("2"), cnt);
    }

本文只是簡單列舉Spring中關(guān)于JdbcTemplate的簡單使用實例乓诽,關(guān)于RowMapper和更多的數(shù)據(jù)庫實現(xiàn)方式可以參考后續(xù)的其它文章。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咒程,一起剝皮案震驚了整個濱河市鸠天,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帐姻,老刑警劉巖粮宛,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卖宠,居然都是意外死亡巍杈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門扛伍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筷畦,“玉大人,你說我怎么就攤上這事刺洒”畋觯” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵逆航,是天一觀的道長鼎文。 經(jīng)常有香客問我,道長因俐,這世上最難降的妖魔是什么拇惋? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任周偎,我火速辦了婚禮,結(jié)果婚禮上撑帖,老公的妹妹穿的比我還像新娘蓉坎。我一直安慰自己,他們只是感情好胡嘿,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布蛉艾。 她就那樣靜靜地躺著,像睡著了一般衷敌。 火紅的嫁衣襯著肌膚如雪勿侯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天缴罗,我揣著相機(jī)與錄音罐监,去河邊找鬼。 笑死瞒爬,一個胖子當(dāng)著我的面吹牛弓柱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侧但,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼矢空,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了禀横?” 一聲冷哼從身側(cè)響起屁药,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柏锄,沒想到半個月后酿箭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趾娃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年缭嫡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抬闷。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡妇蛀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笤成,到底是詐尸還是另有隱情评架,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布炕泳,位于F島的核電站纵诞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏培遵。R本人自食惡果不足惜浙芙,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一登刺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茁裙,春花似錦塘砸、人聲如沸节仿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廊宪。三九已至矾瘾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箭启,已是汗流浹背壕翩。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留傅寡,地道東北人放妈。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像荐操,于是被迫代替她去往敵國和親芜抒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao閱讀 4,680評論 0 9
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架托启。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,445評論 1 133
  • 蘇霍姆林斯基在文章《要使知識“活”起來》里說過只有當(dāng)知識變成精神生活的因素宅倒,吸引人的思想,激發(fā)人的興趣和熱...
    東營彩霞滿天閱讀 847評論 1 1
  • 昨天老公要回北京開始上班了屯耸,很不舍得拐迁,結(jié)婚兩年,總共在一起的時間也沒有半年疗绣,每回來一次待個三四天就走了线召,人們都說小...
    Rainy李閱讀 623評論 0 1
  • 總是希望,光陰能夠慢下來多矮,日子能夠簡而又簡灶搜。光陰的故事里,每一秒都能開出繁花朵朵工窍。閑下來的光陰里割卖,會多一些時...
    那些年聆聽的閱讀 182評論 0 0