使用Spring 的JDBC
先创建表:
- DROP TABLE IF EXISTS `springjdbc`.`t_people`;
- CREATE TABLE `springjdbc`.`t_people` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `name` varchar(45) NOT NULL,
- `birthDay` datetime DEFAULT NULL,
- `sex` tinyint(1) DEFAULT NULL,
- `weight` double DEFAULT NULL,
- `height` float DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
再创建实体对象:
com.spring305.jdbc.po.People.java
- public class People implements Serializable {
- private static final long serialVersionUID = -8692237020492316757L;
- private int id;
- private String name;
- private Date birthDay;
- private Boolean sex;
- private Double weight;
- private float height;
- public People() {
- super();
- }
- public People(int id, String name, Date birthDay, Boolean sex,
- Double weight, float height) {
- super();
- this.id = id;
- this.name = name;
- this.birthDay = birthDay;
- this.sex = sex;
- this.weight = weight;
- this.height = height;
- }
- ...
- }
DAO接口:
com.spring305.jdbc.dao.PeopleDao.java
- import java.io.Serializable;
- import java.sql.SQLException;
- import java.util.Date;
- import java.util.List;
- import java.util.Map;
- import com.spring305.jdbc.page.CurrentPage;
- import com.spring305.jdbc.po.People;
- /**
- * DAO接口
- * @author ZhengChao
- *
- */
- public interface PeopleDao {
- /**
- * 创建数据库表结构
- * @param sql
- * @return
- */
- void doCreateTable(String sql);
- /**
- * 保存对象
- * @param p
- */
- void doSaveObj(People p);
- /**
- * 通过主键删除对象
- * @param id
- */
- void doDeleteObj(int id);
- /**
- * 更新对象
- * @param p
- */
- void doUpdateObj(People p);
- /**
- * 通过主键得到对象
- * @param id
- * @return
- */
- Serializable getObjByID(int id);
- /**
- * 通过主键得到日期类属性
- * @param id
- * @return
- */
- Date getBirthDay(int id);
- /**
- * 通过主键得到名字属性
- * @param id
- * @return
- */
- String getNameAttri(int id);
- /**
- * 通过主键拿到对象集合
- * @param id
- * @return
- */
- List<People> getObjsByID(int id);
- /**
- * 取总和
- * @return
- */
- int getCountEntites();
- /**
- * 得到对象的集合
- * @return
- */
- List<Map<String, Object>> getList();
- /**
- * 分页查找
- * @param pageNo
- * @param pageSize
- * @param id
- * @return
- * @throws SQLException
- */
- CurrentPage<People> getPeoplePage(final int pageNo, final int pageSize,int id) throws SQLException;
- /**
- * 使用NamedParameterJdbcTemplate命名参数
- * @param id
- * @return
- */
- int getNamedParameterJdbcCounts(int id);
- /**
- * 得到自动生成的主键
- * @return
- */
- int getAutoIncrementKey();
- /**
- * 批处理
- * @param actors
- * @return
- */
- int[] batchUpdate(final List<People> actors);
- }
实现类:
com.spring305.jdbc.dao.impl.PeopleDaoImpl.java
- import java.io.Serializable;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.Map;
- import javax.sql.DataSource;
- import org.springframework.jdbc.core.BatchPreparedStatementSetter;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.jdbc.core.PreparedStatementCreator;
- import org.springframework.jdbc.core.RowMapper;
- import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
- import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
- import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
- import org.springframework.jdbc.core.namedparam.SqlParameterSource;
- import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
- import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
- import org.springframework.jdbc.datasource.DriverManagerDataSource;
- import org.springframework.jdbc.support.GeneratedKeyHolder;
- import org.springframework.jdbc.support.KeyHolder;
- import com.spring305.jdbc.dao.PeopleDao;
- import com.spring305.jdbc.page.CurrentPage;
- import com.spring305.jdbc.page.PagingHelper;
- import com.spring305.jdbc.po.People;
- public class PeopleDaoImpl implements PeopleDao {
- //private DataSource dataSource;
- private JdbcTemplate jdbcTemplate;
- //NamedParameterJdbcTemplate为JDBC操作增加了命名参数的特性支持,而不是传统的使用('?')作为参数的占位符。
- private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
- private SimpleJdbcTemplate simpleJdbcTemplate;
- public void setDataSource(DataSource dataSource) {
- //this.dataSource = dataSource;
- this.jdbcTemplate = new JdbcTemplate(dataSource);
- this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
- this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
- /**
- *DriverManagerDataSource dataSource2 = new DriverManagerDataSource();
- dataSource2.setDriverClassName("org.hsqldb.jdbcDriver");
- dataSource2.setUrl("jdbc:hsqldb:hsql://localhost:");
- dataSource2.setUsername("sa");
- dataSource2.setPassword("");
- */
- }
- /**
- *官方文档上还有例子:
- *this.jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)","Leonor", "Watling");
- *this.jdbcTemplate.update("update t_actor set = ? where id = ?","Banjo", 5276L);
- *this.jdbcTemplate.update("delete from actor where id = ?",Long.valueOf(actorId));
- *存储过程:
- *this.jdbcTemplate.update("call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",Long.valueOf(unionId));
- */
- @Override
- public void doCreateTable(String sql) {
- this.jdbcTemplate.execute(sql);
- }
- @Override
- public void doDeleteObj(int id) {
- this.jdbcTemplate.update("delete from T_people where id = ?",id);//Long.valueOf(id)
- }
- @Override
- public void doSaveObj(People p) {
- //插入方式其一 ,原始的,拼写sql语句后直接发送执行
- /**
- * this.jdbcTemplate.update("insert into T_people(name,birthDay,sex,weight,height) values(" +
- "'"+p.getName()+"','"+new java.sql.Timestamp(p.getBirthDay().getTime())+"',"+p.getSex()+","+p.getWeight()+","+p.getHeight()+")");
- */
- //插入方式二
- jdbcTemplate.update("insert into T_people(name,birthDay,sex,weight,height) values(?,?,?,?,?)",
- new Object[]{p.getName(),p.getBirthDay(),p.getSex(),p.getWeight(),p.getHeight()},
- new int[]{java.sql.Types.VARCHAR,java.sql.Types.TIMESTAMP,java.sql.Types.BOOLEAN,
- //java.sql.Types.DATE,则插入的只有日期,没有时间,2011-04-24 00:00:00;TIMESTAMP:2011-04-24 19:09:24
- java.sql.Types.DOUBLE,java.sql.Types.FLOAT});
- }
- id name birthDay sex weight height
- @Override
- public void doUpdateObj(People p) {
- jdbcTemplate.update("update T_people set name = ? , birthDay = ? , sex = ? , weight = ? , height = ? where id = ? ",
- new Object[]{p.getName(),p.getBirthDay(),p.getSex(),
- p.getWeight(),p.getHeight(),p.getId()},
- new int[]{java.sql.Types.VARCHAR,java.sql.Types.DATE,java.sql.Types.BOOLEAN,
- java.sql.Types.DOUBLE,java.sql.Types.FLOAT,java.sql.Types.INTEGER});
- }
- @Override
- public int getCountEntites() {
- //int rowCount = this.jdbcTemplate.queryForInt("select count(*) from T_People");
- int rowCount = this.jdbcTemplate.queryForInt("select count(*) from T_people where id >= ?",new Object[]{1});
- //select count(*) from T_people where id >= ?
- //= this.jdbcTemplate.queryForInt("select count(*) from T_People where name = ?", "XXX");
- return rowCount;
- }
- @Override
- public Serializable getObjByID(int id) {
- //Query for a String
- //this.jdbcTemplate.queryForObject("select name from T_People where id = ?",new Object[]{1212}, String.class);
- People p = this.jdbcTemplate.queryForObject("select * from T_people where id = ?", new Object[]{id},
- new RowMapper<People>() {
- @Override
- public People mapRow(ResultSet rs, int rowNum)
- throws SQLException {
- People p = new People();
- p.setId(rs.getInt("id"));
- p.setName(rs.getString("name"));
- p.setBirthDay(rs.getDate("birthDay"));
- p.setWeight(rs.getDouble("weight"));
- p.setHeight(rs.getFloat("height"));
- p.setSex(rs.getBoolean("sex"));
- return p;
- }
- }
- );
- return p;
- }
- @Override
- public List<People> getObjsByID(int id) {
- List<People> plist = this.jdbcTemplate.query("select * from T_people where id >= ?", new Object[]{id},
- new RowMapper<People>() {
- @Override
- public People mapRow(ResultSet rs, int rowNum)
- throws SQLException {
- People p = new People();
- p.setId(rs.getInt("id"));
- p.setName(rs.getString("name"));
- p.setBirthDay(rs.getDate("birthDay"));
- p.setWeight(rs.getDouble("weight"));
- p.setHeight(rs.getFloat("height"));
- p.setSex(rs.getBoolean("sex"));
- return p;
- }
- }
- );
- return plist;
- }
- //上面这个List也可以用下面来实现
- public List<People> getObjsByID2(int id) {
- return this.jdbcTemplate.query("select * from T_people where id >= ?", new Object[]{id},new PeopleMapper());
- }
- private static final class PeopleMapper implements RowMapper<People> {
- public People mapRow(ResultSet rs, int rowNum) throws SQLException {
- People p = new People();
- p.setId(rs.getInt("id"));
- p.setName(rs.getString("name"));
- p.setBirthDay(rs.getDate("birthDay"));
- p.setWeight(rs.getDouble("weight"));
- p.setHeight(rs.getFloat("height"));
- p.setSex(rs.getBoolean("sex"));
- return p;
- }
- }
- @Override
- public String getNameAttri(int id) {
- String name = this.jdbcTemplate.queryForObject(
- "select name from T_people where id = ?",
- new Object[]{id}, String.class);
- return name;
- }
- @Override
- public Date getBirthDay(int id) {
- return this.jdbcTemplate.queryForObject(
- "select birthDay from T_people where id = ?",
- new Object[]{id}, Date.class);
- }
- @Override
- public List<Map<String, Object>> getList() {
- return this.jdbcTemplate.queryForList("select * from T_people ");
- }
- @Override
- public int[] batchUpdate(final List<People> peoples) {
- int[] updateCounts = jdbcTemplate.batchUpdate("update T_people set name = ? where id = ?",
- new BatchPreparedStatementSetter() {
- public void setValues(PreparedStatement ps, int i) throws SQLException {
- ps.setString(1, peoples.get(i).getName());
- ps.setInt(2, peoples.get(i).getId());
- }
- public int getBatchSize() {
- return peoples.size();
- }
- });
- return updateCounts;
- }
- /**
- * 返回分页后结果
- * @param pageNo
- * @param pageSize
- * @param id
- * @return
- * @throws SQLException
- */
- public CurrentPage<People> getPeoplePage(final int pageNo, final int pageSize,int id) throws SQLException {
- PagingHelper<People> ph = new PagingHelper<People>();
- CurrentPage<People> p = ph.fetchPage(jdbcTemplate,
- "select count(*) from T_people where id >= ?",//sqlCountRows
- "select * from T_people where id >= ?",//sqlFetchRows
- new Object[]{id},//args
- pageNo,//pageSize
- pageSize,
- new ParameterizedRowMapper<People>() {
- public People mapRow(ResultSet rs, int i) throws SQLException {
- return new People(
- rs.getInt(1),//name,birthDay,sex,weight,height
- rs.getString(2),
- rs.getTimestamp(3),
- rs.getBoolean(4),
- rs.getDouble(5),
- rs.getFloat(6)
- );
- }
- }
- );
- return p;
- }
- @Override
- public int getNamedParameterJdbcCounts(int id) {
- String sql = "select count(*) from T_people where id >= :id";
- SqlParameterSource namedParameters = new MapSqlParameterSource("id", id);
- //传一个对象
- //SqlParameterSource namedParametersx = new BeanPropertySqlParameterSource(new People());
- return namedParameterJdbcTemplate.queryForInt(sql, namedParameters);
- }
- @Override
- public int getAutoIncrementKey() {
- final String INSERT_SQL = "insert into T_people (name) values(?)";
- final String name = "test getAutoIncrementKey";
- KeyHolder keyHolder = new GeneratedKeyHolder();
- jdbcTemplate.update(
- new PreparedStatementCreator() {
- @Override
- public PreparedStatement createPreparedStatement(Connection con)
- throws SQLException {
- PreparedStatement ps = con.prepareStatement(INSERT_SQL, new String[] {name});
- ps.setString(1, name);
- return ps;
- }
- },
- keyHolder);
- return keyHolder.getKey().intValue();
- }
- }
XML(DBCP,c3po...):
- <!-- Spring自带
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- </bean>
- -->
- <!-- c3p0 -->
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
- <property name="driverClass" value="${jdbc.driverClassName}"/>
- <property name="jdbcUrl" value="${jdbc.url}"/>
- <property name="user" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- </bean>
- <!-- DBCP
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- <property name="initialSize" value="1"></property>
- <property name="maxActive" value="100"></property>
- <property name="maxIdle" value="2"></property>
- <property name="minIdle" value="1"></property>
- </bean>
- -->
- <context:property-placeholder location="spring3JDBC.properties"/>
- <bean id="peopleDao" class="com.spring305.jdbc.dao.impl.PeopleDaoImpl">
- <property name="dataSource" ref="dataSource"></property>
- </bean>
测试方法:com.spring305.jdbc.TestJDBC.java
- private static PeopleDao peopleDao = null;
- @BeforeClass
- public static void env(){
- ApplicationContext context = new ClassPathXmlApplicationContext("Spring3JDBC.xml");
- peopleDao = (PeopleDao) context.getBean("peopleDao");
- }
- /**
- * 测试环境
- */
- //@Test
- public void testEnv(){//测试环境
- System.out.println(peopleDao);
- }
- /**
- * DML语句
- */
- //@Test//测试通过,创建表T_person
- public void CreateTable(){
- //java.lang.NoClassDefFoundError: org/apache/commons/collections/CursorableLinkedList报了个错
- //commons-collections.jar 加上此jar
- String createSql = "CREATE TABLE T_people(id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT," +
- "name VARCHAR(45) NOT NULL," +
- "birthDay DATETIME NOT NULL," +
- "sex BOOLEAN NOT NULL," +
- "weight DOUBLE NOT NULL," +
- "height FLOAT NOT NULL," +
- "PRIMARY KEY (id)" +
- ")ENGINE = InnoDB; ";
- peopleDao.doCreateTable(createSql);
- }
- /**
- * 增删改查
- */
- //id name birthDay sex weight height
- //@Test//测试通过,添加二条数据
- public void insert(){
- People people = new People();
- people.setName("ZCtime");
- people.setBirthDay(new Date());
- people.setSex(true);
- people.setHeight(178F);
- people.setWeight(130D);
- peopleDao.doSaveObj(people);
- }
- //@Test//测试通过
- public void update(){
- People people = new People();
- people.setId(1);
- people.setName("TestUpdate");
- people.setBirthDay(new Date());
- people.setSex(true);
- people.setHeight(178F);
- people.setWeight(130D);
- peopleDao.doUpdateObj(people);
- }
- //@Test//测试通过,查询单个对象
- public void selectOne(){
- People p = (People)peopleDao.getObjByID(1);
- System.out.println(p.getName()+"_"+p.getBirthDay());
- }
- //@Test//测试通过,拿到多个对象
- public void selectList(){
- System.out.println(peopleDao.getObjsByID(2).size());
- }
- //@Test//测试通过得到属性为Date的
- public void SelectOneDateAtrri(){
- System.out.println(peopleDao.getBirthDay(1));
- }
- //@Test//测试通过得到属性为String的
- public void selectOneStringAttri(){
- String name = peopleDao.getNameAttri(1);
- System.out.println(name);
- }
- //@Test//测试通过
- public void selectCounts(){
- int counts = peopleDao.getCountEntites();
- System.out.println(counts);
- }
- //@Test//测试通过,这搞出来的怎么类json数据?
- public void selectForList(){
- System.out.println(peopleDao.getList());
- }
- //@Test//测试通过
- public void deleteObj(){
- peopleDao.doDeleteObj(2);
- }
- //@Test//分页测试
- public void testPage() throws SQLException{
- CurrentPage<People> currentPagePeople = peopleDao.getPeoplePage(1, 2, 0);
- List<People> pList = currentPagePeople.getPageItems();
- for (int i = 0; i <pList.size(); i++) {
- System.out.println(pList.get(i));
- }
- }
- //@Test//测试通过,拿到插入后自动生成的主键
- public void getGeneratedKey(){
- System.out.println(peopleDao.getAutoIncrementKey());
- }
- //测试批处理
- @Test
- public void testBatch(){
- People people = new People();
- people.setId(1);
- people.setName("123");
- People people2 = new People();
- people2.setId(3);
- people2.setName("123");
- List<People> peList = new ArrayList<People>();
- peList.add(people);
- peList.add(people2);
- System.out.println(peopleDao.batchUpdate(peList));;
- }