zoukankan      html  css  js  c++  java
  • spring jdbc

    spring JDBC

      加入对commons-dbcp  spring-jdbc  spring-tx的依赖

    1.数据源的配置  

      

    获取数据源在spring中的Bean管理默认已经是单例模式
    关闭数据源destroy-method="close"
    作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="$jdbc:mysql:///mydb"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
        </bean>

    不在配置中将数据源配置写死

    新建配置文件db.properties 

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.uril=jdbc:mysql:///mydb
    jdbc.username=root
    jdbc.password=root    

    在applicationContext添加配置

    <!-- 读取db.properties文件 使用${key}获取文件中的配置项 -->
        <context:property-placeholder location="db.properties"/>
        
        <!-- 数据源 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>    
            

    2.JdbcTemplate配置,用于执行sql

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 需要构造方法注入一个数据源  ref是上面数据源的id -->
            <constructor-arg name="dataSource" ref="dataSource"/>
        </bean>        

    举例

    @Named
    public class StudentDao {
    
        @Inject/* 交给spring管理的类注入 ,属性名和id名最好一致 
            因为先是byName,找不到后byType*/
        private JdbcTemplate jdbcTemplate;
        
        public void save(Student stu) {
            String sql = "insert into student(name,address) values(?,?)";
            // 添加,删除,更新都是用update 
            jdbcTemplate.update(sql, stu.getName(),stu.getAddress());
        }
        
        public Student findById(int id) {
            String sql = "select * from student where id = ?";
            return jdbcTemplate.queryForObject(sql, new StudentRowMapper(), id);
        }
        
        public List<Student> findAll() {
            String sql = "select * from student";
            return jdbcTemplate.query(sql, new StudentRowMapper());
        }
        
        private class StudentRowMapper implements RowMapper<Student> {
    
            public Student mapRow(ResultSet rs, int arg1) throws SQLException {
                Student stu = new Student();
                stu.setAddress(rs.getString("address"));
                stu.setId(rs.getInt("id"));
                stu.setName(rs.getString("name"));
                return stu;
            }    
        }
    }        
            

    跟jdbcTemplate类似,NamedParameterJdbcTemplate也是用于执行sql,但是不常用

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
            <constructor-arg name="dataSource" ref="dataSource"/>
        </bean>    

    举例

    @Named
    public class StudentDao {
    
        @Inject
        private NamedParameterJdbcTemplate jdbcTemplate;
        
        public void save(Student stu) {
        // 引用占位符 
            String sql = "insert into student(name,address) values(:name,:address)";
            
            /* 本质上
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("name", stu.getName());
            map.put("address", stu.getAddress());
            jdbcTemplate.update(sql,map);*/
            
            
            /* 当:name,:address和Student中的属性名字相同时可以这样用*/
            //SqlParameterSource sps = new BeanPropertySqlParameterSource(stu);
            /* 即使:name,:address不相同,可以这样用        链式调用  */
            SqlParameterSource sps = new MapSqlParameterSource().addValue("name", stu.getName()).addValue("address", stu.getAddress());
            
            jdbcTemplate.update(sql,sps);
        }
        
        public Student findById(int id) {
            String sql = "select * from student where id = :id";
            
            /*本质上
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("id", id);
            return jdbcTemplate.queryForObject(sql,map,new StudentRowMapper());
            */
             
             
            //当:id和Student中的属性名字相同时可以这样用
            SqlParameterSource sps = new MapSqlParameterSource("id",id);
            
            
            return jdbcTemplate.queryForObject(sql,sps,new StudentRowMapper());
        }
        
        public List<Student> findAll() {
            String sql = "select * from student";
            // query必须要传进去一个map,这是构造方法规定的 
            return jdbcTemplate.query(sql,new HashMap<String, Object>(),new StudentRowMapper());
        }
        
        private class StudentRowMapper implements RowMapper<Student> {
    
            public Student mapRow(ResultSet rs, int arg1) throws SQLException {
                Student stu = new Student();
                stu.setAddress(rs.getString("address"));
                stu.setId(rs.getInt("id"));
                stu.setName(rs.getString("name"));
                return stu;
            }
        }
    }
  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4465299.html
Copyright © 2011-2022 走看看