DBUtils工具类实现CRUD操作
使用DBUtils工具类实现CRUD操作,释放资源关闭连接等操作还是要自己手写实现。而使用JdbcTemplate,它不仅处理了资源的建立和释放,帮我们避免一些常见的错误,比如忘了要关闭连接。
JdbcTemplate是Spring的一部分,JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。
数据库连接池
注:这里使用Druid数据库连接池
扩展:在JdbcTemplate中执行SQL语句的方法大致分为3类:
execute
:可以执行所有SQL语句,一般用于执行建库建表等DDL语句。update
:用于执行INSERT、UPDATE、DELETE等DML语句。queryXxx
:用于数据查询的DQL语句。 /*
JdbcTemplate实现增删改
*/
//使用JdbcTemplate对象的update方法进行增删改
@Test
public void testUpdate(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
//增
jdbcTemplate.update("insert into test_person values(null,?,?,?)","百里",123,"200102");
//改
jdbcTemplate.update("update test_person set password=? where id=?","000000",1);
//删
jdbcTemplate.update("delete from test_person where username=?","百里");
} catch (SQLException e) {
e.printStackTrace();
}
}
//使用JdbcTemplate对象的queryForObject方法查询返回int或long类型数据
/*
spring 3.2.2之后,JdbcTemplate对象的queryForInt方法返回一个整数与queryForLong方法返回一个long类型的数据,已过时。
可用queryForObject方法代替
代替的方法为queryForObject(String sql, Object[] args, Class requiredType),
需要返回的是什么类型,第三个参数则写什么类型,
如:int类型写Integer.class, long类型写Long.class
*/
@Test//以返回int类型的数据为例:
public void testqueryForObjectReturnInt(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "SELECT COUNT(*) FROM test_person";
Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(integer);
//SQL语句中使用?占位,在queryForObject方法的Object数组中传入对应的参数。
// String sql1 = "SELECT COUNT(*) FROM test_person where id >?";
// Integer integer1 = jdbcTemplate.queryForObject(sql1, new Object[]{7}, Integer.class);
// System.out.println(integer1);
} catch (SQLException e) {
e.printStackTrace();
}
}
//使用JdbcTemplate对象的queryForObject(String sql, Object[] args, Class requiredType) 方法查询返回String类型数据
@Test
public void testqueryForObjectReturnString(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "SELECT username FROM test_person where id =?";
String s = jdbcTemplate.queryForObject(sql, new Object[]{7}, String.class);
System.out.println(s);
} catch (SQLException e) {
e.printStackTrace();
}
}
//queryForObject(String sql, RowMapper rowMapper, @Nullable Object... args) 方法查询返回一个对象
@Test
public void testqueryForObjectReturnObj(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "SELECT * FROM test_person where id =?";
/* 自定义类型转换器,查询单个。 查询多个使用jdbcTemplate.query()
Person person = jdbcTemplate.queryForObject(sql, new RowMapper() {
@Override
public Person mapRow(ResultSet resultSet, int i) throws SQLException {
Person person = new Person();
person.setId(resultSet.getInt("id"));
person.setUsername(resultSet.getString("username"));
person.setPassword(resultSet.getString("password"));
person.setBirthday(resultSet.getDate("birthday"));
return person;
}
}, 7);*/
//BeanPropertyRowMapper类实现了RowMapper接口,简化了对数据封装的操作
Person person = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Person.class), 7);
System.out.println(person);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testqueryForMap(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "SELECT * FROM test_person where id =?";
Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql,6);
System.out.println(stringObjectMap);
//map的key是数据库中该条记录各字段名,map的value是数据库中该条记录各字段名对应的值
//{id=6, username=张三, password=123456, birthday=2020-02-25}
} catch (SQLException e) {
e.printStackTrace();
}
}
//使用JdbcTemplate对象的queryForList(String sql, Object... args)方法返回一个List集合对象,集合对象存放的是Map类型的数据
@Test
public void testqueryForList(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "SELECT * FROM test_person where id >=?";
List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql, 7);
System.out.println(mapList);
//将查询到的一记录放到一个Map中,查询到的多条记录对应多个Map,再把这多个Map放到一个List集合中
//[{id=7, username=李四, password=000000, birthday=2020-02-24}, {id=8, username=王五, password=888888, birthday=2020-02-23}]
//遍历集合
for (Map<String, Object> map:mapList) {
System.out.println(map);
//{id=7, username=李四, password=000000, birthday=2020-02-24}
//{id=8, username=王五, password=888888, birthday=2020-02-23}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/*使用JdbcTemplate对象的query方法,以RowMapper做映射返回对象
public List query(String sql, RowMapper rowMapper):执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。
*/
@Test
public void testqueryForRowMapper(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "SELECT * FROM test_person ";
List<Person> personList = jdbcTemplate.query(sql, new RowMapper<Person>() {
//在匿名内部类中将结果集中的一行记录转成一个Person对象
@Override
public Person mapRow(ResultSet resultSet, int i) throws SQLException {
Person person = new Person();
person.setId(resultSet.getInt("id"));
person.setUsername(resultSet.getString("username"));
person.setPassword(resultSet.getString("password"));
person.setBirthday(resultSet.getDate("birthday"));
return person;
}
});
//遍历personList
for (Person p :personList) {
System.out.println(p);
// Person{id=6, username='张三', password='123456', birthday=2020-02-25}
// Person{id=7, username='李四', password='000000', birthday=2020-02-24}
// Person{id=8, username='王五', password='888888', birthday=2020-02-23}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/*使用JdbcTemplate对象的query方法,以BeanPropertyRowMapper做映射返回对象,简化前面的操作
public class BeanPropertyRowMapper implements RowMapper: BeanPropertyRowMapper类实现了RowMapper接口。
*/
@Test
public void testqueryForBeanPropertyRowMapper(){
try {
//创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
String sql = "SELECT * FROM test_person ";
List<Person> personList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Person.class));
//遍历personList
for (Person p :personList) {
System.out.println(p);
//Person{id=6, username='张三', password='123456', birthday=2020-02-25 00:00:00.0}
//Person{id=7, username='李四', password='000000', birthday=2020-02-24 00:00:00.0}
//Person{id=8, username='王五', password='888888', birthday=2020-02-23 00:00:00.0}
}
} catch (SQLException e) {
e.printStackTrace();
}
}