zoukankan      html  css  js  c++  java
  • 1.4(Spring学习笔记)Spring-JDBC基础

    一、Spring JDBC相关类

      1.1 DriverManagerDataSource

      DriverManagerDataSource主要包含数据库连接地址,用户名,密码。

      属性及含义如下配置所示:

    <bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
         <!-- 指定JDBC驱动 --> <property name = "driverClassName" value = "com.mysql.jdbc.Driver" />
         <!--设置数据库连接地址--> <property name = "url" value = "jdbc:mysql://localhost:3306/spring" />
         <!-- 设置用户名和密码 --> <property name = "username" value = "root" /> <property name = "password" value = "123456" /> </bean>

      1.2JdbcTemplate

      JdbcTemplate是实现数据库操作的核心类,其中包含一系列对数据库的操作。

      包含execute()、update()、query()等方法。

      

      既然是对数据库进行操作,那么必须知道数据库的URL,用户名密码。

      所有JdbcTemplate中应该包含DriverManagerDataSource。

      将DriverManagerDataSource配置到JdbcTemplate中:

    <!--设置数据源-->
    <
    bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> <property name = "url" value = "jdbc:mysql://localhost:3306/spring" /> <property name = "username" value = "root" /> <property name = "password" value = "123456" /> </bean> <!--在jdbcTemplate中设置数据源--> <bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate"> <property name = "dataSource" ref = "dataSource" /> </bean>

      模板设置好了,我们就可以使用模板了。

      一般在对数据库进行具体操作的类中定义一个JdbcTemplate类型的属性,

      然后将 id = jdbcTemplate的bean注入到数据库操作类中对应的属性。

      需要导入的jar文件:

      

    我们先结合jdbcTemplate中的execute() 方法来看一实例

    execute(String sql)执行指定sql语句

    <?xml  version="1.0"  encoding="UTF-8"?> 
    <beans  xmlns="http://www.springframework.org/schema/beans" 
            xmlns:context="http://www.springframework.org/schema/context"         
            xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://www.springframework.org/schema/beans 
                http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                http://www.springframework.org/schema/context 
                 http://www.springframework.org/schema/context/spring-context-4.3.xsd" > 
        
        <!--配置数据源-->
        <bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name = "driverClassName" value = "com.mysql.jdbc.Driver" />
            <property name = "url" value = "jdbc:mysql://localhost:3306/spring" />
            <property name = "username" value = "root" />
            <property name = "password" value = "123456" />
        </bean>
        <!--配置jdbc模板-->
        <bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
            <property name = "dataSource" ref = "dataSource" />
        </bean>
    </beans>

    测试

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class JDBCTemplateTest {
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
            JdbcTemplate jt = (JdbcTemplate)ac.getBean("jdbcTemplate");
            jt.execute("create table account(" +
                        "id int primary key auto_increment," +
                        "username varchar(50)," +
                        "balance double)");
            System.out.println("创建成功");
        }
    }

    创建成功后,数据库中会多出一个account表。

     

    本例是获取JdbcTemplate,执行了一个建表语句。

    我们再来看下JdbcTemplate中的update方法。

    update主要用于插入、更新、删除数据,一般会返回一个受影响的行数。

    int update(String sql),执行指定语句返回受影响的行数。

    int update(String sql,Object... args);执行sql语句,可以设置语句参数。

    Accout.java    

    public class Account {
        private Integer id;
        private String username;
        private Double balance;
        
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public Double getBalance() {
            return balance;
        }
        public void setBalance(Double balance) {
            this.balance = balance;
        }
        
        @Override
        public String toString() {
            return "Account [id=" + id + ", username=" + username + ", balance=" + balance + "]";
        }
        
    }

    AccountDao.java (数据操作接口)

    public interface AccountDao {
        public int addAccount(Account account);
        public int updateAccount(Account account);
        public int deleteAccount(int id);
    }

    AccountDaoImpl.java

    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class AccountDaoImpl implements AccountDao{
        private JdbcTemplate jt; //此处的属性通过xml文件注入
        
        public void setJt(JdbcTemplate jt) {
            this.jt = jt;
        }
    
        @Override//添加
        public int addAccount(Account account) {
            String sql = "insert into account(username,balance) value(?,?)";
            Object[] obj = new Object[] {
                account.getUsername(),
                account.getBalance()
            };
            int num = jt.update(sql,obj);
            return num;
        }
    
        @Override//修改
        public int updateAccount(Account account) {
            String sql = "update account set username=?,balance=?,where id = ?";
            Object[] obj = new Object[] {
                    account.getUsername(),
                    account.getBalance(),
                    account.getId()
            };
            int num = jt.update(sql,obj);
            return num;
        }
    
        @Override//删除
        public int deleteAccount(int id) {
            String sql = "delete from account where id = ?";
            int num = jt.update(sql,id);
            return num;
        }
    
    }

    beans.xml

    <?xml  version="1.0"  encoding="UTF-8"?> 
    <beans  xmlns="http://www.springframework.org/schema/beans" 
            xmlns:context="http://www.springframework.org/schema/context"         
            xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://www.springframework.org/schema/beans 
                http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                http://www.springframework.org/schema/context 
                 http://www.springframework.org/schema/context/spring-context-4.3.xsd" > 
        
        
        <bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name = "driverClassName" value = "com.mysql.jdbc.Driver" />
            <property name = "url" value = "jdbc:mysql://localhost:3306/spring" />
            <property name = "username" value = "root" />
            <property name = "password" value = "123456" />
        </bean>
        
        <bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
            <property name = "dataSource" ref = "dataSource" />
        </bean>
        
        <bean id = "accountDao" class = "com.spring.db.AccountDaoImpl">
            <property name="jt" ref = "jdbcTemplate"></property>  <!--将jdbcTemplate注入AccountDaoImpl类中属性jt-->
    </bean> </beans>

    测试添加

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class JDBCTemplateTest {
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
            AccountDao accountDao = (AccountDaoImpl)ac.getBean("accountDao");
            Account account = new Account();
            account.setId(2);
            account.setUsername("hcf");
            account.setBalance(1000.0);
            accountDao.addAccount(account);
            System.out.println("添加" + accountDao.addAccount(account) + "位");
        }
    }

     执行成功后,表中会多出一组数据。

     

    AccountImpl执行添加方法,其内部实际上是JdbcTemplate jt执行具体的语句,

    而JdbcTemplate jt是通过xml配置到AccountImpl的jt属性中的.

    query方法主要用于查询,可以返回查询的结果集。

    public <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args)

    执行指定语句,args用于设置语句参数,返回一个对象,RowMapper数据库中一行元素

    与一个类之间的映射,简单的看做是将数据库一行元素填充到一个类的对象中。

    类中属性名要和数据库列名相同。

    rowMapper通过RowMapper的实现类BeanPropertyRowMapper(Class<T> mappedClass)构造方法构造。

    这个属性确定了返回对象的具体类型。

    public <T> List<T> query(String sql, RowMapper<T> rowMapper)

    此方式返回的是一个结果集。

    public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)

    此方法可以设置参数,同时返回结果集

    在AccountDao.java中添加两个方法

    public Account findAccountById(int id);
        public List<Account> findAllAccounts();

    在AccountDaoImpl.java中添加实现

    @Override
        public Account findAccountById(int id) {
            String sql = "select * from account where id = ?";
            //设置映射,即表中一行记录对应一个Accout对象(数据库中列名要和对象属性名一致)
            RowMapper<Account> rp = new BeanPropertyRowMapper<Account>(Account.class);
            return this.jt.queryForObject(sql, rp, id);
        }
    
        @Override
        public List<Account> findAllAccounts() {
            String sql = "select * from account";
            RowMapper<Account> rp = new BeanPropertyRowMapper<Account>(Account.class);
            return this.jt.query(sql,rp);
        }

    测试:

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class JDBCTemplateTest {
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
            AccountDao accountDao = (AccountDaoImpl)ac.getBean("accountDao");
            System.out.println("all account:");
            for(Account account:accountDao.findAllAccounts()) {
                System.out.println(account);
            }
            System.out.println("---------------------------");
            System.out.println("id=5:");
            System.out.println(accountDao.findAccountById(5));
            System.out.println("");
        }
    }

    表中需要先有一些数据。

  • 相关阅读:
    接口的显式实现和隐式实现
    MVC
    委托
    测试用例(TestCase)
    The remote server returned an error: NotFound.
    事件
    WCF大数据量传输配置
    多态随笔
    领域模型(domain model)
    IQueryable接口和IEnumberable接口
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/10440021.html
Copyright © 2011-2022 走看看