1.Spring JDBC 数据访问
Spring JDBC是Spring所提供的持久层技术,它的主要目标是降低使用JDBC API的门槛,以一种更直接,更简介,更简单的方式使用JDBC API, 在Spring JDBC里,仅需做那些与业务相关的DML操作,而将资源获取,Statment创建,资源释放以及异常处理等繁杂而乏味的工作交给Spring JDBC..
虽然ORM的框架已经成熟丰富,但是JDBC的灵活,直接的特性,依然让他拥有自己的用武之地,如在完全依赖查询模型动态产生查询语句的综合查询系统中,Hibernaye,MyBatis,JPA等框架都无法使用,这里JDBC是唯一的选择.
2.JdbcTemplate 的使用
1.导入jar包
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- 配置的 spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.18.RELEASE</version> </dependency>
2.测试 JdbcTemplate的使用
public void test() { //创建一个连接池 ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource(); try { comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver"); comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm"); comboPooledDataSource.setUser("root"); comboPooledDataSource.setPassword("123"); //2.创建JdbcTemplate对象 JdbcTemplate jdbcTemplate=new JdbcTemplate(comboPooledDataSource); //3.执行sql String sql="insert into users values(null,?,?)"; jdbcTemplate.update(sql,"daimenglaoshi","123"); } catch (PropertyVetoException e) { e.printStackTrace(); } }
3.用spring 创建ComboPooledDataSource和JdbcTemplate对象
3.1添加ioc相关jar包
<!-- 导入spring的核心jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.3.18.RELEASE</version> </dependency>
3.2创建db.properties文件
driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ssm user=root password=123
3.3在applicationContext.xml文件中创建对象
<!-- 导入db.properties文件 --> <context:property-placeholder location="db.properties"></context:property-placeholder> <!-- 创建一个连接池对象 --> <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driverClass}" /> <property name="jdbcUrl" value="${url}"/> <property name="user" value="${user}" /> <property name="password" value="${password}" /> </bean> <!-- 创建一个jdbcTemplate对象 并且通过构造函数 将连接池对象 注入到jdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" > <constructor-arg name="dataSource" ref="comboPooledDataSource" /> </bean>
3.4 修改dao 层
@Component public class UsersDao implements IUsersDao { //注入jdbcTemplate对象 @Autowired private JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } //update方法 (增 删 改) @Override public void add(Users user) { String sql = "insert into users values(null,?,?)"; jdbcTemplate.update(sql, user.getUname(), user.getPassword()); }
3.5测试
@Test public void test() { ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); IUsersDao usersDao= applicationContext.getBean("usersDao",IUsersDao.class); Users user=new Users("xiaowanglaoshi","123"); usersDao.add(user); }
4.JdbcTemplate 常用方法
update:
实现增删改
//update方法 (增 删 改) @Override public void add(Users user) { String sql = "insert into users values(null,?,?)"; jdbcTemplate.update(sql, user.getUname(), user.getPassword()); }
queryForObject:
查询的结果是一个对象或单个值
//测试 根据id号查询 public Users selectUsersById(int uid) { String sql="select * from users where uid=?"; //查询 单行数据 Users user= jdbcTemplate.queryForObject(sql, new Object[]{uid}, new RowMapper<Users>() { @Override public Users mapRow(ResultSet resultSet, int i) throws SQLException { return rowMapHandler(resultSet); } }); return user; } //自己组装对象 public Users rowMapHandler(ResultSet resultSet) throws SQLException { Users user=new Users(); user.setUid(resultSet.getInt("uid")); user.setUname(resultSet.getString("uname")); user.setPassword(resultSet.getString("password")); return user; }
查询的结果是一个数值
public int selectUsersCount() { String sql = "select count(*) from users"; int num = jdbcTemplate.queryForObject(sql, Integer.class); return num; }
query
//查询 返回集合 public List<Users> selectUsers() { String sql = "select * from users"; List<Users> usersList= jdbcTemplate.query(sql, new RowMapper<Users>() { //遍历结果集 将结果集中的每条数据 组装成Users对象 @Override public Users mapRow(ResultSet resultSet, int i) throws SQLException { return rowMapHander(resultSet); } }); return usersList; } //自己组装对象 public Users rowMapHander(ResultSet resultSet) throws SQLException { Users user=new Users(); user.setUid(resultSet.getInt("uid")); user.setUname(resultSet.getString("uname")); user.setPassword(resultSet.getString("password")); return user; }