java–Spring JDBC 框架
概述:
在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等。但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQL 语句,处理异常,处理事务,到最后关闭连接。
所以当从数据库中获取数据时,你所做的是定义连接参数,指定要执行的 SQL 语句,每次迭代完成所需的工作。
Spring JDBC 提供几种方法和数据库中相应的不同的类与接口。我将给出使用 JdbcTemplate 类框架的经典和最受欢迎的方法。这是管理所有数据库通信和异常处理的中央框架类。
JdbcTemplate 类:
JdbcTemplate 类执行 SQL 查询、更新语句和存储过程调用,执行迭代结果集和提取返回参数值。它也捕获 JDBC 异常并转换它们到 org.springframework.dao 包中定义的通用类、更多的信息、异常层次结构。
JdbcTemplate 类的实例是线程安全配置的。所以你可以配置 JdbcTemplate 的单个实例,然后将这个共享的引用安全地注入到多个 DAOs 中。
使用 JdbcTemplate 类时常见的做法是在你的 Spring 配置文件中配置数据源,然后共享数据源 bean 依赖注入到 DAO 类中,并在数据源的设值函数中创建了 JdbcTemplate。
Spring JDBC 示例(建文件夹可以按照自己习惯来):
实例:
实体类:
package cn.zbw.domain;
public class UserInfo {
private int id;
private String telephone;
private String username;
private String password;
private String level;
public UserInfo(int id, String telephone, String username, String password, String level) {
this.id = id;
this.telephone = telephone;
this.username = username;
this.password = password;
this.level = level;
}
public UserInfo() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
}
接口(定义方法):
package cn.zbw.dao;
import cn.zbw.domain.UserInfo;
import java.util.List;
public interface UserInfoDao {
public List<UserInfo> findAllUser();
public void update(String name,int id);
}
接口实现类:
package cn.zbw.dao.impl;
import cn.zbw.dao.UserInfoDao;
import cn.zbw.domain.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
//数据访问
//注解
@Repository
public class UserInfoDaoImpl implements UserInfoDao {
// 自动装配
@Autowired
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// 查询所有的用户
@Override
public List<UserInfo> findAllUser() {
return jdbcTemplate.query("select * from user", new RowMapper<UserInfo>() {
@Nullable
@Override
public UserInfo mapRow(ResultSet rs, int i) throws SQLException {
UserInfo ui = new UserInfo();
ui.setId(rs.getInt(1));
ui.setTelephone(rs.getString(2));
ui.setUsername(rs.getString(3));
ui.setPassword(rs.getString(4));
ui.setLevel(rs.getString(5));
return ui;
}
});
}
// 修改用户的内容
@Override
public void update(String name,int id) {
jdbcTemplate.update("update user set username=? where id=?",name,id);
}
}
service 类:
package cn.zbw.service;
import cn.zbw.dao.UserInfoDao;
import cn.zbw.domain.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
//服务层数据访问注解
@Service
public class UserInfoService {
@Autowired
private UserInfoDao userInfoDao;
public UserInfoDao getUserInfoDao() {
return userInfoDao;
}
public void setUserInfoDao(UserInfoDao userInfoDao) {
this.userInfoDao = userInfoDao;
}
public List<UserInfo> findAllUser(){
return userInfoDao.findAllUser();
}
public void update(String name,int id){
userInfoDao.update(name, id);
}
}
xml 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--注解所配置的代码-->
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
<!--注解所配置的代码-->
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!--此处用到了注解 所以自动扫描上下文包-->
<context:component-scan base-package="cn.zbw.*"></context:component-scan>
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/zh_demo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--aop配置-->
<aop:config>
<aop:pointcut id="service" expression="execution(* cn.zbw.dao.impl.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txadvice" pointcut-ref="service"></aop:advisor>
</aop:config>
</beans>
测试类:
package cn.zbw.test;
import cn.zbw.domain.UserInfo;
import cn.zbw.service.UserInfoService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
test01();
}
private static void test01() {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
UserInfoService uis = (UserInfoService) ac.getBean("userInfoService");
List<UserInfo> lists=uis.findAllUser();
for (UserInfo list:lists){
System.out.println(list.getUsername());
}
// uis.update("冰冰",3);
}
}
数据库的数据是:
结果是:
成功查找到这张表的所有用户