Spring的jdbcTemplate操作
1.Spring 框架一站式框架
- 针对 JavaEE 三层,每一层都有解决技术
- 在dao层,使用jdbcTemplate
2.Spring 对不同持久化技术的支持
- Spring为各种支持的持久化技术,都提供了简单操作的模板和回调。
ORM持久化技术 | 模板类 |
---|---|
JDBC | org.springframework.jdbc.core.JdbcTemplate |
Hibernate5.0 | org.springframework.orm.hibernate5.HibernateTemplate |
IBatis(MyBatis) | org.springframework.orm.ibatis.SqlMapClientTemplate |
JPA | org.springframework.orm.jpa.JpaTemplate |
jdbcTemplate 对 jdbc进行封装
3.jdbcTemplate 使用和Apache公司的DBUtils使用很相似,都是对数据库进行crud操作。
使用jdbcTemplate时要先导包。这里必须导入spring-tx和jdbcTemplate这两个包,缺一不可,虽然spring-tx是关于事务管理的包,但是里面也有jdbcTemplate对tx的依赖。
最后别忘了导入数据库驱动的包
jdbcTemplate 依赖连接池(这里用到的不是c3p0连接池)获取数据库连接,所以必须先构造连接池。
下面介绍四个操作:增删改查
增加
@Test
public void add() {
//因为JDBCTemplate是依赖数据库连接池的,所以先构造连接池
DriverManagerDataSource driverManagerDataSource=new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/template");
driverManagerDataSource.setUsername("root");
driverManagerDataSource.setPassword("");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate=new JdbcTemplate(driverManagerDataSource);
//调用jdbctemplate对象里面的方法实现操作
String sql="insert into user values(?,?)";
int rows=jdbcTemplate.update(sql, "FireLang","123456");
System.out.println(rows);
}
注意上面代码中的数据库url是jdbc:mysql://localhost:3306/template
,其实这样写也可以jdbc:mysql:///template
修改
@Test
public void update(){
//因为JDBCTemplate是依赖数据库连接池的,所以先构造连接池
DriverManagerDataSource driverManagerDataSource=new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/template");
driverManagerDataSource.setUsername("root");
driverManagerDataSource.setPassword("");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate=new JdbcTemplate(driverManagerDataSource);
//调用jdbctemplate对象里面的方法实现操作
String sql="update user set password=? where name=?";
int rows=jdbcTemplate.update(sql, "1314520","FireLang");
System.out.println(rows);
}
删除
@Test
public void delete(){
//因为JDBCTemplate是依赖数据库连接池的,所以先构造连接池
DriverManagerDataSource driverManagerDataSource=new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/template");
driverManagerDataSource.setUsername("root");
driverManagerDataSource.setPassword("");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate=new JdbcTemplate(driverManagerDataSource);
//调用jdbctemplate对象里面的方法实现操作
String sql="delete from user where name=?";
int rows=jdbcTemplate.update(sql, "LangShen");
System.out.println(rows);
}
查询
使用jdbcTemplate实现查询操作
jdbcTemplate实现查询,有接口RowMapper
jdbcTemplate针对这个接口并没有提供实现类,得到不同的类型数据需要自己进行数据封装
查询单值:
@Test
public void showSingleTyepValue(){
//因为JDBCTemplate是依赖数据库连接池的,所以先构造连接池
DriverManagerDataSource driverManagerDataSource=new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/template");
driverManagerDataSource.setUsername("root");
driverManagerDataSource.setPassword("");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate=new JdbcTemplate(driverManagerDataSource);
//调用jdbctemplate对象里面的方法实现操作
String sql="select count(name) from user";
int count=jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
查询对象:
@Test
public void showSingleObject(){
//因为JDBCTemplate是依赖数据库连接池的,所以先构造连接池
DriverManagerDataSource driverManagerDataSource=new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/template");
driverManagerDataSource.setUsername("root");
driverManagerDataSource.setPassword("");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate=new JdbcTemplate(driverManagerDataSource);
//调用jdbctemplate对象里面的方法实现操作
String sql="select * from user where name=?";//这里查询出来的是单个对象。
User temp=jdbcTemplate.queryForObject(sql, new RowMapper<User>(){
@Override
public User mapRow(ResultSet result, int num) throws SQLException {//这里的num表示行号,比如我查询出了几个数据,而num代表ResultSet里面的行号。
User user=new User(result.getString("name"), result.getString("password"));
return user;
}
},"FireLang");
System.out.println(temp);
}
查询返回List集合
@Test
public void showList(){
//因为JDBCTemplate是依赖数据库连接池的,所以先构造连接池
DriverManagerDataSource driverManagerDataSource=new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/template");
driverManagerDataSource.setUsername("root");
driverManagerDataSource.setPassword("");
//创建jdbctemplate对象,设置数据源
JdbcTemplate jdbcTemplate=new JdbcTemplate(driverManagerDataSource);
//调用jdbctemplate对象里面的方法实现操作
String sql="select * from user";//查询所有
List<User> templist=jdbcTemplate.query(sql, new RowMapper<User>(){
@Override
public User mapRow(ResultSet result, int num) throws SQLException {//这里的num表示行号,比如我查询出了几个数据,而num代表ResultSet里面的行号。
System.out.println("当前行数: "+num);
User user=new User(result.getString("name"), result.getString("password"));
return user;
}
});
System.out.println(templist);
}
/*
输出结果:
当前行数: 0
当前行数: 1
[User [name=FireLang, password=1314520], User [name=LangShen, password=123456]]
*/