zoukankan      html  css  js  c++  java
  • 配置数据源和jdbc的使用

    一. 配置数据源
    无论选择Spring的哪种数据访问方式,你都需要配置一个数据源的引用。Spring提供了在Spring上下文中配置数据源bean的多种方式,包括:

    通过JDBC驱动程序定义的数据源
    通过JNDI查找的数据源
    连接池的数据源


    1.1 使用JNDI数据源


    使用Java配置的话,我们可以借助JndiObjectFactoryBean中查找DataSource:

    @Bean
    public DataSource productionDataSource(){
        //使用JNDI数据源
        JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
        jndiObjectFactoryBean.setJndiName("org.h2.Driver");
        jndiObjectFactoryBean.setResourceRef(true);
        jndiObjectFactoryBean.setProxyInterface(DataSource.class);
        return (DataSource) jndiObjectFactoryBean.getObject();
    }

    1.2 使用数据源连接池

    使用Java配置,借助BasicDataSource类的bean声明如下:

    @Bean
    public DataSource quDataSource(){
        //数据源连接池
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setDriverClassName("org.h2.Driver");
        basicDataSource.setUrl("jdbc:h2:tcp://localhost/~/spitter");
        basicDataSource.setUsername("sa");
        basicDataSource.setPassword("");
        return basicDataSource;
    }

    1.3 基于JDBC驱动的数据源
    在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供了三个这样的数据源类供选择

    DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接。与JDBC的BasicDataSource不同,由DriverManagerDataSource提供的连接并没有进行池化管理。
    SimpleDriverDataSource:与DriverManagerDataSource工作方式类似,但是它直接使用JDBC驱动,来解决在特定环境下的类加载问题,这样的环境包括OSGi容器。
    SingleConnectionDataSource:在每个连接请求时都会返回同一个的连接。尽管SingleConnectionDataSource不是严格意义上的连接池数据源,但是可以将其视为只有一个连接的池。
    注意:SingleConnectionDataSource有且只有一个数据库连接,不适于多线程,DriverManagerDataSource和SimpleDriverDataSource尽管支持多线程,但是在每次请求的时候都会创建新连接,这是以性能为代价的。

    使用Java配置,借助DriverManagerDataSource类的bean声明:

    //基于JDBC驱动的数据源
    @Bean
    public DataSource jdbcDataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:tcp://localhost/~/spitter");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        return dataSource;
    }

    1.4 使用嵌入式的数据源

    使用Java配置借助EmbeddedDatabaseBuilder类的bean声明:

    @Bean
    public DataSource developmentDataSource(){
        //嵌入式数据原:每次重启应用或运行测试的时候,都能够重新填充测试数据
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript("classpath:schema.sql")
            .addScript("classpath:test-data.sql")
            .build();
    }

    使用JdbcTemplate来读取数据:

    @Component
    public class DbUserDaoImpl implements DbUserDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        private static final String SQL_INSERT_DBUSER = "insert into user_list (username, mobile, cardnumber) values (?, ?, ?)";
        private static final String SQL_CHECK_DBUSER = "select id,username,mobile,cardnumber from user_list";
        private static final String SQL_FINDBYID_DBUSER = "select id,username,mobile,cardnumber from user_list where id = ?";
        private static final String SQL_UPDATE_DBUSER = "update user_list set username = ?,mobile = ?,cardnumber = ? where id = ?";
    
        @Override
        public void addDbUser(DbUser dbUser) {
            jdbcTemplate.update(SQL_INSERT_DBUSER, dbUser.getUsername(), dbUser.getMobile(), dbUser.getCardnumber());
        }
    
        @Override
        public List<DbUser> findAll() {
            return jdbcTemplate.query(SQL_CHECK_DBUSER, new DbUserRowMapper());
        }
    
        @Override
        public DbUser findById(int id) {
            return jdbcTemplate.queryForObject(SQL_FINDBYID_DBUSER, new DbUserRowMapper(), id);
        }
    
        public static final class DbUserRowMapper implements RowMapper<DbUser>{
            public DbUser mapRow(ResultSet rs, int rowNum) throws SQLException {
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String mobile = rs.getString("mobile");
                String cardnumber = rs.getString("cardnumber");
    
                DbUser dbUser = new DbUser();
                dbUser.setId(id);
                dbUser.setUsername(username);
                dbUser.setMobile(mobile);
                dbUser.setCardnumber(cardnumber);
    
                return dbUser;
            }
        }
    
        public DbUser save(DbUser dbUser){
            if(dbUser.getId() == null){
                int id = insertDbUserAndReturnId(dbUser);
                return jdbcTemplate.queryForObject(SQL_FINDBYID_DBUSER, new DbUserRowMapper(), id);
            }
    
            jdbcTemplate.update(SQL_UPDATE_DBUSER, dbUser.getUsername(), dbUser.getMobile(), dbUser.getCardnumber(), dbUser.getId());
    
            return dbUser;
        }
    
        public int insertDbUserAndReturnId(DbUser dbUser){
            SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate).withTableName("user_list");
            jdbcInsert.setGeneratedKeyName("id");
            Map<String, Object> map = new HashMap<>();
            map.put("username", dbUser.getUsername());
            map.put("mobile", dbUser.getMobile());
            map.put("cardnumber", dbUser.getCardnumber());
            int id = jdbcInsert.executeAndReturnKey(map).intValue();
            return id;
        }
    }

    此文来源于:https://blog.csdn.net/qq_22314145/article/details/81562244

  • 相关阅读:
    [WPF]根据内容自动设置大小的RichTextBox
    SICP In Other Languages
    VS 代码段编辑器
    利用SQL Server Migration Assistant将access数据库导入到SQL
    关于gcc on windows的“拒绝访问”问题
    文本比较(C#版本)
    [WPF]自定义鼠标指针
    哎~~~又是RichTextBox
    [iphone]想或正在做iphone开发的朋友,这里有点ppt和demo
    Windows Phone 7 的 “界面设计与交互指南”
  • 原文地址:https://www.cnblogs.com/JonaLin/p/11301675.html
Copyright © 2011-2022 走看看