暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【玩转Spring】Spring 与 JDBC(一)

程序员的日记本 2018-07-13
160


图片来自于百度图片


内容提前知

1、JdbcTmplate与Spring
2、NamedParameterJdbcTemplate与Spring

JdbcTemplate

Spring提供了多种数据模板,常用的是JdbcTemplate、HibernateTemplate、NamedParameterJdbcTemplate、JpaTemplate、SqlMapClientTemplate。今天我们主要说一说JdbcTemplate。

数据源

大家使用Jdbc连接数据库之前,都需要先配置数据库连接;同理在Spring一样为我们提供了配置数据库连接的方式,主要有jdbc和连接池两种方式。

/////首先加载spring jdbc驱动包以及mysql驱动包
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.23</version>
</dependency>

///jdbc方式获取数据源
@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc?useUnicode=true&characterEncoding=utf8&autoReconnect=true");
    dataSource.setPassword("xxxx");
    dataSource.setUsername("root");
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    return dataSource;
}


而连接池方式连接数据库又提供了多种连接池支持,主要含DBCP、C3P0、BoneCP等,其中第一、第二为我们常使用。

///连接池方式获取数据源
@Bean
public DataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc?useUnicode=true&characterEncoding=utf8");
    dataSource.setPassword("xxxx");
    dataSource.setUsername("root");
    dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
    // 默认
    dataSource.setInitialSize(5);   
    //最大连接数
    dataSource.setMaxActive(100);   
    return dataSource;
}

DBCP详细配置:http://commons.apache.org/proper/commons-dbcp/api-2.4.0/index.html
C3P0详细配置:https://www.mchange.com/projects/c3p0/


JdbcTtemplate

/////在rootconfig中配置jdbcTemplate
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSourc) {
    return new JdbcTemplate(dataSourc);
}

/////数据库内容转成对象
public class User {
    private int id;
    private String loginName;
    private String loginPass;
    private String userName;
    private int sex;
    //set 和 get
}

/////RowMapper
public class UserRowMapper implements RowMapper<User{
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getInt("id"));
        user.setLoginName(rs.getString("login_name"));
        user.setLoginPass(rs.getString("login_pass"));
        user.setSex(rs.getInt("sex"));
        user.setUserName(rs.getString("user_name"));
        return user;
    }
}

/////Dao
@Repository
public class UserDao {
    @Autowired
    JdbcTemplate jdbcTemplate;

    public User findUser(int id) {
        String sql = "select * from springjdbc_user where id = ?";
        return (User) jdbcTemplate.queryForObject(sql , new Object[] {id} , new int[] {Type.INT} , new UserRowMapper() );
    }
}

/////service
@Service
public class UserService {
    @Autowired 
    UserDao userDao;

    public User findUser(int id) {
        User user;
        user = userDao.findUser(id);
        return user;
    }
}

/////controller
@RestController
public class IndexController {
    @Autowired
    UserService userService;    
    @RequestMapping(value="/user/{id}")
    public User toindex(@PathVariable("id") int id) {
        return userService.findUser(id);
    }
}

NamedParameterJdbcTemplate

NamedParameterJdbcTemplate可以使用命名参数。

/////NamedParameterJdbcTemplate
@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate(DataSource dataSource) {
    return new NamedParameterJdbcTemplate(dataSource);
}

/////Dao
@Repository
public class UserDao {
    @Autowired
    NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    public User findUser(int id) {
        String sql = "select * from springjdbc_user where id = :id";
        Map<String , Object> map = new HashMap<String, Object>();
        map.put("id", id);
        return (User) namedParameterJdbcTemplate.queryForObject(sql, map, new UserRowMapper());
    }
}


下期预告

这里只讲到了利用JdbcTemplate进行查询,但是确没有讲到新增、删除等操作,因为这些操作涉及到事务相关知识,因此将在下一期进行讲解,希望不要错过。


如果你对Linux、Java后端、分布式系统感兴趣,扫描上方二维码,欢迎加入我们的知识星球。

文章转载自程序员的日记本,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论