• 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;
            }
        }
    }
  • 相关阅读:
    Office EXCEL 如何设置最大行高
    网站SEO优化的方法
    ajax序列化表单,再也不用通过data去一个个的传值了
    java实现网站paypal支付功能并且异步修改订单的状态
    jquery报.live() is not a function的解决方法
    如何判断服务器是否挂掉
    mysql实现分页的几种方式
    sqlserver实现分页的几种方式
    十年前,女:“对不起,我不会喜欢你的,你不要再坚持了,就好比让 Linux 和 Windows 同时运行在一台PC机上,可能吗?
    实际项目开发中为什么引用的外部样式没有什么效果
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4465299.html
Copyright © 2020-2023  润新知