Spring框架之JDBC操作(2.0)
实现对数据的CRUD操作:
实现CRUD的操作类:
org.springframework.jdbc.core.JdbcTemplate;
数据的更新操作:update;
1,建立数据库脚本:
-- 删除数据库
DROP DATABASE IF EXISTS mldn ;
-- 创建数据库
CREATE DATABASE mldn CHARACTER SET UTF8 ;
-- 使用数据库
USE mldn ;
-- 删除数据表
DROP TABLE IF EXISTS member ;
-- 创建member表
CREATE TABLE member(
mid VARCHAR(50) ,
name VARCHAR(50) ,
age INT ,
sex VARCHAR(10) ,
birthday DATE ,
salary DOUBLE ,
note TEXT ,
CONSTRAINT pk_mid PRIMARY KEY(mid)
) type=innodb ;
-- 增加测试数据
INSERT INTO member(mid,name,age,birthday,salary,note,sex) VALUES ('mldn-a','张三',10,'1991-11-11',11.1,'不错','男') ;
INSERT INTO member(mid,name,age,birthday,salary,note,sex) VALUES ('mldn-b','李四',10,'1991-11-12',21.1,'很好','男') ;
INSERT INTO member(mid,name,age,birthday,salary,note,sex) VALUES ('mldn-c','王五',10,'1991-11-13',31.1,'凑合','女') ;
INSERT INTO member(mid,name,age,birthday,salary,note,sex) VALUES ('mldn-d','赵六',10,'1991-11-14',41.1,'邋遢','女') ;
INSERT INTO member(mid,name,age,birthday,salary,note,sex) VALUES ('mldn-e','孙七',10,'1991-11-15',51.1,'肮脏','女') ;
INSERT INTO member(mid,name,age,birthday,salary,note,sex) VALUES ('mldn-f','王八',10,'1991-11-16',61.1,'龌龊','男') ;
2,利用Spring管理数据库连接
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mldn"/>
<property name="username" value="root"/>
<property name="password" value="mysqladmin"/>
</bean>
</beans>
3,编写测试类:对数据进行增加操作
package cn.mldn.demo;
import java.util.Date;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class TestInsertDemo {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
DriverManagerDataSource dataSource = ctx.getBean("dataSource",
DriverManagerDataSource.class);
JdbcTemplate jt = new JdbcTemplate(dataSource); // 取得JDBC模版对象
String sql = "INSERT INTO member(mid,name,age,sex,birthday,salary,note) VALUES (?,?,?,?,?,?,?)";
int len = jt.update(sql, "mldn-hello", "张三", 10, "男", new Date(),
1000.0, "一个不错的人"); // 返回影响的数据行
System.out.println(len);
dataSource.getConnection().close(); // 关闭数据库
}
}
运行结果:
另外的更新处理:
范例:自己处理PreparedStatement
package cn.mldn.demo;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class TestInsertDemo2 {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
DriverManagerDataSource dataSource = ctx.getBean("dataSource",
DriverManagerDataSource.class);
JdbcTemplate jt = new JdbcTemplate(dataSource); // 取得JDBC模版对象
String sql = "INSERT INTO member(mid,name,age,sex,birthday,salary,note) VALUES (?,?,?,?,?,?,?)";
int len = jt.update(sql, new PreparedStatementSetter(){
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setString(1, "mldn-你好");
pstmt.setString(2, "李四");
pstmt.setInt(3, 12);
pstmt.setString(4, "男");
pstmt.setDate(5, new java.sql.Date(new java.util.Date().getTime()));
pstmt.setDouble(6, 1111.11);
pstmt.setString(7, "很麻烦");
}}); // 返回影响的数据行
System.out.println(len);
dataSource.getConnection().close(); // 关闭数据库
}
}
PreparedStatementSetter()接口的实例化操作用到匿名内部类;
此省略增加和删除操作;
数据的查询操作:Retrieve;
查询里面最为关键的一个功能是需要将查询结果变为VO的形式返回。
1,根据数据表建立VO类:
package cn.mldn.vo;
import java.io.Serializable;
import java.util.Date;
@SuppressWarnings("serial")
public class Member implements Serializable {
private String mid ;
private String name ;
private Integer age ;
private String sex ;
private Date birthday ;
private Double salary ;
private String note ;
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
@Override
public String toString() {
return "Member [mid=" + mid + ", name=" + name + ", age=" + age
+ ", sex=" + sex + ", birthday=" + birthday + ", salary="
+ salary + ", note=" + note + "]\n";
}
}
2,建立测试类:
package cn.mldn.demo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import cn.mldn.vo.Member;
public class TestQueryDemoA {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
DriverManagerDataSource dataSource = ctx.getBean("dataSource",
DriverManagerDataSource.class);
JdbcTemplate jt = new JdbcTemplate(dataSource); // 取得JDBC模版对象
String sql = "SELECT mid,name,age,sex,birthday,salary,note FROM member";
List<Member> all = jt.query(sql, new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
System.out.println("当前处理行:" + rowNum);
Member vo = new Member() ;
vo.setMid(rs.getString(1));
vo.setName(rs.getString(2));
vo.setAge(rs.getInt(3));
vo.setSex(rs.getString(4));
vo.setBirthday(rs.getDate(5));
vo.setSalary(rs.getDouble(6));
vo.setNote(rs.getString(7));
return vo;
}}) ;
System.out.println(all);
dataSource.getConnection().close(); // 关闭数据库
}
}
3,运行结果:
另一种查询:queryForObject()(单个对象)和queryForList()(单列数据);
范例:只查询一个member数据:
package cn.mldn.demo;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import cn.mldn.vo.Member;
public class TestQueryDemoB {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
DriverManagerDataSource dataSource = ctx.getBean("dataSource",
DriverManagerDataSource.class);
JdbcTemplate jt = new JdbcTemplate(dataSource); // 取得JDBC模版对象
String sql = "SELECT mid,name,age,sex,birthday,salary,note FROM member WHERE mid=?";
Member member = jt.queryForObject(sql, new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
System.out.println("当前处理行:" + rowNum);
Member vo = new Member() ;
vo.setMid(rs.getString(1));
vo.setName(rs.getString(2));
vo.setAge(rs.getInt(3));
vo.setSex(rs.getString(4));
vo.setBirthday(rs.getDate(5));
vo.setSalary(rs.getDouble(6));
vo.setNote(rs.getString(7));
return vo;
}},"mldn-hello") ;
System.out.println(member);
dataSource.getConnection().close(); // 关闭数据库
}
}
范例:查询一列数据:
package cn.mldn.demo;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class TestQueryDemoC {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
DriverManagerDataSource dataSource = ctx.getBean("dataSource",
DriverManagerDataSource.class);
JdbcTemplate jt = new JdbcTemplate(dataSource); // 取得JDBC模版对象
String sql = "SELECT mid FROM member";
List<String> all = jt.queryForList(sql, String.class) ;
System.out.println(all);
dataSource.getConnection().close(); // 关闭数据库
}
}
所以能提供VO查询的方法只有query()一个方法,而其他的都是辅助功能。