欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring JDBC

程序员文章站 2023-11-16 16:50:28
Spring降低了JavaEE API的使用难度,其中就包括JDBC。 Spring JDBC的核心类是JdbcTemplate,JdbcTemplate类 extends JdbcAccessor抽象类,并implements了JdbcOperations接口。 Spring JDBC的使用步骤 ......

 

spring降低了javaee api的使用难度,其中就包括jdbc。

spring jdbc的核心类是jdbctemplate,jdbctemplate类   extends  jdbcaccessor抽象类,并implements了jdbcoperations接口。

 

 

 

spring jdbc的使用步骤

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

spring jdbc需要3个jar包的支持:

  • spring-jdbc.jar、spring-tx.jar(事务处理)   这2个是spring自带的,不用管
  • 数据库驱动的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类的常用方法

1、execute(string  sql)   

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

 

 

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

 

 

3、update()    插入、修改、删除记录

  • int  update(string sql)     //返回受影响的记录数
  • int  update(string sql, object...args)

 

 

4、batchupdate()   批量插入、修改、删除记录

  • int[]   batchupdate(string...sql)    //返回受影响的记录数
  • int[]   batchupdate(string...sql, list<object[]>  args)    

 

 

5、set系列方法

  • setmaxrows(int max)    //设置返回的最大记录数
  • setquerytimeout(int  timeout)    //设置查询超时
  • setdatasource(datasource  datasource)    //设置数据源

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

 

 

 

 

 

jdbctemplate类的查询方法

1、queryforobject()      //返回一条记录 ,select只能选择一列

  • 目标类型   queryforobject(string sql, 目标类型.class)    //返回值就是目标类型的结果
  • 目标类型  queryforobject(string sql, object[] args, 目标类型.class)    //args是sql语句中?对应的值
  • 目标类型  queryforobject(string sql, 目标类型.class, object... args)

 

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只能选中一列,选择多个列会报错。
  • 必须且只能返回一条记录,如果返回多条记录或没有记录匹配,都会报错

 

 

 

 

2、queryforrowset()     //返回查询结果集

  • sqlrowset  queryforrowset(string sql)     //sqlrowset即结果集
  • sqlrowset  queryforrowset(string sql, object...args)    //args是sql语句中的?对应得值。
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         }

 

 

 

 

3、queryformap()    //返回一条记录,select可选择多列

  • 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(字段值),所以返回的必须且只能是一条记录。

 

 

 

 

4、queryforlist()    //返回列表,可以返回多条记录

  • list<t>  queryforlist(string sql, 目标类型.class)
  • list<t>  queryforlist(string sql, object[]  args, 目标类型.class)    //args是sql语句中?的对应值
  • list<t>  queryforlist(string sql, 目标类型.class, object...args)
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只能选中一列,选中多列会报错。

 

 

  • list<map<string,object>>   queryforlist(string sql)
  • list<map<string,object>>   queryforlist(string sql, object...args)
 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是空的,这是可以的,不会报错。

 

 

 

 

5、query()   

  • list<t>   query(string sql, rowmapper<t>  rowmapper)
  • list<t>   query(string sql, object[]  args, rowmapper<t>  rowmapper)
  • list<t>   query(string sql, rowmapper<t>  rowmapper, object...args)
 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是其实现类