Spring征服数据库
一.spring的数据访问哲学
- 讲道理现在市面上的所有项目都离不开接口,针对接口是面向对象的重要特征之一,而spring的最终目标就是简化这一特征的使用方法(比如耦合).
- 只暴露接口,从而体现出该实现的目标!
2. Spring的jdbc
- Spring为多种框架提供了jdbc支持;
- Spring本身就具有多个模块,他是模块化的框架,就好像java的虚拟机一样,在什么地方,用什么方法;
二.配置数据源
1.不管使用什么模板,以及不管使用什么类型的数据库,数据源是必须的(废话),一般有三种方式;
- 通过jdbc驱动程序定义的数据源(最基本的jdbc,注册驱动->获取连接->获取操作对象->操作结果集->释放资源);
- 通过JNDL查找数据源(这个配置在服务器上面的比如TOMCAT),(留待)
- 通过连接池获取数据源(c3p0,druid..)
三.jdbcTemplate (其实并不难,我指的是里面源码,很好理解,前提是理解回调和递归原则)
- 这之中的实现步骤,小王要实现一个接口,小红做好了饭就调用这个接口去告诉小王传递饭好了的信息,然而这个故事的主人公是小王,小红只是个配角,
换句话说如果小王没有叫小红去做饭那么小红是什么我们都不知道,小红之所以存在是因为小王他需要,所以要小红属于小王,小红对象依赖于小王对象而活,
- 警察叔叔和贼的例子,因为警察想要教育贼,所以才有的贼回答问题(这个逻辑一点毛病都没有的)
- //回调接口
- public interface CB {
- public void talk(String word);
- }
- //警察叔叔类
- public class Police implements CB {
- private Thief tf ; //因为警察叔叔需要贼(要问问题),所以才有的贼(贼要回答问题),主业务需求,诞生附属子实现!!!!
- public Police(Thief tf) {//将贼对象传递给警察叔叔,
- this.tf = tf;
- }
- //回调方法,用来向当前类传递信息
- @Override
- public void talk(String word) {
- System.out.println("毛贼说:" + word);
- }
- /**
- * 警察发问
- */
- public void talkcrap() {
- System.out.println("你错了吗");
- tf.worng(this); //警察进行询问,这个贼是传入进来的,将当前类对象传递个贼,贼和警察是1对1关系(当然也可以实现1对多,使用LIist<贼对象>)
- }
- }
- public class Thief {
- public void worng(CB cb) { //回调接口传递信息
- cb.talk("警察叔叔我错了"); //这个地方传递的参数,当前行调用了接口的talk方法
- }
- }
- 附上我修改过1对多例子
- //回调接口
- public interface CallBack {
- //这里才是回调,要调用这个方法,才能够传递信息!!!!!
- public void tellAnswer(int answer);
- }
- //学生接口
- public interface Student {
- //这里放入一个对象,要放入主要对象,就是当前类依赖于的对象:主业务对象
- public void resovleQuestion(CallBack callBack);
- }
- //老师类
- public class Teacher implements CallBack {
- private List<Student> stus;//tom,lusy,rose
- public Teacher(List<Student> stus) {
- System.out.println("teacher对象创建,学生数量"+stus.size());
- this.stus = stus;
- }
- @Override
- public void tellAnswer(int answer) {
- System.out.println(Thread.currentThread().getName()+"你的答案是" + answer);
- }
- public void askQuestion() {
- Thread.currentThread().setName("老师线程");
- System.out.println("你们写了多长时间的作业?");
- long end = 0;
- //启动所有线程,回答所有问题
- for (int i = 0; i < stus.size(); i++) {
- new Thread((Runnable) stus.get(i)).start();
- }
- try {
- System.out.println(Thread.currentThread().getName()+"开始休眠15秒,等待所有人的问题回答完");
- Thread.sleep(15000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("老师线程休眠结束"+System.currentTimeMillis());
- for (int i = 0; i < stus.size(); i++) {
- stus.get(i).resovleQuestion(this);
- }
- //当前类实现了回调接口,所以讲当前类对象传入进去
- //
- // long end = System.currentTimeMillis();
- // System.out.println("回答问题的时间:"+(end-start));
- }
- }
- //将ResultSet封装成User类型
- public class RowMapperDemo implements RowMapper<User>{
- @Override
- public User mapRow(ResultSet resultSet, int i) throws SQLException {
- User user = new User();
- user.setName(resultSet.getString("name"));
- user.setPassword(resultSet.getString("password"));
- return user;
- }
- }
- execute方法:可以用于执行任何SQL语句,一般用于执行update,delete,insert
- update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
- call方法:用于执行存储过程、函数相关语句。

- //RowMapper接口将ResultSet里面的数据映射到JavaBeen中->封装数据
- //queryforList(),执行SQL,将数据返回为List<Map<String(列名),Object(行数据))>>
- List<User> list = jt.query(sql, (rs ,i)-> new User(rs.getString("name"),rs.getString("password")));
- new RowMapper<User>() {
- @Override
- public User mapRow(ResultSet resultSet, int i) throws SQLException {
- User user = new User();
- user.setPassword(resultSet.getString("password"));
- user.setName(resultSet.getString("name"));
- return user;
- }
- };
- public List<Student> getStudents() {
- return jt.query("select * from student", (rs, i) -> new Student(rs.getString("stuno"),
- rs.getString("name"), rs.getInt("age"), rs.getString("address")));
- //该lambda表达式相当于
- new RowMapper<Student>() {
- @Override
- public Student mapRow(ResultSet resultSet, int i) throws SQLException {
- return new Student(rs.getString("stuno"),rs.getString("name"), rs.getInt("age"), rs.getString("address"));
- }
- };
- }
- jt.queryForObject("select count(*) from student where stuno ='"+stuno+"'", Integer.class);
- //返回Integer类型
- return jt.update("insert into student values(?,?,?,?)", new Object[]{stu.getStuno(), stu.getName(), stu.getAge(), stu.getAddress()});
- //这两种方式是一样的效果,简略了代码
- return jt.update("insert into student values(?,?,?,?)",stu.getStuno(), stu.getName(), stu.getAge(), stu.getAddress());
- jt.execute("DELETE FROM student WHERE stuno = '" + stuno + "'");
- 不好使用通配符,这条sql半写死的,主要还是用来执行创建数据库,创建表的语句
- jt.update("DELETE FROM student WHERE stuno = ?",stuno);
- 这两条语句的作用是一样的
9.我uml图画的不是很好,是在网上边学边画的,有问题请不吝赐教QAQ
Spring征服数据库的更多相关文章
- Spring : 征服数据库(一)
严格的说.这里征服的是关系型数据库.之后笔者会以MongoDB为例,给出非关系型数据库的解决方式,敬请期待. 获取连接,操作,关闭,不知所云的异常...是的,你受够了.在使用纯JDBC时你訪问数据库时 ...
- Spring : 征服数据库 (两)
本节介绍Spring和ORM集成框架.尽管Hibernate在开源ORM 社区很受欢迎.但是,本文将MyBatis案例解说.也MyBatis和Hibernate好坏是没有意义的,主要看实际需求,有兴趣 ...
- 第五章 征服数据库(Spring对DB的使用)——开发持久层
本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中, ...
- Spring 链接数据库
一.前言 Spring 现在是我们在做 JavaWeb 开发中,用的最主流的框架.以后是不是我们暂时不知道,但现在是.废话不多我就介绍 Spring 中.链接数据库的三种方式: git源码地址 需要的 ...
- 黑马-Spring与数据库
Spring与数据库 Spring与jdbc 引入dataSource 在客户端 模板编程 类的结构图, 真正干活的是JdbcTemplate(底层实现,操作 excute方法) JdbcTempla ...
- 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理
Spring的数据库编程 Spring框架提供了JDBC模板模式------>JdbcTemplate 简化了开发,在开发中并不经常是使用 实际开发更多使用的是Hibernate和MyBatis ...
- Spring的数据库编程浅入浅出——不吹牛逼不装逼
Spring的数据库编程浅入浅出——不吹牛逼不装逼 前言 上文书我写了Spring的核心部分控制反转和依赖注入,后来又衔接了注解,在这后面本来是应该写Spring AOP的,但我觉得对于初学者来说,这 ...
- Spring(四)Spring与数据库编程
Spring最重要的功能毫无疑问就是操作数据.数据库的百年城是互联网编程的基础,Spring为开发者提供了JDBC模板模式,那就是它自身的JdbcTemplate.Spring还提供了Transact ...
- 【Spring】Spring的数据库开发 - 2、Spring JdbcTemplate的常用方法(execute、update、query)
Spring JdbcTemplate的常用方法 文章目录 Spring JdbcTemplate的常用方法 execute() update() query() 简单记录-Java EE企业级应用开 ...
随机推荐
- 3D 图片播放焦点图插件Adaptor
在线演示 本地下载
- 多线程与Java的JMM内存模型
共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见.从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存( ...
- android使用mina需要注意的问题
1.第三方jar包的使用 如果在Java Build Path中使用Add External JARs这种方式,运行时会有找不到类的错误(我的上面有,如果你没出现,恭喜你),上网查了几种方 ...
- BZOJ(begin) 1328 [Usaco2003 Open]Jumping Cows:贪心【波峰波谷模型】
题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328 题意: 给你一个长度为n的正整数序列. 可以选任意个数字,只能从左往右选. 偶数 ...
- 【Codeforces】Gym 101156G Non-Attacking Queens 打表
题意 求$n\times n$的棋盘上放$3$个皇后使得互相不攻击的方案数 拓展是$m\times n$棋盘上放$k$皇后,暴力打表找到了公式 OEIS 代码 import java.math.Big ...
- 使用top命令查看系统状态
Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息.通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高? 使用SSH ...
- 华为机试 可怕的N阶乘
题目标题: 计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值.例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围.请设计一个程序, ...
- 1123 Is It a Complete AVL Tree(30 分)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- MySQL日期处理函数_20160922
除了对文本字符串进行处理外,对日期处理是最常用的了,年.月.周.日等等,同时在日常工作报表中月报.周报.日报这样的报表也是最常见了. #二.mysql对日期的处理 SELECT #具体某一天 DATE ...
- 「LOJ#6121」「网络流 24 题」孤岛营救问题(BFS
题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...