学习目标掌握JdbcTemplate类中几个常用方法的使用了解Spring中JDBC模块的作用熟悉SpringJDBC的配置4.1Sp ringJDBCSpringJDBC模块有什么作用?Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员 对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑当中。4.1.1SpringJ dbcTemplate的解析针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的 基础。可以说,JdbcTemplate类是SpringJDBC的核心类。JdbcTemplate类的继承结构具体如下图所示:从 JdbcTemplate的继承关系图可以看出,JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些 访问数据库时使用的公共属性。DataSource:其主要功能是获取数据库连接,还可以引入对数据库连接的缓冲池和分布式事务的支持,它 可以作为访问数据库资源的标准接口。SQLExceptionTranslator:该接口负责对SQLException进行转译工作。 通过必要的设置获取SQLExceptionTranslator中的方法,可以使JdbcTemplate在需要处理SQLExcept ion时,委托SQLExceptionTranslator的实现类来完成相关的转译工作。而JdbcOperations接口定义了在 JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。4.1.2SpringJDBC的配置Sp ringJDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据源包)、object(对象包)和sup port(支持包)。4.1.3导入包本次示例需要导入一下包spring-jdbc-4.3.6.RELEASE.jarspring -tx-4.3.6.RELEASE.jarmysql-connector-java-8.0.15.jar(mysql8使用这个包, 之前版本包需要降级)junit-4.12.jarhamcrest-core-1.3.jar,和junit配合使用,否则报错4.1. 4配置项目创建对象packagecom.unknown.myjdbc;publicclassAccount{priva teIntegerid;//账户idprivateStringusername;//用户名priv ateDoublebalance;//账户余额publicIntegergetId(){returnid; }publicvoidsetId(Integerid){this.id=id;}publicStringg etUsername(){returnusername;}publicvoidsetUsername(String username){this.username=username;}publicDoublegetBalance( ){returnbalance;}publicvoidsetBalance(Doublebalance){th is.balance=balance;}publicStringtoString(){return"com.un known.myjdbc.Account[id="+id+","+"username="+username+ ",balance="+balance+"]";}}创建接口packagecom.unknown.myjdbc;i mportjava.util.List;publicinterfaceAccountDao{//添加publici ntaddAccount(Accountaccount);//更新publicintupdateAccount(Ac countaccount);//删除publicintdeleteAccount(intid);//通过id查询 publicAccountfindAccountById(intid);//查询所有账户publicListcount>findAllAccount();}创建实现packagecom.unknown.myjdbc;importja va.util.List;importorg.springframework.jdbc.core.BeanPropertyRow Mapper;importorg.springframework.jdbc.core.JdbcTemplate;importo rg.springframework.jdbc.core.RowMapper;publicclassAccountDaoImp limplementsAccountDao{//声明JdbcTemplate属性及其setter方法privateJ dbcTemplatejdbcTemplate;publicvoidsetJdbcTemplate(JdbcTemplat ejdbcTemplate){this.jdbcTemplate=jdbcTemplate;}//添加账户pub licintaddAccount(Accountaccount){//定义SQLStringsql="inse rtintoaccount(username,balance)value(?,?)";//定义数组来存放SQL语句中的参 数Object[]obj=newObject[]{account.getUsername(),account.get Balance()};//执行添加操作,返回的是受SQL语句影响的记录条数intnum=this.jdbcTempl ate.update(sql,obj);returnnum;}//更新账户publicintupdateAcco unt(Accountaccount){//定义SQLStringsql="updateaccountset username=?,balance=?whereid=?";//定义数组来存放SQL语句中的参数Object[] params=newObject[]{account.getUsername(),account.getBalance( ),account.getId()};//执行添加操作,返回的是受SQL语句影响的记录条数intnum=this. jdbcTemplate.update(sql,params);returnnum;}//删除账户publicin tdeleteAccount(intid){//定义SQLStringsql="deletefromacc ountwhereid=?";//执行添加操作,返回的是受SQL语句影响的记录条数intnum=this.j dbcTemplate.update(sql,id);returnnum;}//通过id查询账户数据信息public AccountfindAccountById(intid){//定义SQL语句Stringsql="select fromaccountwhereid=?";//创建一个新的BeanPropertyRowMapper对象R owMapperrowMapper=newBeanPropertyRowMapper( Account.class);//将id绑定到SQL语句中,并通过RowMapper返回一个Object类型的单行记录ret urnthis.jdbcTemplate.queryForObject(sql,rowMapper,id);}//查询 所有账户信息publicListfindAllAccount(){//定义SQL语句String sql="selectfromaccount";//创建一个新的BeanPropertyRowMapper对象R owMapperrowMapper=newBeanPropertyRowMapper( Account.class);//执行静态的SQL查询,并通过RowMapper返回结果returnthis.jdbcTe mplate.query(sql,rowMapper);}}创建配置"UTF-8"?>s"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:sche maLocation="http://www.springframework.org/schema/beanshttp://ww w.springframework.org/schema/beans/spring-beans.xsd">ource.DriverManagerDataSource">verClassName"value="com.mysql.jdbc.Driver"/>< propertyname="url"value="jdbc:mysql://localhost:3306/jobinfo"/> .jdbc.core.JdbcTemplate">Source"ref="dataSource"/>eanid="accountDao"class="com.unknown.myjdbc.AccountDaoImpl">--将jdbcTemplate注入到accountDao实例中-->"ref="jdbcTemplate"/>创建测试类-创建表importorg.springf ramework.context.ApplicationContext;importorg.springframework.co ntext.support.ClassPathXmlApplicationContext;importorg.springfra mework.jdbc.core.JdbcTemplate;publicclassMain{/使用execute ()方法建表/publicstaticvoidmain(String[]args){//加载配置文件Appl icationContextapplicationContext=newClassPathXmlApplicationCo ntext("applicationContext.xml");//获取JdbcTemplate实例JdbcTemplate jdTemplate=(JdbcTemplate)applicationContext.getBean("jdbcTemp late");//使用execute()方法执行SQL语句,创建用户账户管理表accountjdTemplate.execu te("createtableaccount("+"idintprimarykeyauto_increment," +"usernamevarchar(50),"+"balancedouble)");System.out.print ln("账户表account创建成功!");}}4.2SpringJdbcTemplate的常用方法从上表可以看出,Spr ing对数据库的操作都封装在了这几个包中,而想要使用SpringJDBC,就需要对其进行配置。关于上述示例dataSource配 置中的4个属性说明,如下表所示:上表中的属性值在实际配置时,需要根据数据库类型和设置进行相应配置。在JdbcTemplate核心类 中,提供了大量的更新和查询数据库的方法,我们就是使用的这些方法来操作数据库的。execute()execute(Stringsq l)方法可用于执行sql语句update()update()用于执行插入、更新和删除操作query()query()用于执行数据查 询操作单元测试类完整示例importcom.unknown.myjdbc.Account;importcom.unknown. myjdbc.AccountDao;importorg.junit.Test;importorg.springframewor k.context.ApplicationContext;importorg.springframework.context.s upport.ClassPathXmlApplicationContext;importorg.springframework. jdbc.core.JdbcTemplate;importjava.util.List;publicclassJdbcTem plateTest{@TestpublicvoidaddAccountTest(){//加载配置文件Applic ationContextapplicationContext=newClassPathXmlApplicationCont ext("applicationContext.xml");//获取AccountDao实例AccountDaoaccou ntDao=(AccountDao)applicationContext.getBean("accountDao");// 创建Account对象,并向Account对象中添加数据Accountaccount=newAccount();ac count.setUsername("tom");account.setBalance(1000.00);//执行addAc count()方法,并获取返回结果intnum=accountDao.addAccount(account);if(n um>0){System.out.println("成功插入了"+num+"条数据!");}else{Sy stem.out.println("插入操作执行失败!");}}@TestpublicvoidupdateAccoun tTest(){//加载配置文件ApplicationContextapplicationContext=newC lassPathXmlApplicationContext("applicationContext.xml");//获取Acc ountDao实例AccountDaoaccountDao=(AccountDao)applicationContext .getBean("accountDao");//创建Account对象,并向Account对象中添加数据Accounta ccount=newAccount();account.setId(1);account.setUsername("to m");account.setBalance(2000.00);//执行updateAccount()方法,并获取返回结果 intnum=accountDao.updateAccount(account);if(num>0){Syste m.out.println("成功修改了"+num+"条数据!");}else{System.out.printl n("修改操作执行失败!");}}@TestpublicvoiddeleteAccountTest(){//加载 配置文件ApplicationContextapplicationContext=newClassPathXmlAppl icationContext("applicationContext.xml");//获取AccountDao实例Accou ntDaoaccountDao=(AccountDao)applicationContext.getBean("accou ntDao");//执行deleteAccount()方法,并获取返回结果intnum=accountDao.dele teAccount(1);if(num>0){System.out.println("成功删除了"+num+" 条数据!");}else{System.out.println("删除操作执行失败!");}}@Testpubli cvoidfindAccountByIdTest(){//加载配置文件ApplicationContextappli cationContext=newClassPathXmlApplicationContext("applicationCo ntext.xml");//获取AccountDao实例AccountDaoaccountDao=(AccountDa o)applicationContext.getBean("accountDao");//执行findAccountById ()方法Accountaccount=accountDao.findAccountById(1);System.out.println(account);}@TestpublicvoidfindAllAccountTest(){//加载配置文件ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");//获取AccountDao实例AccountDaoaccountDao=(AccountDao)applicationContext.getBean("accountDao");//执行findAllAccount()方法,获取Account对象的集合Listaccount=accountDao.findAllAccount();//循环输出集合中的对象for(Accountact:account){System.out.println(act);}}}4.3本章小结本章作业请简述SpringJDBC是如何进行配置的。请简述SpringJdbcTemplate类中几个常用方法的作用。预习作业Spring事务管理的核心接口有哪些?Spring事务管理的方式? |
|