您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
12_JDBCTemplate_执行DQL语句
发布时间:2022-07-23 16:28:05编辑:雪饮阅读()
本节主要就是JDBCTemplate的各种使用案例及注意事项,
顺便说下这个测试即@Test还是有一点比较好,比如在ide上你可以直接选中要执行的测试方法,就可以单独执行,一般是没有依赖像是普通java类那样的main方法做为入口来调用你想要调用的方法的。
则基于上篇,本节的案例实现如:
JdbcTemplateTest.java:
package day6;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
class User2{
private int id;
//这里的类型需要注意,由于数据库里面这个balance有null的记录
//而double不支持null赋值,需要Double,这东西貌似是原型还是基本数据类型来着
//若这里不修改为Double,则遇到null赋值就出现错误大致如:
//Failed to convert property value of type 'null' to required type 'double' for property 'balance';
//所以建议设置是double,同理其它字段个人认为最好都使用类型的上古类型,始祖类型
private Double balance;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", balance=" + balance +
'}';
}
}
public class JdbcTemplateTest {
private JdbcTemplate template=new JdbcTemplate(DuidUtils.getDataSource());
//增
@Test
public void add(){
int effective_row_count=template.update("insert into user(user,balance) values(?,?)","kasumi20220722",20220722);
System.out.println(effective_row_count);
}
//删
@Test
public void del(){
int effective_row_count=template.update("delete from user where user=? and balance=? ","kasumi20220722",20220722);
System.out.println(effective_row_count);
}
//改
@Test
public void update(){
int effective_row_count=template.update("update user set pwd='xy_kasumi' where user=? and balance=? ","kasumi",12);
System.out.println(effective_row_count);
}
//这里template.queryForMap要求sql的返回正好是一条,而下面这个返回的是0条,
// 因为id=9000的记录是不存在的,所以该方法执行会报错于我当前的数据库表记录情况下
@Test
public void select1(){
String sql="select * from user where id=?";
Map<String,Object> map=template.queryForMap(sql,9000);
System.out.println(map);
}
//这里queryForMap就不报错了,因为id为1的数据,正好也就是1条
@Test
public void select2(){
String sql="select * from user where id=?";
Map<String,Object> map=template.queryForMap(sql,1);
System.out.println(map);
}
//这里queryForMap仍旧会报错,因为这里返回的记录条数就比较多了
@Test
public void select3(){
String sql="select * from user where id>?";
Map<String,Object> map=template.queryForMap(sql,0);
System.out.println(map);
}
//查询多条记录使用queryForList,该方法返回的是Map<String,Object>泛型的list列表,这里涉及到了多个泛型类型(同级),关于多个泛型类型的资料可参考:
//https://wenku.baidu.com/view/289fabcdadaad1f34693daef5ef7ba0d4a736d21.html
@Test
public void select4(){
String sql="select * from user where id>?";
List<Map<String,Object>> list=template.queryForList(sql,0);
for(Map<String,Object> som:list){
System.out.println(som);
}
}
//查询多条记录并封装到指定对类实例的集合中
@Test
public void select5(){
class User{
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
private int id;
private String pwd;
private double balance;
@Override
public String toString() {
return "User{" +
"user='" + user + '\'' +
", id=" + id +
", pwd='" + pwd + '\'' +
", balance=" + balance +
'}';
}
}
String sql="select * from user where id>?";
//该方法第二个参数是每次查询到一行就传递给这个匿名方法的,第三个方法则是用于填充预处理占位的
List<User> list=template.query(sql,new RowMapper<User>(){
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user=new User();
user.setId(resultSet.getInt("id"));
user.setUser(resultSet.getString("user"));
user.setPwd(resultSet.getString("pwd"));
user.setBalance(resultSet.getDouble("balance"));
return user;
}
},0);
System.out.println(list);
}
//相比于上面的RowMapper,这里BeanPropertyRowMapper会根据你的实体类去映射数据库对应字段,就不用manual处理各个字段于实体类的构造与赋值了
@Test
public void select6(){
String sql="select * from user where id>?";
//该方法第二个参数是BeanPropertyRowMapper的实例相比于上面select5中用到query方法来说是一种不同的重载,第三个方法则是用于填充预处理占位的
//这里还需要注意的就是这里泛型比较特殊的原因吧,BeanPropertyRowMapper构造里面还要填写一个类的字节码文件,和上面的new RowMapper不一样,如果这里这个实体类(目前是User2)
//若是在本方法内则会抛出异常“xxxx...No default constructor found...xxx”类似异常,所以这里我将实体类放在全局定义了
List<User2> list=template.query(sql,new BeanPropertyRowMapper<User2>(User2.class),0);
for(User2 user2:list){
System.out.println(user2);
}
}
//统计
@Test
public void polymerization(){
String sql="select count(id) from user where id>?";
//这个queryForObject就很好了解了,就第二个参数传递对应的返回值的类型(范围的类型)(在那个类型里面就行了)
Long total=template.queryForObject(sql,Long.class,0);
System.out.println(total);
}
}
关键字词:JDBCTemplate,java,DQL