使用该工具类需要从spring开发包中导入spring.jar和commons-logging.jar,这个模板是线程安全的。

 

JdbcTemplate:

public class JdbcTemplateTest {

    static JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());

    /**
     * @param args
     */
    public static void main(String[] args) {
        User user = findUser("zhangsan");
        // System.out.println("user:" + user);

        // System.out.println("users:" + findUsers(3));

        // System.out.println("user count:" + getUserCount());

        // System.out.println("user name:" + getUserName(1));

        System.out.println("data:" + getData(1));
    }

    static int addUser(final User user) {
        jdbc.execute(new ConnectionCallback() {//想在插入的时候取主键,回调

            public Object doInConnection(Connection con) throws SQLException, DataAccessException {
                String sql = "insert into user(name,birthday, money) values (?,?,?) ";
                PreparedStatement ps = con.prepareStatement(sql,
                        Statement.RETURN_GENERATED_KEYS);
                ps.setString(1, user.getName());
                ps.setDate(2, new java.sql.Date(user.getBirthday().getTime()));
                ps.setFloat(3, user.getMoney());
                ps.executeUpdate();

                ResultSet rs = ps.getGeneratedKeys();
                if (rs.next())
                    user.setId(rs.getInt(1));
                return null;
            }
        });
        return 0;
    }

    static Map getData(int id) {
        String sql = "select id as userId, name, money, birthday  from user where id="
                + id;
        return jdbc.queryForMap(sql);
    }

    static String getUserName(int id) {
        String sql = "select name from user where id=" + id;
        Object name = jdbc.queryForObject(sql, String.class);
        return (String) name;
    }

    static int getUserCount() {
        String sql = "select count(*) from user";
        return jdbc.queryForInt(sql);//直接把结果返回成int型,也可以查询最大值平均值之类的
    }

    static List findUsers(int id) {
        String sql = "select id, name, money, birthday  from user where id<?";
        Object[] args = new Object[] { id };
        int[] argTypes = new int[] { Types.INTEGER };
        List users = jdbc.query(sql, args, argTypes, new BeanPropertyRowMapper(
                User.class));//查询结果是多条记录
        return users;
    }

    static User findUser(String name) {
        String sql = "select id, name, money, birthday  from user where name=?";
        Object[] args = new Object[] { name };
        Object user = jdbc.queryForObject(sql, args, new BeanPropertyRowMapper(
                User.class));//queryForObject查询如果查不到数据或者多于一条数据会报错
        return (User) user;
    }

    static User findUser1(String name) {
        String sql = "select id, name, money, birthday  from user where name=?";
        Object[] args = new Object[] { name };
        Object user = jdbc.queryForObject(sql, args, new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                user.setMoney(rs.getFloat("money"));
                user.setBirthday(rs.getDate("birthday"));
                return user;
            }
        });
        return (User) user;
    }
}

 

 

 

NamedParameterJdbcTemplate :包含JdbcTemplate的功能,特点是可以解析sql语句中的非?参数,而且可以直接用sql去匹配bean中的属性。

public class NamedJdbcTemplate {
    static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(
            JdbcUtils.getDataSource());

    /**
     * @param args
     */
    public static void main(String[] args) {
        User user = new User();
        user.setMoney(10);
        user.setId(2);
        System.out.println(findUser1(user));
    }

    static void addUser(User user) {
        String sql = "insert into user(name,birthday, money) values (:name,:birthday,:money) ";
        SqlParameterSource ps = new BeanPropertySqlParameterSource(user); //使用bean来设置sql中的参数
        KeyHolder keyHolder = new GeneratedKeyHolder(); 
        named.update(sql, ps, keyHolder); //获取主键
        int id = keyHolder.getKey().intValue();
        user.setId(id);
       
        Map map = keyHolder.getKeys(); //如果主键是多个,可以用该方法获取成Map映射
    }

    static User findUser(User user) {
        String sql = "select id, name, money, birthday  from user "
                + "where money > :m and id < :id";
        Map params = new HashMap();
        // params.put("n", user.getName());
        params.put("m", user.getMoney());
        params.put("id", user.getId()); //使用Map来设置sql的参数
        Object u = named.queryForObject(sql, params, new BeanPropertyRowMapper(
                User.class)); //第三个参数是一个映射器,将获取的数据映射给Bean
        return (User) u;
    }

    static User findUser1(User user) {
        String sql = "select id, name, money, birthday  from user "
                + "where money > :money and id < :id";
        SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
        Object u = named.queryForObject(sql, ps, new BeanPropertyRowMapper(
                User.class));
        return (User) u;
    }

}

 

 

 

 

SimpleJdbcTemplate:在前两者基础上支持了可变参数和泛型

public class SimpleJdbcTemplateTest {
    static SimpleJdbcTemplate simple = new SimpleJdbcTemplate(JdbcUtils
            .getDataSource());

    static User find(String name) {
        String sql = "select id, name, money, birthday  from user where name=? and money > ?";
        User user = simple.queryForObject(sql,
                ParameterizedBeanPropertyRowMapper.newInstance(User.class),
                name, 100f);
        return user;
       
        //simple.getNamedParameterJdbcOperations().update(sql,paramSource,keyHolder);先获取NamedJdbcTemplate模板,再获取主键
        //simple.getJdbcOperations()获取JdbcTemplate
    }

}

 

 

 

上面代码引用的自定义工具类的代码:

public final class JdbcUtils {
    private static String url = "jdbc:mysql://localhost:3306/jdbc";
    private static String user = "root";
    private static String password = "";
    private static DataSource myDataSource = null;

    private JdbcUtils() {
    }

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            // myDataSource = new MyDataSource2();
            Properties prop = new Properties();
            // prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
            // prop.setProperty("user", "user");

            InputStream is = JdbcUtils.class.getClassLoader()
                    .getResourceAsStream("dbcpconfig.properties");
            prop.load(is);
            myDataSource = BasicDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public static DataSource getDataSource() {
        return myDataSource;
    }

    public static Connection getConnection() throws SQLException {
        // return DriverManager.getConnection(url, user, password);
        return myDataSource.getConnection();
    }

    public static void free(ResultSet rs, Statement st, Connection conn) {
        try {
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (st != null)
                    st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if (conn != null)
                    try {
                        conn.close();
                        // myDataSource.free(conn);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
        }
    }
}

JDBC JdbTemplate&NamedParameterJdbcTemplate(Spring工具类)的更多相关文章

  1. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入

    一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...

  2. spring 工具类大集合

    接以前的文章 apache-commons 常用工具类 和文章 apache-commons 工具类扩展 小家 Spring 对 spring 的工具类做了详细的介绍(一) 这里我抽出一些好用的类,不 ...

  3. Spring工具类 非spring管理环境中获取bean及环境配置

    SpringUtils.java import org.springframework.beans.BeansException; import org.springframework.beans.f ...

  4. Spring工具类:WebApplicationContextUtils

    当 Web 应用集成 Spring 容器后,代表 Spring 容器的WebApplicationContext对象将以 WebApplicationContext.ROOT_WEB_APPLICAT ...

  5. spring工具类获取bean

    import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebAppl ...

  6. 借助Spring工具类如何实现支持数据嵌套的赋值操作

    假设有两个Bean A和B,想将B中的属性赋值到A实体中,可以使用get set来实现,当属性过多时,就会显得很冗余,可以使用spring提供的BeanUtils.copyProperties()来实 ...

  7. 你可能用到的Spring工具类?

    现在绝大部分项目都已经拥抱Spring生态,掌握Spring常用的工具类,是非常重要,零成本增加编码效率. 一.常用工具类 ObjectUtils org.springframework.util.O ...

  8. MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题

    JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...

  9. Spring工具类ToStringBuilder用法简介

    比如说我们需要打印某个方法的User参数对象 package test; /** * * @author zhengtian * @time 2012-6-28 */ public class Use ...

随机推荐

  1. JDK源码(1.7) -- java.util.Queue<E>

    java.util.Queue<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...

  2. CROC 2016 - Qualification C. Hostname Aliases map

    C. Hostname Aliases 题目连接: http://www.codeforces.com/contest/644/problem/C Description There are some ...

  3. Windows蓝屏dump文件查看器(转)

    Windbg-分析Windows蓝屏原因利器[转]下载地址先声明下,虽然用windbg诊断蓝屏之前网络上已经有人发过教程了,但就我而言, 学会使用windbg来诊断蓝屏也算是自己的原创吧.以前看一个微 ...

  4. Codeforces Round #247 (Div. 2) ABC

    Codeforces Round #247 (Div. 2) http://codeforces.com/contest/431  代码均已投放:https://github.com/illuz/Wa ...

  5. Ubuntu 16.04安装cuda7.5 GCC

    http://www.linuxidc.com/Linux/2017-01/139320.htm 在介绍Ubuntu 16.04安装 CUDA7.5开始前,先辨析几个概念GPU.NVIDIA.NVID ...

  6. picker.js源码

    /** * LArea移动端城市选择控件 * * version:1.7.2 * * author:黄磊 * * git:https://github.com/xfhxbb/LArea * * Cop ...

  7. wget 下载文件重进行命名

    wget在下载的时候就重命名的: wget -c "www.baidu.com" -O baidu.index.html 保存输出日至,可以使用: wget -c "ww ...

  8. C#编程兵书

    <C#编程兵书> 基本信息 作者: 张志强 胡君 丛书名: 程序员藏经阁 出版社:电子工业出版社 ISBN:9787121207402 上架时间:2013-8-26 出版日期:2013 年 ...

  9. mysql TO_DAYS()函数

    TO_DAYS(date)给定一个日期date, 返回一个天数 (从年份0开始的天数 ).   例: select TO_DAYS(NOW()); +----------------+ | TO_DA ...

  10. [Android Pro] Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角

    RoundedBitmapDrawable 是 supportV4 下的一个类,有了它,显示圆角和圆形图片的情况下就不需要额外的第三方类库了,还能和各种图片加载库配合使用. 背景 今天无意间看到一段实 ...