Java——JDBC Template

1.JDBC Template概念

为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件。
传统操作方式:

使用JDBC Template操作方式:

JDBC Template提供统一的模板方法,在保留代码灵活性的基础上,尽量减少持久化代码。

基于JDBC的API的开发案例:

String sql = "select * from user";
Statement stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery(sql);
while (resultSet.next()){
    int uid = resultSet.getInt("uid");
    String name = resultSet.getString("name");
    String mobile = resultSet.getString("mobile");
    String addr = resultSet.getString("addr");
    System.out.println(uid+"  "+name+"  "+mobile+"  "+addr);
}

基于JDBC Template的开发案例:
Integer count = jt.queryForObject("select * from user",Integer.class);

2.环境依赖

(1)依赖导入

<properties>
    <spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.44</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>
</dependencies>

(2)bean配置

<?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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://148.70.251.10:3306/selection_course?useUnicode=yes&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

3.简单使用

1)execute方法——一般用来执行DDL语句,与表操作相关

@org.junit.Test
public void testExecute(){
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
    jdbcTemplate.execute("create table test(id int,name varchar(32))");
}

2)update与batchUpdate方法——对数据进行增删改

将jdbcTemplate提取出来,方便后面多次利用。

private JdbcTemplate jdbcTemplate;
{
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
}

(1)update:对数据进行增删改操作

  int update(String sql, Object[] args)
  int update(String sql, Object... args)

@org.junit.Test
public void testExecute(){
    jdbcTemplate.execute("create table test(id int,name varchar(32))");
}

@org.junit.Test
public void testUpdate(){
    String sql = "insert into student(name,sex) values(?,?)";
    jdbcTemplate.update(sql,new Object[]{"ming","boy"});
}

(2)batchUpdate方法:批量增删改操作

  int[] batchUpdate(String[] sql)
  int[] batchUpdate(String sql, List<Object[]>)

@org.junit.Test
public void testBatchUpdate(){
    String[] sqls = {
            "insert into student(name,sex) values(‘kebi‘,‘boy‘)",
            "insert into student(name,sex) values(‘maoxian‘,‘boy‘)",
            "insert into student(name,sex) values(‘jiaqi‘,‘girl‘)",
            "insert into student(name,sex) values(‘xue‘,‘girl‘)",
            "update student set name=‘xuejiaqi‘ where name=‘xue‘"
    };
    int[] ret = jdbcTemplate.batchUpdate(sqls);
    System.out.println(ret);
}

@org.junit.Test
public void testBatchUpdate2(){
    String sql = "insert into selection(student,course) values(?,?)";
    List<Object[]> list =  new ArrayList<Object[]>();
    list.add(new Object[]{2001,1001});
    list.add(new Object[]{2002,1003});
    int[] ret = jdbcTemplate.batchUpdate(sql, list);
    for (int r: ret){
        System.out.println(r);  //返回值1表示成功
    }
}

3)query与queryXXX方法——对数据进行查询操作

查询简单数据项
(1)获取一个
  T queryForObject(String sql, Class<T> type)
  T queryForObject(String sql, Class[] args, Class<T> type)
  T queryForObject(String sql, Class<T> type, Object... args)

(2)获取多个
  List<T> queryForList(String sql, Class<T> type)
  List<T> queryForList(String sql, Object[] args, Class<T> type)
  LIst<T> queryForList(String sql, Class<T> type, Object... args)

简单示例:

    //查询单个数据
    @org.junit.Test
    public void testQuerySimple(){
        String sql = "select count(*) from student";
        int count = jdbcTemplate.queryForObject(sql, Integer.class);
        System.out.println(count);  //4
    }

    //查询多个数据
    @org.junit.Test
    public void testQuerySimple2(){
        String sql = "select NAME from student";
        List<String> names = jdbcTemplate.queryForList(sql,String.class);
        System.out.println(names);
    }

    //查询一个对象
    @org.junit.Test
    public void testQueryMap(){
        String sql = "select * from student where id = ?";
        Map<String,Object> s =jdbcTemplate.queryForMap(sql,2001);
        System.out.println(s);  //{id=2001, name=ming_test, sex=boy, born=null}
    }

    //查询多个对象
    @org.junit.Test
    public void testQueryMap2(){
        String sql = "select * from student";
        List<Map<String,Object>> s =jdbcTemplate.queryForList(sql);
        System.out.println(s);
//        [{id=2001, name=ming_test, sex=boy, born=null},
//        {id=2002, name=kebi, sex=boy, born=null},
//        {id=2003, name=maoxian, sex=boy, born=null},
//        {id=2005, name=xuejiaqi, sex=girl, born=null}]

    }

如果将查询结果进行映射了?这样方面后期的数据处理。
封装一条数据:

public void testQueryEntity(){
    String sql = "select * from student where id = ?";
    Student stu = jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
        public Student mapRow(ResultSet resultSet, int i) throws SQLException {
            Student stu = new Student();
            stu.setId(resultSet.getInt("id"));
            stu.setName(resultSet.getString("name"));
            stu.setSex(resultSet.getString("sex"));
            stu.setBorn(resultSet.getDate("born"));
            return stu;
        }
    }, 2001);
    System.out.println(stu);  //Student{2001,ming_test,boy,null}
}

封装多条数据:

@org.junit.Test
public void testQueryEntity2(){
    String sql = "select * from student";
    List<Student> list = jdbcTemplate.query(sql, new RowMapper<Student>() {
        public Student mapRow(ResultSet resultSet, int i) throws SQLException {
            Student stu = new Student();
            stu.setId(resultSet.getInt("id"));
            stu.setName(resultSet.getString("name"));
            stu.setSex(resultSet.getString("sex"));
            stu.setBorn(resultSet.getDate("born"));
            return stu;
        }
    });
    System.out.println(list);
}

可以将rowmapper封装成一个对象:

@org.junit.Test
public void testQueryEntity(){
    String sql = "select * from student where id = ?";
    Student stu = jdbcTemplate.queryForObject(sql, new StudentRowMapper(), 2001);
    System.out.println(stu);  //Student{2001,ming_test,boy,null}
}

@org.junit.Test
public void testQueryEntity2(){
    String sql = "select * from student";
    List<Student> list = jdbcTemplate.query(sql, new StudentRowMapper());
    System.out.println(list);
}
private class StudentRowMapper implements RowMapper<Student>{
    public Student mapRow(ResultSet resultSet, int i) throws SQLException {
        Student stu = new Student();
        stu.setId(resultSet.getInt("id"));
        stu.setName(resultSet.getString("name"));
        stu.setSex(resultSet.getString("sex"));
        stu.setBorn(resultSet.getDate("born"));
        return stu;
    }
}

4.JDBC Template持久层示例

(1)接口类

//定义student查询接口
public interface StudentDao {
    void insert(Student stu);
    void update(Student stu);
    void delete(int id);
    Student select(int id);
    List<Student> selectAll();
}

public class Student {
    private int id;
    private String name;
    private String sex;
    private Date born;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBorn() {
        return born;
    }

    public void setBorn(Date born) {
        this.born = born;
    }

    @Override
    public String toString() {
        return "Student{" +id+","+name+","+sex+","+born +"}";
    }
}

(2)持久层代码开发,之后都可以调用这里面的接口

@Repository  //声明持久化对象
public class StudentDaoImpl implements StudentDao {

    @Autowired  //自动注入
    private JdbcTemplate jdbcTemplate;

    public void insert(Student stu) {
        String sql = "insert into student(name,sex,born) values(?,?,?)";
        jdbcTemplate.update(sql,stu.getName(),stu.getSex(),stu.getBorn());
    }

    public void update(Student stu) {
        String sql = "update student set name=?,sex=?,born=? where id=?";
        jdbcTemplate.update(sql,stu.getName(),stu.getSex(),stu.getBorn(),stu.getId());
    }

    public void delete(int id) {
        String sql = "delete from student where id=?";
        jdbcTemplate.update(sql,id);
    }

    public Student select(int id) {
        String sql = "select * from student where id=?";
        return jdbcTemplate.queryForObject(sql,new StudentRowMapper(),id);
    }

    public List<Student> selectAll() {
        String sql = "select * from student";
        return jdbcTemplate.query(sql,new StudentRowMapper());
    }

    private class StudentRowMapper implements RowMapper<Student> {
        public Student mapRow(ResultSet resultSet, int i) throws SQLException {
            Student stu = new Student();
            stu.setId(resultSet.getInt("id"));
            stu.setName(resultSet.getString("name"));
            stu.setSex(resultSet.getString("sex"));
            stu.setBorn(resultSet.getDate("born"));
            return stu;
        }
    }
}

原文地址:https://www.cnblogs.com/yangmingxianshen/p/12521048.html

时间: 2024-11-06 13:36:08

Java——JDBC Template的相关文章

Unit06: Spring对JDBC的 整合支持 、 Spring+JDBC Template、Spring异常处理

Unit06: Spring对JDBC的 整合支持 . Spring+JDBC Template .Spring异常处理 1. springmvc提供的异常处理机制 我们可以将异常抛给spring框架,让spring来帮我们处理异常. (1)使用简单异常处理器 step1. 配置简单异常处理器. step2. 添加对应的异常处理页面. 注:该方式只适合处理简单异常的处理,如果要对异常做复杂处理,比如 记录日志等,则不合适了. (2)使用@ExceptionHandler注解 step1. 在处理

Spring之JDBC Template

时间:2017-2-5 18:16 --Spring对不同持久化技术的支持 Spring为各种支持的持久化技术都提供了简单操作的模板和回调. ORM持久化技术:    JDBC:        org.springframework.jdbc.core.JdbcTemplate Hibernate3.0:        org.springframework.orm.hibernate3.HibernateTemplate IBatis(MyBatis):        org.springfr

Java JDBC高级特性

1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现了批处理.测试表结构如下: Statement批处理程序示例 1 package server; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 impor

Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 及sql2008外围服务器

转载:Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 错误原因如下: Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConver

java jdbc 连接mysql数据库 实现增删改查

好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的

第15篇-JAVA JDBC编程

第15篇-JAVA JDBC编程 每篇一句 :对于勇敢者,尝试是一条崭新的生活之路 初学心得: 但对于坎坷与泥泞,能以平常之心视之,就非常不容易 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-08| JAVA JDBC编程 ] 1.JDBC概述 通过使用JDBC API,Java程序可以非常方便地操作各种主流数据库,这是是Java语言的巨大魅力所在 由于Java语言的跨平台特性,所以使用JDBC API所编写的程序不仅可以实现跨数据库,还可以跨平台,具有非常优秀的可移植性

java JDBC 数据库链接

1.准备环境搭建: myeclipse,sql2005,jdbc. 2.都下载完之后开始进行安装 ,前两个是属于数据库软件,正常安装即可(注意数据库登陆不要使用windows验证) <1> 将JDBC解压缩到任意位置,比如解压到C盘program files下面,并在安装目录里找到sqljdbc.jar文件,得到其路径开始配置环境变量 在环境变量classpath 后面追加 C:\Program Files\Microsoft SQL Server2005 JDBC Driver\sqljdb

java jdbc操作SQLServer数据库

public static void main(String args[]){         System.out.println(321);         PreparedStatement ps = null;         ResultSet rs = null;         Connection ct = null;         try{             Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDri

java jdbc操作mysql

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet; public class test {    public static final String DBDRIVER = "com.mysql.jdbc.Driver";    // 定义MySQL数据库的连接地址    public static fi