Spring DAO之JDBC

Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术, 如JDBC,Hibernate或者JDO等。它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常。
为了便于以一种一致的方式使用各种数据访问技术,如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,通过它们你可以 获得与你当前使用的数据访问技术相关的数据源和其他配置信息。
Dao支持类:
JdbcDaoSupport - JDBC数据访问对象的基类。 需要一个DataSource,同时为子类提供 JdbcTemplate。
HibernateDaoSupport - Hibernate数据访问对象的基类。 需要一个SessionFactory,同时为子类提供 HibernateTemplate。也可以选择直接通过 提供一个HibernateTemplate来初始化, 这样就可以重用后者的设置,例如SessionFactory, flush模式,异常翻译器(exception translator)等等。
JdoDaoSupport - JDO数据访问对象的基类。 需要设置一个PersistenceManagerFactory, 同时为子类提供JdoTemplate。
JpaDaoSupport - JPA数据访问对象的基类。 需要一个EntityManagerFactory,同时 为子类提供JpaTemplate。
本节主要讨论Sping对JdbcDaoSupport的支持。
下面是个例子:
drop table if exists user; 

/*==============================================================*/ 
/* Table: user                                                  */ 
/*==============================================================*/ 
create table user 

   id                   bigint AUTO_INCREMENT not null, 
   name                 varchar(24), 
   age                  int, 
   primary key (id) 
);
public class User { 
    private Integer id; 
    private String name; 
    private Integer age; 

    public Integer getId() { 
        return id; 
    } 

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

    public String getName() { 
        return name; 
    } 

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

    public Integer getAge() { 
        return age; 
    } 

    public void setAge(Integer age) { 
        this.age = age; 
    } 
}
/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-4-22 15:34:36<br> 
* <b>Note</b>: DAO接口 
*/ 
public interface IUserDAO { 
    public void insert(User user); 

    public User find(Integer id); 
}
import javax.sql.DataSource; 
import java.sql.Connection; 
import java.sql.SQLException; 

/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-4-22 13:53:56<br> 
* <b>Note</b>: 基类DAO,提供了数据源注入 
*/ 
public class BaseDAO { 
    private DataSource dataSource; 

    public DataSource getDataSource() { 
        return dataSource; 
    } 

    public void setDataSource(DataSource dataSource) { 
        this.dataSource = dataSource; 
    } 

    public Connection getConnection() { 
        Connection conn = null; 
        try { 
            conn = dataSource.getConnection(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
        return conn; 
    } 
}
/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-4-22 15:36:04<br> 
* <b>Note</b>: DAO实现 
*/ 
public class UserDAO extends BaseDAO implements IUserDAO { 

    public JdbcTemplate getJdbcTemplate(){ 
        return new JdbcTemplate(getDataSource()); 
    } 
    public void insert(User user) { 
        String name = user.getName(); 
        int age = user.getAge().intValue(); 

//        jdbcTemplate.update("INSERT INTO user (name,age) " 
//                + "VALUES('" + name + "'," + age + ")"); 

        String sql = "insert into user(name,age) values(?,?)"; 
        getJdbcTemplate().update(sql,new Object[]{name,age}); 
    } 

    public User find(Integer id) { 
        List rows = getJdbcTemplate().queryForList( 
                "SELECT * FROM user WHERE id=" + id.intValue()); 

        Iterator it = rows.iterator(); 
        if (it.hasNext()) { 
            Map userMap = (Map) it.next(); 
            Integer i = new Integer(userMap.get("id").toString()); 
            String name = userMap.get("name").toString(); 
            Integer age = new Integer(userMap.get("age").toString()); 

            User user = new User(); 

            user.setId(i); 
            user.setName(name); 
            user.setAge(age); 

            return user; 
        } 
        return null; 
    } 
}
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
        "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 
    <bean id="dataSource" 
          class="org.apache.commons.dbcp.BasicDataSource" singleton="true"> 
        <property name="driverClassName"> 
            <value>com.mysql.jdbc.Driver</value> 
        </property> 
        <property name="url"> 
            <value>jdbc:mysql://localhost:3306/springdb</value> 
        </property> 
        <property name="username"> 
            <value>root</value> 
        </property> 
        <property name="password"> 
            <value>leizhimin</value> 
        </property> 
    </bean> 

    <bean id="baseDAO" class="com.lavasoft.springnote.ch05_jdbc03_temp.BaseDAO" abstract="true"> 
        <property name="dataSource"> 
            <ref bean="dataSource"/> 
        </property> 
    </bean> 

    <bean id="userDAO" 
          class="com.lavasoft.springnote.ch05_jdbc03_temp.UserDAO" parent="baseDAO"> 
    </bean> 

</beans>
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.FileSystemXmlApplicationContext; 

/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-4-22 15:59:18<br> 
* <b>Note</b>: 测试类,客户端 
*/ 
public class SpringDAODemo { 
    public static void main(String[] args) { 
        ApplicationContext context = new FileSystemXmlApplicationContext("D:\\_spring\\src\\com\\lavasoft\\springnote\\ch05_jdbc03_temp\\bean-jdbc-temp.xml"); 
        User user = new User(); 
        user.setName("hahhahah"); 
        user.setAge(new Integer(22)); 
        IUserDAO userDAO = (IUserDAO) context.getBean("userDAO"); 
        userDAO.insert(user); 
        user = userDAO.find(new Integer(1)); 
        System.out.println("name: " + user.getName()); 
    } 
}
运行结果:
log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory). 
log4j:WARN Please initialize the log4j system properly. 
name: jdbctemplate 

Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序猿是如何解决SQLServer占CPU100%的

文章目录 遇到的问题使用SQLServer Profiler监控数据库 SQL1&#xff1a;查找最新的30条告警事件SQL2&#xff1a;获取当前的总报警记录数有哪些SQL语句会导致CPU过高&#xff1f;查看SQL的查询计划 选择top记录时&#xff0c;尽量为order子句的字段建立索引查看SQL语句CPU高的…

通过wifi调试Android程序

原文&#xff1a;http://www.cnblogs.com/sunzhenxing19860608/archive/2011/07/14/2106492.html 1.首先让android手机监听指定的端口&#xff1a;  这一步需要使用shell&#xff0c;因此手机上要有终端模拟器&#xff0c;不过网上很多&#xff0c;随便找个就行了&#xff0c…

基于jQuery的对象切换插件:soChange 1.5 (点击下载)

http://www.jsfoot.com/jquery/demo/2011-09-20/192.html 所有参数&#xff1a; $(obj).soChange({ thumbObj:null, //导航对象&#xff0c;默认为空 botPrev:null, //按钮上一个&#xff0c;默认为空 botNext:null, //按钮下一个。默认为空 thumbNowClass:no…

atitit.Oracle 9 10 11 12新特性attilax总结

atitit.Oracle 9 10 11 12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1. 审计简介 1 1.4. 其他&#xff08;大部分是管理功能&#xff09; 2 2. Oracle 12c 的 12 个新特性 2 2.1. 2 Improved Defaults 增强了DEFAULT, default目前可以直接指代…

mysql读书笔记---mysql safe update mode

You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column 查看 mysql> show variables like %sql_safe%; 关闭 mysql> set sql_safe_updates0; 开启 mysql> set sql_safe_updates1;

基于纤程(Fiber)实现C++异步编程库(一):原理及示例

纤程&#xff08;Fiber&#xff09;和协程&#xff08;coroutine&#xff09;是差不多的概念&#xff0c;也叫做用户级线程或者轻线程之类的。Windows系统提供了一组API用户创建和使用纤程&#xff0c;本文中的库就是基于这组API实现的&#xff0c;所以无法跨平台使用&#xff…

MYSQL读书笔记---运算符、字符串操作

运算符###########################################,!(<>),>,>,<,< is null , is not null, isnull(expr) expr between min and max expr in(v1,v2,...)流程#############################################mysql> select ifnull(1,0); #如果第一个参数为…

fluidity详解

fluidity详解 1.fluidity编译过程 1.1.femtools库调用方法 编译fluidity/femtools目录下所有文件&#xff0c;打包为libfemtools.a静态库文件&#xff1b;通过-lfemtools参数&#xff0c;并指定libfemtools.a静态库位置&#xff0c;即可调用 femtools 库内所有函数2.fluidity主…

mysql读书笔记---if语句

IF(expr1,expr2,expr3) 如果expr1是TRUE(expr1<>0 and expr1<>NULL)&#xff0c;则IF()的返回值为expr2;否则返回值则为expr3。IF()的返回值为数字值或字符串值&#xff0c;具体情况视其所在语境而定。 mysql>SELECT?IF(1>2,2,3); ->3 mysql>SELECT I…

C语言 将整数写入内存指定的连续字节单元中

将整数数组写入0x40003000开始的连续10个字节内存单元中&#xff0c;注意unsigned char *指向一个字节&#xff0c;而int *指向1个字&#xff08;4个字&#xff09;&#xff0c;但是可以把字中存储的整数放入字节单元中&#xff0c;只要不超过表示的范围&#xff0c;注意虽然un…

mysql读书笔记----时间函数

1.获得当前时间&#xff1a;时间格式yyyy-MM-dd curdate();2.DAYOFWEEK(date) 3.WEEKDAY(date) 4.DAYOFMONTH(date) 5.DAYOFYEAR(date) 6.MONTH(date) 7.DAYNAME(date) 8.MONTHNAME(date) 9.QUARTER(date) 10.WEEK(date) WEEK(date,first) 11.YEAR(date) 12.HOUR(time) 13.MINU…

企业数据1

1. 企业数据 1.1. 全局 1.1.1. 货币 CNY Chinese Yuan Renminbi &#xffe5; 6.825020 ARS Argentine Peso $ 3.791090 BOB Bolivian Boliviano $b 7.570800 BRL Brazilian Real R$ 1.766500 CAD Canadian Dollar $ 1.037570 CLP Chilean Peso $ …

sql判断语句

方法一&#xff1a; <if test"null ! orderType and 0 orderType"> order by amountTimes desc </if><if test"null ! orderType and 1 orderType">order by amountTimes asc </if><if test"null ! orderType and 2 …

Thinkphp 整合tcpdf

网上查了些关于tcpdf 使用教程&#xff0c;整合到TP的话&#xff0c;会有些小问题&#xff0c;由于基础还不是很扎实&#xff0c;花了点时间终于整合OK了。下面介绍步骤&#xff1a; 环境&#xff1a; TP版本&#xff1a;TP3.2.2 tcpdf:tcpdf_6_2_3 1. 将tcpdf_6_2_3.zip解压在…

多项目开发下的dll文件管理

阅读目录&#xff1a;DS01&#xff1a;为什么要对生成的dll文件进行管理&#xff1f;DS02&#xff1a;首先介绍以下两个DOS命令DS03&#xff1a;第一种实现方法&#xff08;xcopy&#xff09;DS04&#xff1a;第二种实现方法&#xff08;attrib&#xff09;DS05&#xff1a;分享…

关于Java中的随机数产生

对比两种写法&#xff1a; 第一种&#xff1a; public static void main(String args[]){Random random new Random(System.currentTimeMillis());for(int i0; i<20; i){int sindex random.nextInt(2);System.out.println(sindex);}}第二种&#xff1a; public static voi…

视图

视图是虚表&#xff0c;是从一个或几个基本表&#xff08;或视图&#xff09;中导出的表&#xff0c;在系统的数据字典中仅存放了视图的定义&#xff0c;不存放视图对应的数据。视图是原始数据库数据的一种变换&#xff0c;是查看表中数据的另外一种方式。可以将视图看成是一个…

选择器的并发性

4.3.4 并发性 选择器对象是线程安全的&#xff0c;但它们包含的键集合不是。通过keys( )和selectKeys( )返回的键的集合是Selector对象内部的私有的Set对象集合的直接引用。这些集合可能在任意时间被改变。已注册的键的集合是只读的。如果您试图修改它&#xff0c;那么您得到的…

mysql 自定义函数之判断

DELIMITER $$CREATE DEFINERrootlocalhost FUNCTION getMin(a int,b int) RETURNS int(11)BEGINdeclare min int;if(a>b)then set min b;elseif(b>a)then set min a;else set min 0;#end if;end if;RETURN min;END 调用该函数可以如下方式 select getMin(1,2); 返回值…

C/C++的数组名

数组名相当于指向数组第一个元素的地址。数组名不是变量&#xff0c;是地址常量&#xff0c;不能为其赋值。如下&#xff1a;1&#xff09;一维数组中对于数组 a[5] {1, 2, 3, 4, 5};数组名a相当于指向第一个元素a[0]的指针。即 a 与 &a[0] 等价。2&#xff09;二维数组中…