Spring 实现JdbcTemplate的CRUD操作

取得连接固然是一节非常兴奋的事情,但是最终依然要落实在表数据的操作上,若果要想操作数据表中的数据,可以使用"org.springframework.jdbc.core.JdbcTemplate",那么在这个类中提供有如下的方法:

        ●构造方法:public JdbcTemplate(DataSource dataSource) ;

        ●构造方法:public JdbcTemplate() ;

        ●设置数据源:public void setDataSource(DataSource dataSource)

        ●更新操作:public int update(String sql,Object... args)throws DataAccessException

        ●更新并取得ID:public int update(PreparedStatementCreator psc,KeyHolder generatedKeyHolder)throws DataAccessException

        ●查询全部操作:public <T> List<T> query(String sql,PreparedStatementSetter pss,RowMapper<T> rowMapper)throws DataAccessException

        ●查询数据返回List集合:public <T> List<T> queryForList(String sql,Object[] args,Class<T> elementType)throws DataAccessException

        ●查询单个数据:public <T> T queryForObject(String sql,Object[] args,Class<T> requiredType)throws DataAccessException

范例:实现数据的增加

package cn.jcn.demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
public class JdbcDemoB {
    public static void main(String[] args) throws SQLException {
        //1.数据库的连接必须首先处理
        DriverManagerDataSource source = new DriverManagerDataSource();
        source.setDriverClassName("com.mysql.jdbc.Driver");
        source.setUrl("jdbc:mysql://localhost:3306/test");
        source.setUsername("root");
        source.setPassword("123456");
        //2.处理JDBC的相关操作
        KeyHolder key = new GeneratedKeyHolder();//取得自动增长列,
        JdbcTemplate jt = new JdbcTemplate(source);
        final String sql = "insert into news(title,pubdate,content) values(?,?,?)";
        int count = jt.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection conn) 
                    throws SQLException {
                PreparedStatement pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
                pstmt.setString(1, "好好学习");
                pstmt.setDate(2, new java.sql.Date(new Date().getTime()));
                pstmt.setString(3, "天天向上");
                return pstmt;
            }
        },key);
        System.out.println("更新行数:" + count + "id:" + key.getKey());
        source.getConnection().close();
    }
}

通过这样一个简单的代码就可以发现,整个程序的处理过程是相当简单的,用户虽然与原始的JDBC没有脱离的太大,但是也实现了相同的功能,而且最为重要的是,整个代码操作过程之中,几乎感觉不到PrepaerdStatement与接口的操作,

        但是此时的的操作只适合于进行数据的简单保存,并不能够取得增长后的数据ID信息,那么如果想要取得增长后的ID信息要更换更新方法:public int update(PreparedStatementCreator psc,KeyHolder generatedKeyHolder)throws DataAccessException

这种接口一般都是利用匿名内部类的操作形式完成处理的。

范例:取得增长后的ID数据

package cn.jcn.demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
public class JdbcDemoB {
    public static void main(String[] args) throws SQLException {
        //1.数据库的连接必须首先处理
        DriverManagerDataSource source = new DriverManagerDataSource();
        source.setDriverClassName("com.mysql.jdbc.Driver");
        source.setUrl("jdbc:mysql://localhost:3306/test");
        source.setUsername("root");
        source.setPassword("123456");
        //2.处理JDBC的相关操作
        KeyHolder key = new GeneratedKeyHolder();//取得自动增长列,
        JdbcTemplate jt = new JdbcTemplate(source);
        final String sql = "insert into news(title,pubdate,content) values(?,?,?)";
        int count = jt.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection conn) 
                    throws SQLException {
                PreparedStatement pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
                pstmt.setString(1, "好好学习");
                pstmt.setDate(2, new java.sql.Date(new Date().getTime()));
                pstmt.setString(3, "天天向上");
                return pstmt;
            }
        },key);
        System.out.println("更新行数:" + count + "id:" + key.getKey());
        source.getConnection().close();
    }
}

在传入sql语句的时候一定要将Statement中的RETURN_GENERATED_KEYS一起传入进去.

        如果此时不取得这个增长后的ID,个人觉得还是稍微方便一点,但是一旦要取得了这个ID,那么事情就很麻烦.

更新操作完成之后,下面最重要的就是进行数据查询操作,但是如果要进行查询操作数据有一点比较麻烦,就是Spring里面并没有支持自动的查询结果与VO的转换,也就是说呢必须自己去完成一个转换器,

范例:定义一个News.java类

package cn.jcn.vo;
import java.util.Date;
public class News {
    private Integer nid;
    private String title;
    private Date pubDate;
    private String content;
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public Date getPubDate() {
        return pubDate;
    }
    public void setPubDate(Date pubDate) {
        this.pubDate = pubDate;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public Integer getNid() {
        return nid;
    }
    public void setNid(Integer nid) {
        this.nid = nid;
    }
}

而随后最重要的操作就是在查询处理上,必须使用RowMaper接口转换,这个接口定义如下

public interface RowMapper<T>{
    public T mapRow(ResultSet rs,int rowNum)throws SQLException
} 

这里面第一个参数表示数据查询后返回的ResultSet接口对象,利用这个接口对象可以取出查询结果,同时可以取得这次查询返回的当前的数据行。

范例:实现查询转换

package cn.jcn.demo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import cn.jcn.vo.News;
public class JdbcDemoD {
    public static void main(String[] args) throws SQLException {
        //1.数据库的连接必须首先处理
        DriverManagerDataSource source = new DriverManagerDataSource();
        source.setDriverClassName("com.mysql.jdbc.Driver");
        source.setUrl("jdbc:mysql://localhost:3306/test");
        source.setUsername("root");
        source.setPassword("123456");
        //2.处理JDBC的相关操作
        JdbcTemplate jt = new JdbcTemplate(source);
        final String sql = "select nid,title,pubdate,content from news where title like ? limit ?,?";
        List<News> news = jt.query(sql,new RowMapper<News>() {
            @Override
            public News mapRow(ResultSet rs, int arg1) throws SQLException {
                System.out.println("返回的行数:" + arg1);
                News vo = new News();
                vo.setNid(rs.getInt(1));
                vo.setTitle(rs.getString(2));
                vo.setPubDate(rs.getDate(3));
                vo.setContent(rs.getString(4));
                return vo;
            }
        },"%%",0,2);
        System.out.println(news);
    }
}

 以上的操作时属于实际开发之中,进行SQL数据与简单java类转换的标准过程,但是如果说现在你的查询里面只有单列数据,则可以使用更为简单的处理过程,例如:queryForList()方法,这个方法可以处理简单列它不能够处理vo转换.

范例:查询一组单列数据

package cn.jcn.demo;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class JdbcDemoE {
    public static void main(String[] args) throws SQLException {
        //1.数据库的连接必须首先处理
        DriverManagerDataSource source = new DriverManagerDataSource();
        source.setDriverClassName("com.mysql.jdbc.Driver");
        source.setUrl("jdbc:mysql://localhost:3306/test");
        source.setUsername("root");
        source.setPassword("123456");
        //2.处理JDBC的相关操作
        JdbcTemplate jt = new JdbcTemplate(source);
        final String sql = "select title from news where title like ? limit ?,?";
        List<String> news = jt.queryForList(sql,new Object[]{"%%"},String.class);
        System.out.println(news);
    }
}

但是在实际的编写过程之中还有一种数据量的操作于是最为常见的形式,

范例:统计数据量  

package cn.jcn.demo;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class JdbcDemoF {
    public static void main(String[] args) throws SQLException {
        //1.数据库的连接必须首先处理
        DriverManagerDataSource source = new DriverManagerDataSource();
        source.setDriverClassName("com.mysql.jdbc.Driver");
        source.setUrl("jdbc:mysql://localhost:3306/test");
        source.setUsername("root");
        source.setPassword("123456");
        //2.处理JDBC的相关操作
        JdbcTemplate jt = new JdbcTemplate(source);
        final String sql = "select count(*) from news";
        Integer integer = jt.queryForObject(sql,null,Integer.class);
        System.out.println(integer);
    }
}

对这个类的基本印象:

            ●简单的操作容易实现,但是一旦涉及到查询结果与VO的转换,那么这个类支持就变得很麻烦

            ●JdbcTemplate是针对于JDBC标准的轻量级封装,所有JDBC的操作在此类中非常清晰可见,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值