mybatis增删改 DB数据增删改时,缓存会怎么样

MyBatis系列教程(三)--实现数据的增删改查(CRUD) - 推酷
MyBatis系列教程(三)--实现数据的增删改查(CRUD)
所需要用到的其他工具或技术:
项目管理工具 : Maven
测试运行工具 : Junit
数据库 : Derby
Maven Dependencies:
&dependencies&
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis&/artifactId&
&version&3.2.7&/version&
&/dependency&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&4.9&/version&
&scope&test&/scope&
&/dependency&
&dependency&
&groupId&org.apache.derby&/groupId&
&artifactId&derby&/artifactId&
&version&10.10.2.0&/version&
&/dependency&
&dependency&
&groupId&org.apache.derby&/groupId&
&artifactId&derbyclient&/artifactId&
&version&10.10.2.0&/version&
&/dependency&
&/dependencies&
SQL 建表及数据插入(沿用前两节中的数据库表及数据):
CREATE TABLE USER_TEST_TB(
ID INT PRIMARY KEY,
USERNAME VARCHAR(20) NOT NULL,
PASSWORD VARCHAR(20) NOT NULL,
NICKNAME VARCHAR(20) NOT NULL
INSERT INTO USER_TEST_TB VALUES(1,'1st','111','Jack');
INSERT INTO USER_TEST_TB VALUES(2,'2nd','222','Rose');
INSERT INTO USER_TEST_TB VALUES(3,'3rd','333','Will');
Mybatis配置文件 src/main/resource源目录下
test-mybatis-configuration.xml
&?xml version=&1.0& encoding=&UTF-8& ?&
&!DOCTYPE configuration
PUBLIC &-//mybatis.org//DTD Config 3.0//EN&
&http://mybatis.org/dtd/mybatis-3-config.dtd&&
&configuration&
&properties&
&property name=&driver& value=&org.apache.derby.jdbc.ClientDriver& /&
&property name=&url&
value=&jdbc:derby://localhost:1527/create=true& /&
&/properties&
&environments default=&development&&
&environment id=&development&&
&transactionManager type=&JDBC& /&
&dataSource type=&POOLED&&
&property name=&driver& value=&${driver}& /&
&property name=&url& value=&${url}& /&
&/dataSource&
&/environment&
&/environments&
&mapper resource=&com/freud/practice/UserMapper.xml& /&
&/mappers&
&/configuration&
User.java对象类(src/main/java/com/freud/practice目录下)
package com.freud.
public class User
public Integer getId()
public void setId(Integer id)
public String getUsername()
public void setUsername(String username)
this.username =
public String getPassword()
public void setPassword(String password)
this.password =
public String getNickname()
public void setNickname(String nickname)
this.nickname =
UserMapper.xml& Mapper文件(src/main/java/com.freud.practice目录下)
&?xml version=&1.0& encoding=&UTF-8& ?&
&!DOCTYPE mapper
PUBLIC &-//mybatis.org//DTD Mapper 3.0//EN&
&http://mybatis.org/dtd/mybatis-3-mapper.dtd&&
&mapper namespace=&com.freud.practice.UserMapper&&
&!-- 查询 --&
&select id=&getUser& resultType=&com.freud.practice.User&&
from USER_TEST_TB
&!-- 插入 --&
&insert id=&insertUser&&
insert into
USER_TEST_TB
values(#{id},#{username},#{password},#{nickname})
&!-- 更改 --&
&update id=&updateUser&&
update USER_TEST_TB set
USERNAME = #{username},
PASSWORD = #{password},
NICKNAME = #{nickname}
where ID = #{id}
&!-- 删除 --&
&delete id=&deleteUser&&
delete from USER_TEST_TB WHERE ID=#{id}
UserMapper.java Mapper类(src/main/java/com.freud.practice目录下)
package com.freud.
import java.util.L
public interface UserMapper
public List&User& getUser();
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(int userId);
测试类TestMyBatis.java(src/test/java/com.freud.practice目录下)
package com.freud.
import java.io.InputS
import java.text.MessageF
import java.util.L
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
import org.apache.ibatis.session.SqlSessionFactoryB
import org.junit.B
import org.junit.T
public class TestMyBatis
private InputStream inputS
private SqlSessionFactory sqlSessionF
public void setUp()
* 准备Mybatis运行环境
source = &test-mybatis-configuration.xml&;
inputStream = TestMyBatis.class.getClassLoader().getResourceAsStream(source);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
public void testGet()
// 获取Session连接
SqlSession session = sqlSessionFactory.openSession();
// 获取Mapper
UserMapper userMapper = session.getMapper(UserMapper.class);
// 显示User信息
System.out.println(&Test Get start...&);
this.printUsers(userMapper.getUser());
System.out.println(&Test Get finished...&);
catch (Exception e)
e.printStackTrace();
public void testInsert()
// 获取Session连接
SqlSession session = sqlSessionFactory.openSession();
// 获取Mapper
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(&Test insert start...&);
// 显示插入之前User信息
System.out.println(&Before insert&);
this.printUsers(userMapper.getUser());
// 执行插入
userMapper.insertUser(this.mockUser(&FREU_INS_USER&, &FREUD_INS_PASS&, &FREUD_INS_NICK&));
// 提交事务
// 显示插入之后User信息
System.out.println(&\r\nAfter insert&);
this.printUsers(userMapper.getUser());
System.out.println(&Test insert finished...&);
catch (Exception e)
e.printStackTrace();
public void testUpdate()
// 获取Session连接
SqlSession session = sqlSessionFactory.openSession();
// 获取Mapper
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(&Test update start...&);
// 显示更新之前User信息
System.out.println(&Before update&);
this.printUsers(userMapper.getUser());
// 执行更新
userMapper.updateUser(this.mockUser(&FREU_UPD_USER&, &FREUD_UPD_PASS&, &FREUD_UPD_NICK&));
// 提交事务
// 显示更新之后User信息
System.out.println(&\r\nAfter update&);
this.printUsers(userMapper.getUser());
System.out.println(&Test update finished...&);
catch (Exception e)
e.printStackTrace();
public void testDelete()
// 获取Session连接
SqlSession session = sqlSessionFactory.openSession();
// 获取Mapper
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(&Test delete start...&);
// 显示删除之前User信息
System.out.println(&Before delete&);
this.printUsers(userMapper.getUser());
// 执行删除
userMapper.deleteUser(this.mockUser(null, null, null).getId());
// 提交事务
// 显示删除之后User信息
System.out.println(&\r\nAfter delete&);
this.printUsers(userMapper.getUser());
System.out.println(&Test delete finished...&);
catch (Exception e)
e.printStackTrace();
* 组装一个User对象
public User mockUser(String username, String password, String nickname)
User user = new User();
user.setId(10);
user.setUsername(username);
user.setPassword(password);
user.setNickname(nickname);
* 打印用户信息到控制台
* @param users
private void printUsers(final List&User& users)
int count = 0;
for (User user : users)
System.out.println(MessageFormat.format(&==User[{0}]=================&, ++count));
System.out.println(&User Id: & + user.getId());
System.out.println(&User UserName: & + user.getUsername());
System.out.println(&User Password: & + user.getPassword());
System.out.println(&User nickname: & + user.getNickname());
简单的增删改查完事。接下来就是如何对DB的列名和对象属性名不同情况的匹配了,
即下一节要写的--& 实现表数据与对象的关联关系
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致声明:该框架面向企业的大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目。有愿意了解框架技术或者源码的朋友直接加Q()一起学习核心技术:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx&1.&&&&&项目核心代码结构截图
&& 项目模块依赖
特别提醒:开发人在开发的时候可以将自己的业务REST服务化或者Dubbo服务化
2.&&&&项目依赖介绍
&&&2.1&后台管理系统、Rest服务系统、Scheculer定时调度系统依赖如下图:
&&&&&& 2.2&Dubbo独立服务项目依赖如下图:
3.&&项目功能部分截图:
zookeeper、dubbo服务启动&
dubbo管控台&
&REST服务平台
4.&&&&&&平台简介&&&&&&&&Jeesz是一个分布式的框架,提供项目模块化、服务化、热插拔的思想,高度封装安全性的Java EE快速开发平台。
&&&&&&&Jeesz本身集成Dubbo服务管控、Zookeeper注册中心、Redis分布式缓存技术、FastDFS分布式文件系统、ActiveMQ异步消息中间件、Nginx负载均衡等分布式技术
&&&&&&&&使用Maven做项目管理,项目模块化,提高项目的易开发性、扩展性
&&&&&&&&以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流引擎等。
&&&&&&&&前端集成Bootstrap4 metronic框架,UI响应式、扁平化布局,适应所有PC、Pad、Anroid、ios 移动设备等。
&&&&&&&Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础 功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件、代码生成等。采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。
&&&&&&&Jeesz目前包括以下模块项目,后台系统管理系统,RestFul独立服务系统、Scheduler定时调度系统、内容管理(CMS)系统、在线办公(OA)系统、我的待办(Task服务)、我的收藏(Bookmark服务)。
&&&&&&&&后台管理系统包括企业组织架构(用户管理、机构管理、区域管理)、菜单管理、角色权限管理、字典管理等功能;
&&&&&&&&RestFul独立提供标准Rest服务API,您可以快速实现自己的业务,提供需要的服务;
&&&&&&&&Quartz定时调度系统可以动态配置您的任务规则等;
&&&&&&&&内容管理(CMS)系统,包括内容管理,栏目管理、站点管理、公共留言、文件管理、前端网站展示等功能;
&&&&&&&&在线办公(OA)系统,主要提供简单的流程实例。
&&&&&&&Jeesz提供了常用工具进行封装,包括日志工具、缓存工具、服务 器端验证、数据字典、当前组织机构数据(用户、机构、区域)以及其它常用小工具等。另外 还提供一个强大的在线 代码生成 工具,此工具提供简单的单表、一对多、树结构功能的生成,如果对外观要求不是很高,生成的功能就可以用了。使用了Jeesz基础框架,可以提高快速开发效 率。
5.&&&&内置功能(只列了一部分功能)&&&&1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。&&&&2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。&&&&3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。&&&&4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。&&&&5.角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。&&&&6.字典管理:对系统中经常使用的一些较为固定的数据进行维护,如:是否、男女、类别、级别等。&&&&7.操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。&&&&8.连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。&&&&9.工作流引擎:实现业务工单流转、在线流程设计器。
6.&&&&开发工具&&&&1.Eclipse IDE:采用Maven项目管理,模块化。&&&&2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表、一对多、树结构。生成后的代码如果不需要注意美观程度,生成后即可用。
7.&&&&技术选型(只列了一部分技术)&&&&1、后端&&&&&&&&服务框架:Dubbo、zookeeper、Rest服务&&&&&&&&缓存:Redis、ehcache&&&&&&&&消息中间件:ActiveMQ&&&&&&&&负载均衡:Nginx&&&&&&&&分布式文件:FastDFS&&&&&&&&数据库连接池:Alibaba Druid 1.0&&&&&&&&核心框架:Spring framework&&&&&&&&安全框架:Apache Shiro 1.2&&&&&&&&视图框架:Spring MVC 4.0&&&&&&&&服务端验证:Hibernate Validator 5.1&&&&&&&&布局框架:SiteMesh 2.4&&&&&&&&工作流引擎:Activiti 5.15&&&&&&&&任务调度:quartz 1.8.5&&&&&&&&持久层框架:MyBatis 3.2&&&&&&&&日志管理:SLF4J 1.7、Log4j&&&&&&&&工具类:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI&&&&2、前端&&&&&&&&JS框架:JQuery 1.9。&&&&&&&&CSS框架: Bootstrap 4 metronic&&&&&&&&客户端验证:JQuery Validation Plugin。&&&&&&&&富文本:CKEcitor&&&&&&&&文件管理:CKFinder&&&&&&&&动态页签:Jerichotab&&&&&&&&数据表格:jqGrid&&&&&&&&对话框:jQuery jBox&&&&&&&&树结构控件:jQuery zTree&&&&&&&&其他组件:Bootstrap 4 metronic&&&&3、支持&&&&&&&&服务器中间件:Tomcat 6、7、Jboss 7、WebLogic 10、WebSphere 8&&&&&&&&数据库支持:目前仅提供mysql数据库的支持,但不限于数据库,下个版本升级多数据源切换和数据库读写分离: 如:Oracle、SqlServer、H2等&&&&&&&&支持开发环境:Eclipse、MyEclipse、Ras、Idea等
声明:所有博客作为分布式框架技术教程,该框架面向企业的大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目。
有愿意了解框架技术或者源码的朋友直接加Q()一起学习
关键字:Maven, Springmvc mybatis shiro Druid Restful,Dubbo ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx,数据库读写分离mybatis DB数据增删改时,缓存会怎么样_百度知道
mybatis DB数据增删改时,缓存会怎么样
看了下它的文档; useCache=&quot,配置不起作用,对配置文件的 不起作用,但有些情况下默认情况下;false&quot,select语句总是使用缓存,我们希望它总是刷新从而得到最新数据,最后找到了彻底的办法;true& 仍然不起作用,对sql映射文件的 flushCache=&quot
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁&&完单个项目部署10台服务器,怎么保证数据缓存同步问题?单个项目部署10台服务器,每台服务器部署2个节点,怎么保证数据缓存同步问题?初步设想采用memcached,能说下memcached具体怎么部署吗?是部署在一台还是多台,如果多台怎么保证缓存数据同步?2个牛币所有回答列表(3)&LV4原则上尽量避免分布式事务,所以建议采取开源的cache技术来实现同步,比如redis等技术。如果确实需要增加local cache和remote cache机制,则建议采用开源的cache同步技术来实现,比如jgroups,目前最代码已经增加了通过jgroups通知多台tomcat实例更新本地ehcache的机制。jgroups-udp.xml&config&&& &&UDP mcast_addr=&228.10.10.10& mcast_port=&45588&&& &&& &mcast_send_buf_size=&2097152& mcast_recv_buf_size=&2097152&&& &&& &ucast_send_buf_size=&4194304& ucast_recv_buf_size=&2097152& bind_port=&3233& /&&& &&PING timeout=&2000& /&&& &&MERGE2 min_interval=&5000& max_interval=&10000& /&&& &&FD_SOCK /&&& &&VERIFY_SUSPECT timeout=&1500& /&&& &&pbcast.NAKACK retransmit_timeout=&& /&&& &&UNICAST/&&& &&FRAG /&&& &&pbcast.STABLE desired_avg_gossip=&20000& /&&& &&pbcast.GMS join_timeout=&5000& print_local_addr=&true& /&&& &&pbcast.STATE_TRANSFER /&&/config&ehcache.xml&?xml version=&1.0& encoding=&UTF-8&?&&!-- http://ehcache.org/ehcache.xml --&&ehcache xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&& &xsi:noNamespaceSchemaLocation=&ehcache.xsd& updateCheck=&false&&& &monitoring=&autodetect&&&& &&cacheManagerPeerProviderFactory&& &&& &class=&net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory&&& &&& &properties=&file=jgroups-udp.xml& /&&& &&diskStore path=&/data/ehcache/cachetmpdir& /&&& &&defaultCache maxElementsInMemory=&1000& eternal=&true&&& &&& &overflowToDisk=&false& memoryStoreEvictionPolicy=&LRU& statistics=&false& /&&& &&cache name=&entity& maxElementsInMemory=&1000& eternal=&true&&& &&& &overflowToDisk=&false& memoryStoreEvictionPolicy=&LRU& statistics=&false&&&& &&& &&cacheEventListenerFactory&& &&& &&& &class=&net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory&&& &&& &&& &properties=&replicateAsynchronously=true, replicatePuts=true,& & & & & & replicateUpdates=true, replicateUpdatesViaCopy=false,& & & & & & replicateRemovals=true& /&&& &&/cache&&/ehcache& &比如findById这个方法增加了ehcahe的注解机制& & @Override&& &@Caching(cacheable = { @Cacheable(value = &entity&, key = &#root.target.key(#p0,#p1)&, condition = &#root.target.condition(#p1)&, unless = &#result == null&) })&& &public T findOneById(final long id, Class&T& clazz) {&& &&& &Specification&T& specification = new Specification&T&() {&& &&& &&& &@Override&& &&& &&& &public Predicate toPredicate(Root&T& root, CriteriaQuery&?& query,&& &&& &&& &&& &&& &CriteriaBuilder criteriaBuilder) {&& &&& &&& &&& &Predicate _id = criteriaBuilder.equal(root.get(&id&), id);&& &&& &&& &&& &return criteriaBuilder.and(_id);&& &&& &&& &}&& &&& &};&& &&& &CriteriaBuilder builder = em.getCriteriaBuilder();&& &&& &CriteriaQuery&T& cq = builder.createQuery(clazz);&& &&& &Root&T& root = cq.from(clazz);&& &&& &Predicate predicate = specification.toPredicate(root, cq, builder);&& &&& &cq.select(root).where(predicate);&& &&& &T t =&& &&& &try {&& &&& &&& &t = em.createQuery(cq).getSingleResult();&& &&& &} catch (Exception e) {&& &&& &&& &logger.error(&###Fail to findOneById() id:& + id + & clazz:&&& &&& &&& &&& &&& &+ clazz + & Exception:& + e.getMessage());&& &&& &}&& &&& &&& &}参考资料:最佳答案member cache本身支持集群,通过集群,设置了同步方式,那么你一个节点的更新将会通知其他节点更新,至于缓存更新的控制,完全是业务和代码层面的控制,如果你使用spring,那么直接使用cache注解,直接更新membercache中的数据,其他节点也会同时更新,延时很小使用zk技术等等等等等等等等等完等等最热搜索问答话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关问答最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友}

我要回帖

更多关于 spring mybatis 缓存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信