最基础的数据库操作,SpringBoot省去了那一堆创建Connection,连接关闭操作,现在使用起来不能更方便了。
- 第一步需要引入maven包,由于我的是mysql所以,引入了mysql的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 配置数据源,配置自己数据的地址账号密码信息
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
- 通过注入JdbcTemplate来托管了一起数据库的连接释放等操作。第一种jdbcTemplate直接通过insert方法写入语句执行,但是此时返回的结果只是执行成功还是失败。
如果需要等到生成的ID的值,需要通过SimpleJdbcInsert的executeAndReturnKey方法来获取结果。
@Repository("rideRepository")
public class RideRepositoryImpl implements RideRepository {
@Autowired
private JdbcTemplate jdbcTempleate;
public Ride createRide(Ride ride){
//第一种不返回插入的数据自动生成的ID值
jdbcTempleate.update("insert into ride (name,duration) values (?,?)", ride.getName(), ride.getDuration());
//第二种可以获取到生成的id值
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTempleate);
List<String> columns = new ArrayList<>();
columns.add("name");
columns.add("duration");
insert.setTableName("ride");
insert.setColumnNames(columns);
Map<String, Object> data = new HashMap<>();
data.put("name", ride.getName());
data.put("duration", ride.getDuration());
insert.setGeneratedKeyName("id");
Number key = insert.executeAndReturnKey(data);
return null;
}
}
- 通过jdbcTemplate可以获取到查询结果,通过RowMapper对应到具体的bean,以及可以将RowMapper抽象成自定义的RideRowMapper类
@Override
public List<Ride> getRides() {
List<Ride> rides = jdbcTempleate.query("select * from ride", new RowMapper<Ride>() {
@Override
public Ride mapRow(ResultSet resultSet, int i) throws SQLException {
Ride ride = new Ride();
ride.setId(resultSet.getInt("id"));
ride.setName(resultSet.getString("name"));
ride.setDuration(resultSet.getInt("duration"));
return ride;
}
});
return rides;
}
class RideRowMapper implements RowMapper<Ride>{
@Override
public Ride mapRow(ResultSet resultSet, int i) throws SQLException {
Ride ride = new Ride();
ride.setId(resultSet.getInt("id"));
ride.setName(resultSet.getString("name"));
ride.setDuration(resultSet.getInt("duration"));
return ride;
}
}
- 另外可以通过KeyHolder获取插入的字增长的id值,需要通过PreparedStatementCreator来实现
public Ride createRide(Ride ride){
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTempleate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("insert into ride (name,duration) values (?,?)", new String[] {"id"});
ps.setString(1,ride.getName());
ps.setInt(2, ride.getDuration());
return ps;
}
}, keyHolder);
Number id = keyHolder.getKey();
return getRide(id.intValue());
}
private Ride getRide(int id) {
return jdbcTempleate.queryForObject("select * from ride", new RideRowMapper());
}
- 更新数据方法
private Ride updateRide(Ride ride) {
jdbcTempleate.update("update ride set name = ?, duration = ? where id = ?",
ride.getName(), ride.getDuration(), ride.getId());
return null;
}
- 批量更新方法,需要通过转化成list以及内部是数组格式,要按照和sql语句的位置相同的数据格式
public void batch(){
List<Ride> rides = this.getRides();
List<Object[]> pairs = new ArrayList<>();
for(Ride ride : rides){
Object[] tmp = {new Date(), ride.getId()};
pairs.add(tmp);
}
this.updateRides(pairs);
}
public void updateRides(List<Object[]> pairs) {
jdbcTempleate.batchUpdate("update ride set ride_date = ? where id = ?", pairs);
}
- delete数据方法
public Ride deleteRide(int id) {
//直接通过jdbcTemplate处理,参数为问号
jdbcTempleate.update("delete from ride where id = ?", id);
//通过NamedParameterJdbcTemplate来处理,参数放在map中,问好被替换为“:id”
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTempleate);
Map<String,Object> paramMap = new HashMap();
paramMap.put("id", id);
namedParameterJdbcTemplate.update("delete from ride where id = :id", paramMap);
return null;
}
网友评论