熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Spring中使用JDBC

2013-11-23 18:52:46  來源: Java核心技術 
首先要獲得DataSource連接池
   
    要對數據庫執行任何的JDBC操作需要有一個Connection在Spring中Connection對象是通過DataSource獲得的
   
    有幾種方法可以得到DataSource 其中一種方法是使用Spring提供的輕量級orgspringframeworkjdbcdatasourceDriverManagerDataSource第二種方法是使用monsdbcpBasicDataSource類
   
    使用DriverMangerDataSource這種方法是輕量級的方便測試
   
    public class DataSoureProvider {
   
    public static DriverManagerDataSource dataSource = new DriverManagerDataSource()  
   
    public static DriverManagerDataSource getInstance() {
   
    dataSourcesetDriverClassName(commysqljdbcDriver
   
    dataSourcesetUrl(jdbc:mysql://localhost:/book
   
    dataSourcesetUsername(y****
   
    dataSourcesetPassword(h*******
   
    return dataSource;
   
    }
   
    @Test
   
    public void test() {
   
    DataSoureProvidergetInstance()
   
    try {
   
    dataSourcegetConnection()
   
    }
   
    catch (SQLException e) {
   
    eprintStackTrace()
   
    }
   
    } }
   
    第~行是配置連接數據庫所需的信息
   
   使用BasicDataSouce創建一個連接池應為BasicDataSource所有屬性都是通過setter方法暴露在外面的我們可以像配置其他Srping Bean那樣配置它
   
    我將數據庫連接信息配置在properties文件中利用spring的orgspringframewonfigPropertyPlaceholderConfigurer類進行讀取裝載可以查看spring_裝配Bean一文
   
    書寫配置文件applicationContextxml:
   
    <?xml version= encoding=UTF?> <beans
   
    xmlns=
   
    xmlns:xsi=instance
   
    xmlns:p=
   
    xsi:schemaLocation= beansxsd>  
   
    <bean id=dbproperty class=orgspringframewonfigPropertyPlaceholderConfigurer>
   
    <property name=location>
   
    <value>connectproperties</value>
   
    </property>
   
    </bean>
   
   
   
    <bean id=myDataSource class=monsdbcpBasicDataSource>
   
    <property name=driverClassName>
   
    <value>${dbdriver}</value>
   
    </property>
   
    <property name=url>
   
    <value>${dburl}</value>
   
    </property>
   
    <property name=username>
   
    <value>${dbusername}</value>
   
    </property>
   
    <property name=password>
   
    <value>${dbpassword}</value>
   
    </property>
   
    </bean> </beans>
   
    第~行配置BasicDataSource參數其中<value>中的參數是在connectpropertices配置文件中拿到的


   
進行測試
   
    public class DataSourceProvider {
   
    @Test
   
    public void connectTest() {
   
    ApplicationContext context = new ClassPathXmlApplicationContext(
   
    applicationContextxml
   
    BasicDataSource dataSource = (BasicDataSource) context
   
    getBean(myDataSource
   
    try {
   
    dataSourcegetConnection()
   
    Systemoutprintln(connect successful
   
    }
   
    catch (SQLException e) {
   
    eprintStackTrace()
   
    }
   
    }
   
    }
   
    使用monsdbcpBasicDataSource需要引入額外的jar包分別是commonscollectionsjarcommonsdbcpjarcommonspooljar為了方便大家這裡有這三個jar包的下載地址
   
    Spring把JDBC中重復的操作建立成了一個模板類orgsprireJdbcTemplate
   
    使用JdbcTemplate:
   
    要使用JdbcTemplate需要為每一個DAO配置一個JdbcTemplate實例
   
    public class StudentDaoImp implements StudentDao {
   
    private JdbcTemplate jdbcTemplate;
   
    @Override
   
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
   
    thisjdbcTemplate = jdbcTemplate;
   
    } }
   
    如上StudentDaoImp內配置了一個JdbcTemplate對象和它對應的setter方法這樣就可以在Spring配置文件中對其進行賦值
   
    <?xml version= encoding=UTF?> <beans xmlns=
   
    xmlns:xsi=instance xmlns:p=
   
    xsi:schemaLocation= beansxsd>  
   
    <bean id=dbproperty
   
    class=orgspringframewonfigPropertyPlaceholderConfigurer>
   
    <property name=location>
   
    <value>connectproperties</value>
   
    </property>
   
    </bean>
   
    <bean id=myDataSource class=monsdbcpBasicDataSource>
   
    <property name=driverClassName>
   
    <value>${dbdriver}</value>
   
    </property>
   
    <property name=url>
   
    <value>${dburl}</value>
   
    </property>
   
    <property name=username>
   
    <value>${dbusername}</value>
   
    </property>
   
    <property name=password>
   
    <value>${dbpassword}</value>
   
    </property>
   
    </bean>
   
    <bean id=jdbcTemplate class=orgsprireJdbcTemplate>
   
    <property name=dataSource>
   
    <ref bean=myDataSource/>
   
    </property>
   
    </bean>
   
   
   
    <bean id=studentDao class=comsunflowerdaoStudentDaoImp>
   
    <property name=jdbcTemplate>
   
    <ref bean=jdbcTemplate/>
   
    </property>
   
    </bean> </beans>
   
    第~行是裝配JdbcTemplate這個Bean其中需要為其設置dataSource這個參數就是我們上面的到的DataSource


   
使用JdbcTemplate插入數據
   
    public class StudentDaoImp implements StudentDao {
   
    private JdbcTemplate jdbcTemplate;  
   
    @Override
   
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
   
    thisjdbcTemplate = jdbcTemplate;
   
    }
   
   
   
    public void insert(Student student)
   
    {
   
    String sql = insert into student (cnonamescore) values(???);
   
    //設置傳遞給通配符的參數
   
    Object[] params = new Object[]{studentgetCno() studentgetName() studentgetScore()};
   
    jdbcTemplateupdate(sql params)
   
    } }
   
    第~行為插入一條學生記錄的方法行中JdbcTemplate為我們提供了update(String sqlObject… args)方法方便我們進行數據的插入
   
進行測試
   
    public class InsertTest {
   
    @Test
   
    public void insertTest() {
   
    Student student = new Student()
   
    studentsetCno(
   
    studentsetName(張飛
   
    studentsetScore(  
   
    ApplicationContext context = new ClassPathXmlApplicationContext(
   
    applicationContextxml
   
    StudentDaoImp studentDao = (StudentDaoImp) contextgetBean(studentDao
   
    studentDaoinsert(student)
   
    } }
   
    數據庫中多了一條記錄
   
    mysql> select * from student;
   
    +++++
   
    | sno | cno | name | score |
   
    +++++
   
    | | | 地心 | |
   
    | | | 華雄 | |
   
    | | | 孝慈 | |
   
    | | | 必須 | |
   
    | | | 華雄 | |
   
    | | | 地心 | |
   
    | | | 橫切 | |
   
    | | | 橫切 | |
   
    | | | 橫切 | |
   
    | | | 張飛 | |
   
    +++++
   
    rows in set
   
    批量插入數據
   
    批量插入數據需要用到orgsprireBatchPreparedStatementSetter接口
   
    修改StudentDaoImp:
   
    public class StudentDaoImp implements StudentDao {
   
    private JdbcTemplate jdbcTemplate;  
   
    @Override
   
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
   
    thisjdbcTemplate = jdbcTemplate;
   
    }
   
   
   
    public int insert(Student student)
   
    {
   
    String sql = insert into student (cnonamescore) values(???);
   
    //設置傳遞給通配符的參數
   
    Object[] params = new Object[]{studentgetCno() studentgetName() studentgetScore()};
   
    return jdbcTemplateupdate(sql params)
   
    }
   
   
   
    public int[] batchInsert(final List<Student> list)
   
    {
   
    String sql = insert into student (cnonamescore) values(???);
   
   
   
    BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {
   
   
   
    @Override
   
    public void setValues(PreparedStatement ps int index) throws SQLException {
   
    Student student = (Student) listget(index)
   
    pssetInt( studentgetCno())
   
    pssetString( studentgetName())
   
    pssetDouble( studentgetScore())
   
    }
   
   
   
    //有多少條記錄要處理
   
    @Override
   
    public int getBatchSize() {
   
    return listsize()
   
    }
   
    };
   
   
   
    return jdbcTemplatebatchUpdate(sql setter)
   
    } }
   
    第~行為批量插入的方法BatchPreparedStatementSetter接口的兩個方法其中getBatchSize()方法是得到需要插入的記錄的個數setValues(PreparedStatement ps int index)方法是實際進行插入的方法
   
    進行測試
   
    @Test
   
    public void batchInsert() {
   
    Student student = null student = null student = null;
   
    student = new Student()
   
    student = new Student()
   
    student = new Student()  
   
    studentsetCno(
   
    studentsetName(劉備
   
    studentsetScore(
   
    studentsetCno(
   
    studentsetName(關羽
   
    studentsetScore(
   
    studentsetCno(
   
    studentsetName(張飛
   
    studentsetScore(
   
    List<Student> list = new ArrayList<Student>()
   
    listadd(student
   
    listadd(student
   
    listadd(student
   
    ApplicationContext context = new ClassPathXmlApplicationContext(
   
    applicationContextxml
   
    StudentDaoImp studentDao = (StudentDaoImp) context
   
    getBean(studentDao
   
    studentDaobatchInsert(list)
   
    }
   
    插入結果
   
    mysql> select * from student;
   
    +++++
   
    | sno | cno | name | score |
   
    +++++
   
    | | | 劉備 | |
   
    | | | 關羽 | |
   
    | | | 張飛 | |
   
    +++++
   
    rows in set
   
    查詢一條記錄
   
    執行一條數據的查詢需要使用orgsprireRowCallbackHandler接口的實現
   
    修改StudentDaoImp:
   
    /**
   
    * 查詢一條記錄
   
    */
   
    public Student getStudent(final int id) {
   
    // 裝載查詢結果
   
    final Student student = new Student()  
   
    String sql = select osnamesscore from student s where sno = ?;
   
    // 設置查詢參數
   
    final Object[] params = new Object[] { new Integer(id) };
   
    // 進行查詢
   
    jdbcTemplatequery(sql params new RowCallbackHandler() {
   
    @Override
   
    public void processRow(ResultSet rs) throws SQLException {
   
    studentsetCno(rsgetInt(cno))
   
    studentsetName(rsgetString(name))
   
    studentsetScore(rsgetDouble(score))
   
    }
   
    })
   
   
   
    return student;
   
    }
   
    進行測試
   
    @Test
   
    public void selectTest() {
   
    ApplicationContext context = new ClassPathXmlApplicationContext(
   
    applicationContextxml
   
    StudentDaoImp studentDao = (StudentDaoImp) context
   
    getBean(studentDao  
   
    Student student = studentDaogetStudent(
   
    Systemoutprintln(cno: + studentgetCno() + name:+ studentgetName() + score: + studentgetScore())
   
    }
   
    查詢多條記錄
   
    這裡需要用到orgsprireRowMapper接口的實現
   
    修改StudentDaoImp:
   
    /**
   
    * 查詢多條記錄
   
    */
   
    public List<Student> getAllStudent() {
   
    String sql = select osnamesscore from student s;  
   
    return jdbcTemplatequery(sql new RowMapper<Student>() {
   
    @Override
   
    public Student mapRow(ResultSet rs int index) throws SQLException {
   
    Student student = new Student()
   
    studentsetCno(rsgetInt(cno))
   
    studentsetName(rsgetString(name))
   
    studentsetScore(rsgetDouble(score))
   
    return student;
   
    }
   
    })
   
    }
   
    RowMapper接口負責把Result中的一條記錄映射成一個對象
   
    進行測試
   
    @Test
   
    public void getAllStudent() {
   
    ApplicationContext context = new ClassPathXmlApplicationContext(
   
    applicationContextxml
   
    StudentDaoImp studentDao = (StudentDaoImp) context
   
    getBean(studentDao  
   
    List<Student> list = new ArrayList<Student>()
   
    list = studentDaogetAllStudent()
   
    for (int i = ; i < listsize() i++) {
   
    Systemoutprintln(name is: + listget(i)getName())
   
    }
   
    }
   
    也可以使用這種方法查詢一條記錄只要附加查詢參數即可
   
    /**
   
    * 查詢一條記錄
   
    */
   
    public Student getStudent(final int id) {
   
    // 裝載查詢結果
   
    final Student student = new Student()  
   
    String sql = select osnamesscore from student s where sno = ?;
   
    // 設置查詢參數
   
    final Object[] params = new Object[] { new Integer(id) };
   
    List<Student> list = jdbcTemplatequery(sql params
   
    new RowMapper<Student>() {
   
    @Override
   
    public Student mapRow(ResultSet rs int index)
   
    throws SQLException {
   
    Student student = new Student()
   
    studentsetCno(rsgetInt(cno))
   
    studentsetName(rsgetString(name))
   
    studentsetScore(rsgetDouble(score))
   
    return student;
   
    }
   
    })
   
   
   
    return listget(
   
    }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25910.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.