• Spring JDBC


    ---恢复内容开始---

    JdbcTemplate是线程安全的,所有Dao可以共享一个JdbcTemplate实例

    举例

     1 package org.zln.module_SpringJdbc.dao;
     2 
     3 import org.springframework.jdbc.core.JdbcTemplate;
     4 import org.springframework.jdbc.datasource.DriverManagerDataSource;
     5 
     6 /**
     7  * Created by sherry on 000006/7/6 9:51.
     8  */
     9 public class TUserDao {
    10 
    11     /*Spring JDBC创建表的例子*/
    12     public void createTable(){
    13         DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
    14         driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
    15         driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/JavaWeb");
    16         driverManagerDataSource.setUsername("root");
    17         driverManagerDataSource.setPassword("123456");
    18 
    19         JdbcTemplate jdbcTemplate = new JdbcTemplate();
    20         jdbcTemplate.setDataSource(driverManagerDataSource);
    21 
    22         String sql = " CREATE table t_user(user_id int primary key,user_name varchar(60)) ";
    23         jdbcTemplate.execute(sql);
    24 
    25     }
    26 }
    D:GitHub oolsJavaEEDevelopLesson17_JavaWebDemosrcorgzlnmodule_SpringJdbcdaoTUserDao.java

    当然,实际开发中不可能为每个方法创建一个JdbcTemplate实例

    JdbcTemplate是对JDBC的一个浅浅的封装,但是大大方便了开发

    Spring为几乎所有的模板类都提供了相应的支持类,和JdbcTemplate对应的支持类为JdbcDaoSupport。其内部定义了JdbcTemplate成员变量。我们可以通过扩展JdbcDaoSupport定义自己的Dao。

    但现在Bean的注解已经成为主流,直接继承JdbcDaoSupport无法对JdbcTemplate成员变量使用注解。所以一般的做法是:自己定义一个Dao,在Dao中定义JdbcTemplate成员变量,打上注解。

    实际项目中,还会在Dao中增加其它通用的功能,如声明JdbcTemplate,分页查询等

     1 package org.zln.dao;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.jdbc.core.JdbcTemplate;
     5 import org.springframework.stereotype.Repository;
     6 
     7 /**
     8  * Created by sherry on 000006/7/6 10:03.
     9  */
    10 @Repository("baseDao")
    11 public class BaseDao {
    12 
    13     @Autowired
    14     private JdbcTemplate jdbcTemplate;
    15     
    16 }
    BaseDao

    JDBC细节:

      JdbcTemplate内部通过PreparedStatement执行SQL语句,所以我们使用绑定参数的SQL,不会产生SQL注入问题。绑定参数索引从1开始,不是0

      在DAO中尽量使用类级别的静态常量(final static)定义SQL字符串,不应在方法内部声明SQL字符串常量,提高JVM内存使用效率

    更新操作

      

     1 package org.zln.module_SpringJdbc.dao;
     2 
     3 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
     4 import org.springframework.stereotype.Repository;
     5 import org.zln.dao.BaseDao;
     6 import org.zln.module_SpringJdbc.domain.Forum;
     7 
     8 import java.sql.Types;
     9 
    10 /**
    11  * Created by sherry on 000006/7/6 10:08.
    12  */
    13 @Repository("forumDao")
    14 public class ForumDao extends BaseDao{
    15 
    16     public void addForm(Forum forum){
    17         final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
    18         final Object[] params = new Object[]{forum.getForumName(),
    19                 forum.getForumDesc()};
    20         jdbcTemplate.update(sql, params,
    21                 new int[]{Types.VARCHAR, Types.VARCHAR});
    22     }
    23 
    24     public void addForum(final Forum forum) {
    25         final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(:forumName,:forumDesc)";
    26         // 使用BeanPropertySqlParameterSource参数源
    27         // SqlParameterSource sps = new BeanPropertySqlParameterSource(forum);
    28         // 使用MapSqlParameterSource参数名
    29         MapSqlParameterSource sps = new MapSqlParameterSource().
    30                 addValue("forumName", forum.getForumName()).
    31                 addValue("forumDesc",forum.getForumDesc());
    32         jdbcTemplate.update(sql, sps);
    33     }
    34 }
    ForumDao

    返回数据库的表自增主键

      Hibernate等ORM框架中,保存对象的时候,如果主键是自增的(MySQL),会自动将自增的主键绑定到对象中。JDBC也可以。

      在JDBC3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement

     1     public void addForm(Forum forum){
     2         final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
     3 
     4 
     5         KeyHolder keyHolder = new GeneratedKeyHolder();
     6         jdbcTemplate.update(new PreparedStatementCreator() {
     7             @Override
     8             public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
     9                 PreparedStatement preparedStatement = connection.prepareStatement(sql);
    10                 preparedStatement.setString(1,forum.getForumName());
    11                 preparedStatement.setString(2,forum.getForumDesc());
    12                 return preparedStatement;
    13             }
    14         },keyHolder);
    15         forum.setForumId(keyHolder.getKey().intValue());
    16        
    17     }
    ForumDao

    批量更改

     1     public void addForums(final List<Forum> forums) {
     2         final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
     3         getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
     4             public int getBatchSize() {
     5                 return forums.size();
     6             }
     7             public void setValues(PreparedStatement ps, int index)
     8                     throws SQLException {
     9                 Forum forum = forums.get(index);
    10                 ps.setString(1, forum.getForumName());
    11                 ps.setString(2, forum.getForumDesc());
    12             }
    13         });
    14     }
    ForumDao

    查询

     1     //单条查询
     2     public Forum getForum(final int forumId) {
     3         String sql = "SELECT forum_name,forum_desc FROM t_forum WHERE forum_id=?";
     4         final Forum forum = new Forum();
     5         jdbcTemplate.query(sql, new Object[]{forumId}, new RowCallbackHandler() {
     6             public void processRow(ResultSet rs) throws SQLException {
     7                 forum.setForumId(forumId);
     8                 forum.setForumName(rs.getString("forum_name"));
     9                 forum.setForumDesc(rs.getString("forum_desc"));
    10             }
    11         });
    12         return forum;
    13     }
    ForumDao

    多条List查询

     1     public List getForums(final int fromId,final int toId) {
     2         String sql = "SELECT forum_id,forum_name,forum_desc FROM t_forum WHERE forum_id between ? and ?";
     3 //使用RowCallbackHandler
     4 //        final List forums = new ArrayList();
     5 //        getJdbcTemplate().query(sql,new Object[]{fromId,toId},new RowCallbackHandler(){
     6 //            public void processRow(ResultSet rs) throws SQLException {
     7 //                Forum forum = new Forum();
     8 //                forum.setForumId(rs.getInt("forum_id"));
     9 //                forum.setForumName(rs.getString("forum_name"));
    10 //                forum.setForumDesc(rs.getString("forum_desc"));
    11 //                forums.add(forum);
    12 //            }});
    13 //        return forums;
    14         return  jdbcTemplate.query(sql,new Object[]{fromId,toId},new RowMapper(){
    15             public Object mapRow(ResultSet rs, int index) throws SQLException {
    16                 Forum forum = new Forum();
    17                 forum.setForumId(rs.getInt("forum_id"));
    18                 forum.setForumName(rs.getString("forum_name"));
    19                 forum.setForumDesc(rs.getString("forum_desc"));
    20                 return forum;
    21             }
    22 
    23         });
    24     }
    ForumDao

    调用存储过程

     1     public int getUserTopicNum(final int userId) {
     2         String sql = "{call P_GET_TOPIC_NUM(?,?)}";
     3         //使用    Object execute(String callString, CallableStatementCallback action)接口
     4         Object obj = jdbcTemplate.execute(sql,new CallableStatementCallback(){
     5             public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
     6                 cs.setInt(1,userId);
     7                 cs.registerOutParameter(2, Types.INTEGER);
     8                 cs.execute();
     9                 return new Integer(cs.getInt(2));
    10             }
    11         });
    12         return ((Integer)obj).intValue();
    13     }
    TopicDao
  • 相关阅读:
    Joomla 3.9.13 二次注入分析(CVE-2019-19846)
    Wordpress未授权查看私密内容漏洞 分析(CVE-2019-17671)
    Thinkphp 5.1.24 parseKey缺陷导致聚合注入 分析
    Thinkphp 5.1.7 parseData缺陷导致insert/update注入 分析
    Oracle笔记2
    Oracle笔记1
    k8s之helm入门
    k8s之自定义指标API部署prometheus
    k8s之资源指标API部署metrics-server
    k8s之调度器、预选策略及优选函数
  • 原文地址:https://www.cnblogs.com/sherrykid/p/4623674.html
Copyright © 2020-2023  润新知