Spring JDBC

匿名 (未验证) 提交于 2019-12-02 21:52:03

Spring降低了JavaEE API的使用难度,其中就包括JDBC。

Spring JDBC的使用步骤

1、添加数据库驱动的jar包

Spring JDBC需要3个jar包的支持:

  • 数据库驱动的jar包

2、在xml中配置DataSource、JdbcTemplate

    <!--配置数据源,class打DMDS就出来了-->     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">         <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />         <property name="url" value="jdbc:mysql://127.0.0.1/my_db?serverTimezone=GMT" />         <property name="username" value="root" />         <property name="password" value="abc" />     </bean>      <!--配置JdbcTemplate-->     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">         <!--注入数据源依赖-->         <property name="dataSource" ref="dataSource" />     </bean>

3、使用JdbcTemplate

1   ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); 2         //获取配置的JdbcTemplate 3         JdbcTemplate jdbcTemplate=applicationContext.getBean("jdbcTemplate", JdbcTemplate.class); 4         //之后就可以通过jdbcTemplate操作数据库了 5         //.......

JdbcTemplate类的常用方法

可执行任何sql语句,但因为返回值是void,所以一般用于执行DDL语句(对数据库、表进行新建、修改、删除操作)。

2、查询,有多个查询方法

5、set系列方法

以上方法都有对应的get方法。

JdbcTemplate类的查询方法

1      String sql="select id from student_tb where name = '张三'"; 2         int id=jdbcTemplate.queryForObject(sql,Integer.class);  //如果查询到的id有多个,此句代码会报错。包装类、普通类会自动转换。

1     String sql="select id from student_tb where name = ? and score = ?"; 2         Object[] arg=new Object[]{"张三",90}; 3         int id=jdbcTemplate.queryForObject(sql,arg,int.class);  //参数要是Object[]的形式

1     String sql="select id from student_tb where name = ? and score = ?"; 2         int id=jdbcTemplate.queryForObject(sql,int.class,"张三",90);

说明

  • 因为是ForObject,一个对象,所以select只能选中一列,选择多个列会报错。
  • 必须且只能返回一条记录,如果返回多条记录或没有记录匹配,都会报错

1     String sql="select * from student_tb"; 2         SqlRowSet rowSet=jdbcTemplate.queryForRowSet(sql); 3         while (rowSet.next()){ 4             System.out.println(rowSet.getInt(1));   //参数可以是int型的列索引(从1开始),也可以是String类型的列名 5         }

  • queryForMap(String sql)
  • queryForMap(String sql, Object...args)
1     String sql="select id,name,age,score from student_tb where id = 1"; 2         Map<String,Object> map=jdbcTemplate.queryForMap(sql); //此处使用泛型时,key必须是String,value必须是Object 3         System.out.println("学号:"+map.get("id")); 4         System.out.println("姓名:"+map.get("name")); 5         System.out.println("年龄:"+map.get("age")); 6         System.out.println("成绩:"+map.get("score"));

说明

  • queryForMap()是查询一条记录,只能返回一条记录,若返回多条记录或没有记录匹配,都会报错。
  • Map<String,Object>是固定的,不能修改。
  • Map<String,Object>存储的是一条记录。String指的是select选中的字段名,Object指的是该字段的值。因为一个key(字段)只能对应一个value(字段值),所以返回的必须且只能是一条记录。

1     String sql="select name from student_tb"; 2         List<String> list=jdbcTemplate.queryForList(sql,String.class); 3         Iterator<String> iterator=list.iterator(); 4         while (iterator.hasNext()){ 5             System.out.println(iterator.next()); 6         }

说明:因为返回值是List<T>,所以可以返回多条记录。List元素类型必须相同,所以select只能选中一列,选中多列会报错。

 1     String sql="select id,name,age,score from student_tb";  2         List<Map<String,Object>> list=jdbcTemplate.queryForList(sql);  //select选择多个字段,数据类型不同,value只能是Object  3         Iterator<Map<String,Object>> iterator=list.iterator();  //如果此处泛型指定迭代的元素类型,则迭代元素需要强制类型转换为Map<String,Obejct>  4         Map<String,Object> map;  5         while (iterator.hasNext()){  6             map= iterator.next();  7             String out="学号:"+map.get("id")+"        姓名:"+map.get("name")+"      年龄:"+map.get("age")+"       成绩:"+map.get("score");  8             System.out.println(out);  9  10         }

说明:List的元素类型是Map<String,Obejct>,一个Map<String,Obejct>表示一条记录(可以是多列),即返回值可以是多条记录,select可以选择多列。

queryForList()的返回值是List,会把返回的记录放入List中,所以可以返回0条或多条记录。返回0条时,List是空的,这是可以的,不会报错。

 1 class Student{  2     private int id;  3     private String name;  4     private int age;  5     private int score;  6   7     public void setId(int id) {  8         this.id = id;  9     } 10  11     public void setName(String name) { 12         this.name = name; 13     } 14  15     public void setAge(int age) { 16         this.age = age; 17     } 18  19     public void setScore(int score) { 20         this.score = score; 21     } 22  23  24     public int getId() { 25         return id; 26     } 27  28     public String getName() { 29         return name; 30     } 31  32     public int getAge() { 33         return age; 34     } 35  36     public int getScore() { 37         return score; 38     } 39 } 40  41  42 public class Test { 43     public static void main(String[] args) { 44         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); 45         JdbcTemplate jdbcTemplate=applicationContext.getBean("jdbcTemplate", JdbcTemplate.class); 46  47         RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class); 48         String sql="select id,name from student_tb"; 49         List<Student> list=jdbcTemplate.query(sql,rowMapper);  50         for (Student student:list){ 51             System.out.println(student.getName()); 52         } 53  54     } 55 }

说明

  • 可返回多条记录,select可选择多列,但select选择的列名必须和目标类的属性名一致,且目标类中必须有该列(属性)的setter方法,因为返回的记录是通过目标类的setter方法初始化对象的,如果目标类中没有对应属性的setter方法,不会报错,属性会初始化为默认值。select未选中的属性会初始化为默认值。
  • RowMapper是接口,BeanPropertyRowMapper是其实现类

文章来源: Spring JDBC
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!