JdbcTemplate 配置

第一种方式:
我们可以在自己定义的DAO 实现类中注入一个DataSource 引用来完 成JdbcTemplate 的实例化。也就是它是从外部“注入” DataSource 到DAO 中,然后 自己实例化JdbcTemplate,然后将DataSource 设置到JdbcTemplate 对象中。

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
<property name = "dataSource" ref="dataSource">  
</bean>  
<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl"> 
<property name="jdbcTemplate" ref="jdbcTemplate"/> 
</bean>
public class UserServiceImpl implements UserService {   
    private JdbcTemplate jdbcTemplate;    
    public JdbcTemplate getJdbcTemplate() {  
        return jdbcTemplate;  
    }      
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {  
        this.jdbcTemplate = jdbcTemplate;  
    }   
}

第二种方式:
在 Spring 的 IoC 容器中配置一个 JdbcTemplate 的 bean,将 DataSource 注入进来,然后再把JdbcTemplate 注入到自定义DAO 中。

<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl"> 
<property name="dataSource" ref="dataSource"/> 
</bean>
public class UserServiceImpl implements UserService {  
        private JdbcTemplate jdbcTemplate;  
        public void setDataSource(DataSource dataSource) {  
                   this.jdbcTemplate = new JdbcTemplate(dataSource);  
        }  
}

第三种方式:
Spring 提供了 org.springframework.jdbc.core.support.JdbcDaoSupport 类 , 这 个 类 中 定 义 了 JdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创 建jdbcTemplate 的实例,所以我们自己编写的DAO 只需要继承JdbcDaoSupport 类, 然后注入DataSource 即可。提倡采用第三种方法。

<bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl"> 
<property name="dataSource" ref="dataSource"/> 
</bean>
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {  
    @Override  
    public void save(User user) {  
        this.getJdbcTemplate().update("sql");  
    }  
}
batchUpdate():适合于批量增、删、改操作;
update():使用于增、删、改操作;第一个参数为执行sql 、第二个参数为参数数据、第三个参数为参数类型;
execute():执行一个独立的sql语句,包括ddl语句;
queryForInt() 、queryForList()、queryForObject

GeneratedKeyHolder:获得新建数据主键值;
PreparedStatement:防止SQL注入攻击;
RowMapper:可以将数据中的每一行数据封装成用户定义的类

PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,
然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。
而且PreparedStatement使用了预编译机制(因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,
那么下次调用时只要是相同的预编译语句就不需要编译),sql语句在执行的过程中效率比Statement要高。

防止SQL注入攻击
·直接拼接SQL语句,然后自己实现所有的转义操作。这种方法比较麻烦,而且很可能没有PreparedStatement做的好,造成其他更大的漏洞,不推荐。
·直接简单暴力的过滤掉%。干脆不让用户搜索%,推荐。
select* from users where username='张三'#' and password='njksad'  这条语句真正发挥作用的部分就是:select* from users where username='张三'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值