Spring — JdbcTemplate
Spring — JdbcTemplate
JdbcTemplate做持久层的操作
-
导入包
- ccbe ( 四核心 )、spring-jdbc、 c3p0、mysql-connector-java
-
配置数据源
-
编写数据库配置文件 db.properties ( driver、url、user、pwd )
mysql5:Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/mysqldb?&useUnicode=true&characterEncoding=utf-8";mysql8:Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost/mysqldb?&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong"; -
配置文件
<!-- 配置包自动扫描 --> <context:component-scan base-package="com.qut.jdbcTemplate"></context:component-scan> <!-- 导入数据库配置文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 配置数据源 --> <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driver}"></property> <property name="jdbcUrl" value="${url}"></property> <property name="user" value="${user}"></property> <property name="password" value="${pwd}"></property> </bean>
-
-
dao 层实现类
@Component // 实现类: @Autowired private JdbcTemplate jt; // 通过xml得到jt方式 // 增: String sql = "insert into user(name,pwd,money) value (?,?,?)"; Object[] args = {u.getName(),u.getPwd(),u.getMoney()}; return jt.update(sql,args) > 0; // 删:delete from user where id = ? // 改:update user set name = ?, pwd = ?, money = ? where id = ? // 查: public User queryById(int id) { String sql = "select * from user where id = ?"; Object[] args = {id}; // 查询所有的话就不用写args了 return jt.queryForObject(sql, args, new RowMapper<User>() { public User mapRow(ResultSet resultSet, int i) throws SQLException { User u = new User(); u.setId(resultSet.getInt("id")); u.setName(resultSet.getString("name")); u.setPwd(resultSet.getString("pwd")); u.setMoney(resultSet.getInt("money")); return u; } }); }
事务
-
事务是数据库操作的最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败所有都失败
-
特性:ACID
- 即:原子性 —— 要么都成功,要么都失败
- 一致性 —— 操作前与操作后的数据总量不变
- 隔离性 —— 多事务操作时,彼此间不相互影响
- 持久性 —— 事务提交后,表中的数据真正改变
-
ACID、常见的数据失效
-
脏读 —— 事务回滚导致数据失效,即一个事务看到了另一个事务未提交的更新数据
-
幻读 —— 从数据量看问题
-
一个事务在执行过程中读取到了另一个事务已提交的插入数据,即:
第一步:第一个事务刚开始时读取到一批数据, 第二步:第二个事务插入了新数据并提交, 第三步:第一个事务又读取这批数据,发现多了一条,好像发生幻觉一样。
-
-
不可重复读 —— 从数据值看问题
- 在同一事务中,多次读取同一数据却返回不同的结果;即有其他事务更改了这些数据
-
过程
-
如上,在配置文件基础上再添加:
<!-- xml在原有基础上配上tx的xmlns、xsi等 --> <!-- 配置JdbcTemplate --> <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- ref使用ds数据源 --> <property name="dataSource" ref="ds"></property> </bean> <!-- 数据源的事务管理器 --> <bean id="txman" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="ds"> </property> // 基于数据源ds </bean> <!-- 通过注解方式加入的事务标签起作用 --> <tx:annotation-driven transaction-manager="txman"></tx:annotation-driven>
-
对需要加以事务的方法以注解:@Transactional
-
写到类上就是对类中所有方法织入事务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义