sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类。
我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中大部分返回的都是自定义的类)则需要包装,如果是Java自定义的类型,如:String则不需要。
如果sping与hibernate 相结合了,基本上是用不到,大多数都是在spring单独使用时用到,常见的情况就是与JdbcTemplate一起使用。
可以通过建立内部类实现RowMapper接口,RowMapper中有一个mapRow方法,所以实现RowMapper接口一定要实现mapRow方法,而对自定义类的包装就在mapRow方法中实现。
这里只是一个简单的例子:
public class TestDao {
private JdbcTemplate jt;
public void setJt(JdbcTemplate jt) {
this.jt = jt;
public List<TNpc> getAll(){
String sql = "select * from t_npc";
List list = jt.query(sql, new NpcRowMapper());
return list;
* 定义内部类实现RowMapper接口
public class NpcRowMapper implements RowMapper{
//实现mapRow方法
public Object mapRow(ResultSet rs, int num) throws SQLException {
//对类进行封装
TNpc npc = new TNpc();
npc.setId(rs.getLong("id"));
npc.setName(rs.getString("name"));
return npc;
2、Spring JdbcTemplate 查询方法中的RowMapper实现汇总
在内部建立内联类实现RowMapper接口
package hysteria.contact.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import hysteria.contact.dao.ItemDAO;
import hysteria.contact.domain.Item;
public class ItemDAOImpl implements ItemDAO {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public Item insert(Item item) {
String sql = "INSERT INTO items(user_id,name,phone,email) VALUES(?,?,?,?)";
Object[] params = new Object[]{item.getUserId(),item.getName(),item.getPhone(),item.getEmail()};
int[] types = new int[]{Types.INTEGER,Types.VARCHAR,Types.CHAR,Types.VARCHAR};
jdbcTemplate.update(sql,params,types);
return item;
}
public Item update(Item item) {
String sql = "UPDATE items SET name = ?, phone = ?, email = ? WHERE id = ?";
Object[] params = new Object[] {item.getName(),item.getPhone(),item.getEmail(),item.getId()};
int[] types = new int[] {Types.VARCHAR,Types.CHAR,Types.VARCHAR,Types.VARCHAR,Types.INTEGER};
jdbcTemplate.update(sql,params,types);
return item;
}
public void delete(Item item) {
String sql = "DELETE FROM items WHERE id = ?";
Object[] params = new Object[] {item.getId()};
int[] types = new int[]{Types.INTEGER};
jdbcTemplate.update(sql,params,types);
}
public Item findById(int id) {
String sql = "SELECT * FROM items WHERE id = ?";
Object[] params = new Object[] {id};
int[] types = new int[] {Types.INTEGER};
List items = jdbcTemplate.query(sql,params,types,new ItemMapper());
if(items.isEmpty()){
return null;
}
return (Item)items.get(0);
}
public List<Item> findAll() {
String sql = "SELECT * FROM items";
return jdbcTemplate.query(sql,new ItemMapper());
}
public List<Item> findAllByUser(int user_id) {
String sql = "SELECT * FROM items WHERE user_id = ?";
Object[] params = new Object[]{user_id};
int[] types = new int[]{Types.INTEGER};
List items = jdbcTemplate.query(sql,params,types,new ItemMapper());
return items;
}
protected class ItemMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Item item = new Item();
item.setId(rs.getInt("id"));
item.setUserId(rs.getInt("user_id"));
item.setName(rs.getString("name"));
item.setPhone(rs.getString("phone"));
item.setEmail(rs.getString("email"));
return item;
}
}
}
spring 中的 RowMapper sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类.我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中大部分返回的都是自定义的类)则需要包装,如果是Java自定义的类型,如:String则不需要.如果sping与hibernate 相结合了,基本上是用不到,大多数都是在spring单独
本文主要介绍下spring jdbc的
Row
Mapper
Row
Mapper
spring-jdbc-4.3.10.RELEASE-sources.jar!/org/springframework/jdbc/core/
Row
Mapper
.java
public interface
Row
Mapper
<T> {
* 该方法可以创立数据库链接,须在项目src目录下配置文件名为:“jdbcutil.properties”的文件,
* 方法内部自动加载驱动,配置文件所写内容格式如下: driver=com.mysql.jdbc.Driver,
* url=jdbc:mysql://IP地址:端口号/所链接库名, user=MySQL用户名,
* password=MySQL密码,没有不填。
* @return Connection
* @author 小海螺 QQ:179-2345-538
public static Connection getConnection()
* 此方法为数据库更新方法,内部已经自动关闭所用到的资源
* @param sql
* :SQL语句,参数用"?"表示
* @param obj
* :SQL语句中的参数
* @return 更新的行数
* @author 小海螺 QQ:179-2345-538
public static int update(String sql,Object...obj)
* 该方法为查询数据库的方法,内部已自动关闭所用到的资源,
* 调用此方法,需要自定义一个类实现
Row
Mapper
接口,该接口返回泛型<T>,该泛型为该方法返回值集合的泛型
* @param sql
* :SQL语句,参数用"?"表示
* @param rm
* :rm为
Row
Mapper
接口的实现类所产生的对象
* @param obj
* :SQL语句中的参数
* @return:查询到的集合
* @author 小海螺 QQ:179-2345-538
public static <E>List<E> query(String sql,
Row
Mapper
<E> rm,Object...obj)
FreeMarker通用模板。FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据
这里直接一个个设置返回实体类的属性
public Student getStudentByName(String name) {
String sql = "select id,name from student where name = ?";
Student student = this.jdbcTemplate.queryForObject(sql, new Object[]{name}, new
Row
Mapper
<Student
Row
Mapper
映射Bean容器的用法
Row
Mapper
映射取整张表数据的用法
1.
Row
Mapper
映射Bean容器的用法(这大概是使用最频繁的用法,甚至也是唯一真正实用的方法。)
public class StudentMarks
Mapper
implements
Row
Mapper
{
public Student
1.
Row
Mapper
接口是什么?
Row
Mapper
接口是Spring框架提供的可以将数据库查询数据进行封装的接口,
包名地址:org.springframework.jdbc.core.
Row
Mapper
通过实现接口,实现接口
map
Row
方法(),通过对数据的封装就是通过
map
Row
方法实现
public class News
Mapper
implements
Row
Mapper
<FanNews> {
@Override
//
Row
Mapper
组件也可以自己编写,当ResultRe
使用SpringMVC+jdbctemplate实现REST风格的CRUD功能
完成功能:能够对用户进行CRUD操作,界面粗糙,只做演示
运行环境:eclipse2019.03+JDK8+Tomcat9.0.41+MySQL5.5
运用到的技术:spring+springMVC+jdbctemplate+MVC框架
具体细节:
①查询所有员工列表:jdbcTemplate.query(sql, new
Row
Mapper
<Employee>() {}回调函数的使用
②添加员工:添加员工之前要先查询出所有部门,因此要先查询所有的部门列表,然后用POST请求添加员工,重定向回员工列表
③删除员工: 采取jQuery的方式<input type="hidden" name="_method" value="DELETE" />传给控制器里面的DELETE请求
④修改用户:先根据id查询员工(get请求),然后跳转到修改页面,使用form标签回显当前对象内容<form:form action="${pageContext.request.contextPath }/emp"method="post" modelAttribute="employee">然后将封装好的对象传给控制器里面的PUT请求
联系方式:q:2819744772欢迎交流学习
2、基于spring jdbc的上层封装,底层jdbc操作基于JdbcTemplate,对于使用spring jdbc的人会有一点价值,比较简洁的封装可以节省很多重复劳动,具体节省多少可以看看example;
3、实现一套简单的ORM(直接使用spring
row
mapper
,insert自己实现),可以基于对象进行crud和相对复杂(感觉比hibernate强大一点)的sql操作;
4、基于对象指定查询的字段,大部分时候可以忘掉表结构进行业务开发;
5、支持简单的数据库路由,读写分离(半自动,需要指定取writer还是reader,默认规则reader采用随机的方式,当然也可以手动指定);
6、支持简单的分表,主要是针对一定规则的分表,比如百分表、千分表,也可以自己指定分表后缀;
7、简单的单表查询(比如所有条件是and或者or结构),基本实现0sql代码编写(类似HibernateTemplate selectByExample、findByCriteria、find等方法);
8、简单的单表排序支持,支持多个排序条件组合;
9、对于复杂的sql查询,提供获取jdbctemplate实例进行操作,类似spring jdbc的常规用法;
10、提供Entity代码生成接口,Entity并非简单的pojo(尽可能不要去修改此类),引入字段常量类,方便查询的时候指定选择字段,从而更好实现查询条件的封装;
1、hibernate:过于臃肿,使用不够灵活,优化难(其实主要是因为很少用),HQL感觉就是个渣,在
mysql几乎一统天下的背景下,跨数据库级别的兼容吃力不讨好。Hibernate的对象化关联处理确实挺强大,但是使用起来坑太多,有多少人敢在项目
中大范围使用真不知道,屠龙刀不是人人都提的起啊。
2、mybatis:轻量级,基于xml的模式感觉不利于封装,代码量不小,基于xml维护也麻烦(个人观点,
现在注解模式貌似也挺不错),感觉mybatis更适合存在dba角色的年代,可以远离代码进行sql调优,复杂的查询拼装起来也更加优雅(java基本
就是if else ...),但是对于查询业务简单但是数据库集群环境的场景有点憋屈(其实对mybatis使用也不多,瞎评论^_^)。
3、spring jdbc:小巧,灵活,足够优秀,个人比较喜欢使用,但是代码量偏大,原生的接口重复劳动量大,比如insert、
mapper
之类的;
SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的
Row
Mapper
自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。
平时不太喜欢使用hibernate和mybatis,主要是使用spring jdbc,写这个东西的出发点主要是平时使用spring jdbc觉
得比较麻烦,重复性的代码偏多,一方面通过自动
mapper
降低返回结果处理工作量,另一方面参考hibernate对象化查询条件的模式,写了一个
QueryBudiler,使得更多简单的单表查询可以通过对象组织查询、更改逻辑,避免过多去写相似性的SQL语句,减少DAO接口量。
1、Entity的设计:很多人看了也许会说,这个不是POJO,不是纯粹的Java
Bean,显得很另类。但是有多人在开发过程中(特别是在写sql的时候),经常要去看看表结构设计?还有多少次因为改了表某个字段,还得遍历去查找哪些
sql使用了这个字段?多少次看到在代码中直接传入字段名作为查询参数感到别扭?如果将表结构字段都用java对象去描述,能够解决这些问题,就不必要在
乎是不是POJO了,后面看example的时候应该能体会这么做的一些好处,至少我觉得是挺方便的,将大部分查询脱离表结构设计。
2、简单的数据库路由:如果分库结构不是太复杂(比如简单的读写分离、或者多个库集成),BaseDao可以自
动进行路由(比如读写分离,根据业务模式指定读、写库),如果非默认的路由规则,也可以通过手动设置的模式,进行数据库路由。数据库路由直接由
Entity指定,所有的路由都是根据Entity识别,也就是说查询也是围绕Entity展开的,避免类似使用spring jdbc的时候,各种
template实例跳来跳去,硬编码引入,写一个业务还得看看到底该用哪个template,尤其是多个数据库共用一个template实例的时候。
3、QueryBuilder:单表查询基本上都可以实现零Sql(除非查询条件特别复杂的),更新、删除等操作也可以通过QueryBuilder进行批量处理,不局限于根据主键来处理。
4、分表操作的支持:对于分表操作和常规的使用没有区别,只是指定分表规则,mybatis好像也可以通过制定参数实现分表处理,没搞清楚hibernate对这个是怎么处理的(hibernate好像是bean和表一对一绑定的)?
标签:sborm
视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。
1、课程简介
Spring框架是一系列应用框架的核心,也可以说是整合其他应用框架的基座。同时还是SpringBoot的基础。在当下的市场开发环境中,Spring占据的地位是非常高的,基本已经成为了开发者绕不过去的框架了。它里面包含了Spring,SpringMVC,SpringData(事务),SrpingTest等等。
Spring本身里面包含了两大核心IOC和AOP。IOC负责降低我们代码间的依赖关系,使我们的项目灵活度更高,可复用性更强。AOP是让方法间的各个部分更加独立,达到统一调用执行,使后期维护更加的方便。
SpringMVC本身是对Servlet和JSP的API进行了封装,同时在此基础上进一步加强。它推出的一套注解,可以降低开发人员的学习成本,从而更轻松的做表现层开发。同时,在3.x版本之后,它开始之初Rest风格的请求URL,为开发者提供了开发基于Restful访问规则的项目提供了帮助。
SpringData是一组技术合集。里面包含了JDBC,Data JPA,Data Redis,Data Mongodb,Data Rabbit,Data ElasticSearch等等。合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。
SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合spring一起测试。
本套课程中,我们将全面剖析Spring和SpringMVC两个部分。从应用场景分析,到基本用法的入门案例,再到高级特性的分析及使用,最后是执行原理的源码分析。让学生通过学习本套课程不仅可以知其然,还可以知其所以然。最终通过一个综合案例,实现灵活运用Spring框架中的各个部分。
2、适应人群
学习spring,要有一定的Java基础,同时应用过spring基于xml的配置。(或者学习过官网的Spring课程)
学习springmvc,要有一定java web开发基础。同时对spring框架要有一定了解。
3、课程亮点
系统的学习Spring框架中各个部分,掌握Spring中一些高级特性的使用。
l Spring IoC
n 设计模式-工厂模式
n 基础应用-入门案例
n 基础应用-常用注解使用场景介绍及入门
n 高级特性-自定义BeanNameGenerator
n 高级特性-自定义TypeFilter
n 高级特性-ImportSelector和ImportBeanDefinitionRegistrar的分析
n 高级特性-自定义ImportSelector
n 高级特性-FilterType中的AspectJTypeFilter的使用
n 高级特性-自定义ImportBeanDefinitionRegistrar
n 高级特性-自定义PropertySourceFactory实现解析yaml配置文件
n 源码分析-BeanFactory类视图和常用工厂说明
n 源码分析-AnnotationConfigApplicationContext的register方法
n 源码分析-AnnotationConfigApplicationContext的scan方法
n 源码分析-AbstractApplicationContext的refresh方法
n 源码分析-AbstractBeanFactory的doGetBean方法
l Spring Aop
n 设计模式-代理模式
n 编程思想-AOP思想
n 基础应用-入门案例
n 基础应用-常用注解
n 高级应用-DeclareParents注解
n 高级应用-EnableLoadTimeWeaving
n 源码分析-@EnableAspectJAutoproxy注解加载过程分析
n 源码分析-AnnotationAwareAspectJAutoProxyCreator
n 技术详解-切入点表达式详解
l Spring JDBC
n 基础应用-JdbcTemplate的使用
n 源码分析-自定义JdbcTemplate
n 设计模式-
Row
Mapper
的策略模式
n 高级应用-NamedParameterJdbcTemplate的使用
n 源码分析-TransactionTemplate
n 源码分析-DataSourceUtils
n 源码分析-TransactionSynchronizationManager
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import tacos.Ing
①Hash
Map
的工作原理
Hash
Map
基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。Hash
Map
使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 Hash
Map
在每个链表节点中储存键值对对象。
tomcat6运行jsp报错javax.servlet.ServletException: javax.servlet.jsp.tagext.TagAttributeInfo.<init>