Spring JDBC
程序员文章站
2022-06-21 09:47:11
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是其实现类
上一篇: 吃什么菜对湿疹好呢