持久化是将程序数据在持久状态和瞬时状态间转换的机制。
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的
什么是持久层?
Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 .
传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等... , 通过框架可以减少重复代码,提高开发效率 .
MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射
所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单!技术没有高低之分,只有使用这个技术的人有高低之别
MyBatis的优点
最重要的一点,使用的人多!公司需要!
思路流程:搭建环境-->导入Mybatis--->编写代码--->测试
1、搭建实验数据库
CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user values(1,'哇哈哈','123456'),(2,'zinc','aaaaaa'),(3,"zzz","zzzzzsss");
2、导入MyBatis相关 jar 包
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3、编写MyBatis核心配置文件
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/zinc/dao/UserMapper.xml"/>
</mappers>
</configuration>
4、编写MyBatis工具类
package com.zinc.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
//sqlSessionFactory
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
InputStream inputStream = null;
try {
String resource = "mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
5、创建实体类
package com.zinc.pojo;
//实体类
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
6、编写Mapper接口类
package com.zinc.dao;
import com.zinc.pojo.User;
import java.util.List;
public interface UserDao {
List<User> selectUser();
}
7、编写Mapper.xml配置文件
<?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.zinc.dao.UserDao">
<select id="selectUser" resultType="com.zinc.pojo.User">
select * from user
</select>
</mapper>
8、编写测试类
package com.zinc.dao;
import com.zinc.pojo.User;
import com.zinc.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class test {
@Test
public void test(){
//第一步:获取sqlSession对象
SqlSession sqlSession=MybatisUtils.getSession();
//getmapper
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userlist=mapper.selectUser();
for (User user:userlist){
System.out.println(user);
}
sqlSession.close();
}
}
9、运行测试,成功的查询出来的我们的数据,ok!
问题说明:
可能出现问题说明:Maven静态资源过滤问题
在子项目的pom.xml里面加入即可
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
在自动化运维开发过程中,经常会遇到一个小需求:需要将一个字符串转为字典;这也就联想到,很多开发人员将表中的字段存储成字符串类型存储到MySQL数据表中,那么在从字段值到之后,势必要进行转化,这样更方便使用;注意:这里转换的前提是字符串格式符合JSON格式比如字符串:user_info=‘{“name”:“john”,“gender”:“male”,“age”:28}’我们想把它转为下面的字典:user_dict={“name”:“john”,“gender”:“male”,“age”:28}有以下几种方法:1、通过json来转换>>>importjson >>>user_info='{"name":"john","gender":"male","age":28}' >>>user_dict=json.loads(user_info) >>>user_dict {u'gender'
在此有关Selenium中警报处理的WebDriverIO教程中,我将向您展示如何在WebDriverIO中处理警报和弹出窗口以及叠加模式。我还将介绍自动化期间将要遇到的各种类型的警报,以及使用WebDriverIO在Selenium中处理警报时需要遵循的关键点。WebDriverIO中的警报类型警报和弹出窗口在任何网站开发中都很常见,并且在执行Selenium测试自动化时,您也必须处理它们。这些警报或JavaScript警报会弹出,使您的注意力从当前的浏览器上移开,并迫使您阅读它们。如果您不知道如何处理警报,则将无法执行任何进一步的浏览器操作,这对于手动和自动都适用。重要的是要注意,您无法使用devtools或XPath来识别警报。另外,由于不能将它们作为窗口来处理,这就是为什么要处理它们有些棘手的原因,但是请不要担心,您可以在本WebDriverIo教程的后面部分中找到更多有关此的信息。WebDriverIO中需要处理三种警报。1、警报弹出 2、确认提示 3、提示弹出警报弹出窗口弹出警报或alert()方法将显示一个仅带有消息和“确定”按钮的警报框。该警报用于通知用户一些信息。信息
借鉴柳神做法,不用生成树7-28搜索树判断对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。输入格式:输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。输出格式:输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。输入样例1:7 865710811复制输出样例1:YES 576811108复制输入样例2:7 868510911复制输出样例2:NO复制边判断边把根存进去。后序遍历方法存入数组。使用isMirror进行两次判断。用根root和边界值尾下标tail进行判断是否满足搜索树条件。#include&l
结合这两个网址https://www.fenfa51.com/http://blog.sina.com.cn/s/blog_459ced7a0101ou76.html一:安装vsftpd查看是否已经安装vsftpdrpm-qa|grepvsftpd如果没有,就安装,并设置开机启动yum-yinstallvsftpdchkconfigvsftpdon二:基于虚拟用户的配置所谓虚拟用户就是没有使用真实的帐户,只是通过映射到真实帐户和设置权限的目的。虚拟用户不能登录CentOS系统。修改配置文件打开/etc/vsftpd/vsftpd.conf,做如下配置anonymous_enable=NO//设定不允许匿名访问local_enable=YES//设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问chroot_list_enable=YES//使用户不能离开主目录ascii_upload_enable=YESascii_download_enable=YES//设定支持ASCII模式的上传和下载功能pam_service_name=vsftpd/
题目要求Givenanintegerarraynums,returnthenumberofrangesumsthatliein[lower,upper]inclusive. RangesumS(i,j)isdefinedasthesumoftheelementsinnumsbetweenindicesiandj(i≤j),inclusive. Note: AnaivealgorithmofO(n2)istrivial.YouMUSTdobetterthanthat. Example: Input:nums=[-2,5,-1],lower=-2,upper=2, Output:3 Explanation:Thethreerangesare:[0,0],[2,2],[0,2]andtheirrespectivesumsare:-2,-1,2.复制这道题目是指,现有一个整数数组,并输入上界值upper和下界值lower,问数组中一共有多少组连续的子数组,其子数组中数字的和在上界和下界之内。思路一:暴力循环我们可以首先遍历一遍数组,计算子数组下标[0,i)的所有元素的和。根据该结果可以计
今天在weblogic上部署一个使用logback的应用时,报错如下:java.lang.IllegalArgumentException:Invalid'logbackConfigLocation'parameter:/opt/app/Oracle/Middleware/user_projects/domains/base_domain/servers/Server7005/tmp/_WL_user/acc_service_ca/bk1axn/war/WEB-INF/lib/_wl_cls_gen.jar!/logback.xml网上搜索了一翻,大致原因是weblogic已经自带了slf4j的模块,与应用中的logback冲突,按照官网https://community.oracle.com/thread/3525130?start=0&tstart=0 的做法,在WEB-INF下放一个名为weblogic.xml的文件,参考以下内容:1<?xmlversion="1.0"encoding="UTF-8"?&g
大家好,又见面了,我是你们的朋友全栈君。分布式锁为了解决分布式场景下全局加锁的问题。在单体项目中可以使用synchronize完成对于不同线程之间的资源争抢问题。但是在分布式场景下,synchronize只能对其中一个项目进行资源控制,进程之间的资源增强仍然无法解距。换言之,可以将分布式锁理解为对于整个分不是系统的synchronize。通常使用独立与线程之外的工具控制资源,如redis及框架redisson。1.传统单体架构业务流程synchronized(this){ /**业务逻辑扣减库存*/ }复制以上代码对于单体架构可以控制库存问题2.使用redis的SetNX命令//业务开始前 //使用setnx在redis中设置一个key-value if(如果设置成功){ /**业务逻辑扣减库存*/ } //删除redis中的key复制上诉代码为简单的代码逻辑,在实际中可以使用try-finally的方式或自动过期时间保证锁一定会被删除。也可使用redisson框架代替方法2版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权
在Demo中分别使用这四种方法实现面板上数据的存储和读取创建一个Data脚本用来序列化和反序列化,需要向这个类中添加需要保存的数据,最后也是需要从这个类中读取保存的数据需要存储和读取数据的脚本Data1[System.Serializable]publicclassData{ //关卡/生命值/关卡得分 publicintlevels; publicinthealth; publicintscores;}向Data中存储和读取数据的方法2usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine; ///<summary>///数据管理///</summary>publicclassDataManager:MonoBehaviour{ //创建Data对象,并添加需要保存的数据 privateDataGetGameData() { Datadata=newData(); data.levels=CanvasM
面向对象编程opp java是一个支持并发基于类和面向对象的计算机编程语言。 优点 1代码开发模块化,更易于维护和修改。 2代码复用。 3增强代码的可靠性和灵活性。 4增强代码的可靠性。 面向对象编程有很多重要的特性:封装,继承,多态和抽象。 1.封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变他内部的数据。在java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面向对象赋予不同的访问权限 封装的优点 通过隐藏对象的属性来保护对象内部的状态 提高代码的可用性和可维护性 因为对象的行为可以被单独的改变或者是扩展 禁止对象之间的不良交互提高模块化 2多态是编程语言给不同的底层数据类型做相同的借口展示的一种能力,一个多态类型上的操作可以应用到其他类型的值上面 3抽象是吧想法从具体的实例中分离出来的步骤,因此要更具他们的功能而不是实现细节来穿件类。java支持创建只暴露接口而不包含方法实现的抽象的类,这种抽象技术的主要目的是把类的行为和实现细节分离开
Lotus是Filecoin分布式存储网络的客户端(的golang实现)。 本文介绍Lotus的命令,在终端中执行命令用例格式如下: lotus[全局选项]命令[命令选项][参数…] 其中,[]内代表可选项。 全局选项有两个: [全局选项]说明 --help,-h 显示帮助(默认:false) --version,-v 打印版本(默认:false) 下面介绍命令和对应的命令选项: lotusdaemon命令 作用是启动Lotus守护进程,在终端中执行命令用例格式如下: lotusdaemon[命令选项][参数…] [命令选项][参数…]说明 --apivalue (默认值:“1234”) --genesisvalue 用于运行第一个节点的genesis文件 --bootstrap (默认值:true) --import-chainvalue 在第一次运行时,从给定文件加载链 --halt-after-import 从文件中导入链后暂停进程(默认:false) --pprofvalue 指定写入cpu性能测试文件的
一。restful restful 没有语言限制, 一切皆资源: 通过请求方式知道要做什么操作比如(HTTPGET、POST、PUT(全局更新)/PATCH(局部更新)、DELETE,还可能包括HEADER和OPTIONS。) restful(是一种协议,)一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 RESTful的实现:RESTfulWeb服务与RPC样式的Web服务 了解了什么是REST,我们再看看RESTful的实现。使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI表示单个端
https://blog.csdn.net/luolianxi/article/details/105848036 *********************************************************************** 1.MacMac下编译Linux,Windows平台的64位可执行程序:CGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuildtest.goCGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildtest.go2.LinuxLinux下编译Mac,Windows平台的64位可执行程序:CGO_ENABLED=0GOOS=darwinGOARCH=amd64gobuildtest.goCGO_ENABLED=0GOOS=windowsGOARCH=amd64gobuildtest.go3.WindowsWindows下编译Mac,Linux平台的64位可执行程序:SETCGO_ENABLED=0SETGOOS=darwin3SETGOARCH=amd64gobuildma
一、前言 通过上一篇的学习我们知道了消息分为三个部分,即消息头,属性及消息体,并对消息头的十个属性进行了详细的介绍,本文再对消息属性及消息体进行详细的介绍。 二、属性介绍 消息属性的主要作用是可以对头信息进行一个额外的补充,毕竟消息头信息一是有限,二是很多不能由应用程序设定。通常,消息属性可以用在消息选择器的表达式里,结合起来实现对消息的过滤。 消息属性的值只能是基本的类型,或者这些基本类型对应的包装类型。也就是说,不能将一个自定义的对象作为属性值。通常情况下,如果能够放在body里的内容,就不必放在消息属性里。 消息属性按类型可以分为标准属性(JMSX作为前缀),消息组件自定义的属性(JMS_作为前缀),以及应用自定义的属性。自定义的属性不要以前面两种为前缀。 标准的JMSX属性如下表: 其中,JMSXGroupID和JMSGroupSeq是客户端可以设置的。消息的属性一旦设置,且消息发送后,就会变成只读的,将不能再被修改。 跟头信息的设置不同的是,对于这些标准属性,JMS
二叉链表的类型定义——教材101页 typedefstructbtnode { DataTypedata; structbtnode*lchild,*rchild;//指向左右孩子的指针 }*BinTree; 三叉链表的类型定义——教材102页 typedefstructttnode { DataTypedata; structttnode*lchild,*parent,*rchild;//在二叉链表的基础上多了一个指向双亲的指针 }*TBinTree; TBinTreeroot; 二叉链表的三种遍历的递归算法 1先序遍历-根,左,右 voidpreorder(BinTreebt) { if(bt!=NULL) { visit(bt);//根 preorder(bt->lchild);//左 preorder(bt->rchild);//右 } } 2中序遍历-左,根,右 voidpreorder(BinTreebt) { if(bt!=NULL) { inorder(bt->lchild);
android 引用:http://blog.csdn.net/caiwenfeng_for_23/article/details/41184353 packagecom.tan.abnormalrestart; importjava.lang.Thread.UncaughtExceptionHandler; importandroid.app.Application; importandroid.content.Intent; publicclassAppContextextendsApplication { protectedstaticAppContextinstance; publicvoidonCreate(){ super.onCreate(); instance=this; Thread.setDefaultUncaughtExceptionHandler(restartHandler);//程序崩溃时触发线程以下用来捕获程序崩溃异常 } //创建服务用于捕获崩溃异常 privateUncaughtExceptionHandlerrestartHandler=newUnc
ec2默认禁用root用户登录,我们创建ec2实例后如何知道使用什么用户登录,有两种方法?复制 方法一:根据我们选择的镜像来判断用什么用户登录:镜像:centos 用户centos镜像:aws 用户:ec2-user镜像:ubuntu 用户:ubuntu复制 方法二:不知道是什么镜像,那我们就默认使用root用户,在ssh连接的时候会提示:请使用xx用户登录,禁用root用户登录复制 案例: 镜像:centos 当我们使用centos用户登录时怎么修改使用root用户登录复制 第一步: 设置root密码(为什么要设置root密码,我们初始化实例的时候使用的是密钥对,只有设置root密码后才可以切换用户,默认不知道root的密码是什么)复制 [ec2-user@ip-172-31-33-45~]$sudopasswdroot Changingpasswordforuserroot. Newpassword: Retypenewpassword: passwd:allauthenticationtoken
装过三台debian64bit,CAC,2欧,KVM虚拟机 做法都一样---下面说下正确安装方式 0.有装锐速记得先删除,免得换核心后,锐速在扯后腿。 1.换4.9版kernel有正式版別装啥rc版,4.9是LTS(LongTermSupport),稳定性杠杠的。 debian864bit可装ubuntu核心,自己编译会哭,cac不理想。。。 wgethttp://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb 2.安装 dpkg-ilinux-image-4.9.0*.deb 3.删旧核心(不刪也行,用grub调整),我是直接刪 dpkg-l|greplinux-image 这边注意一下,应该会至少有3个,除了4.9刚装的以外,大概会有以下两组,全看你原本用啥核心 root@localhost:~#dpkg-l|greplinux-image
目标和原则 提高代码质量,及早发现潜在缺陷,降低修改/弥补缺陷的成本 促进团队内部知识共享,提高团队整体水平 评审过程对于评审人员来说,也是一种思路重构的过程,帮助更多的人理解系统 是一个传递知识的手段,可以让其它并不熟悉代码的人知道作者的意图和想法,从而可以在以后轻松维护代码 可以被用来确认自己的设计和实现是一个清楚和简单的 鼓励相互学习对方的长处和优点 高效迅速完成CodeReview CodeReview的步骤 代码编写者和代码审核者坐在一起,由代码编写者按照UC依次讲解自己负责的代码和相关逻辑,从Web层->DAO层; 代码审核者在此过程中可以随时提出自己的疑问,同时积极发现隐藏的bug;对这些bug记录在案。 代码讲解完毕后,代码审核者给自己安排几个小时再对代码审核一遍。代码需要一行一行静下心看。同时代码又要全面的看,以确保代码整体上设计优良。 代码审核者根据审核的结果编写“代码审核报告”,“审核报告”中记录发现的问题及修改建议,然后把“审核报告”发送给相关人员。 代码编写者根据“代码审核报告”给出的修改意见,修改好代码,有不清楚的地方可积极向代码审
2019年填坑备忘录(二) 1.css隐藏滚动条 场景:做tab滑动效果时,可采用css的溢出滚动实现,但怎么隐藏掉那个自带的滚动条呢? 解决办法:.inner-container::-webkit-scrollbar{display:none;} 关键代码:::-webkit-scrollbar{display:none;} 2.移动端点击链接触发颜色块 场景:但移动端有点击事件,点击的瞬间会有一个色块,长按也会出现。 解决办法:在html样式下加入-webkit-tap-highlight-color:rgba(0,0,0,0); 关键代码:-webkit-tap-highlight-color:rgba(0,0,0,0); 3.js倒计时切换窗口时间偏差 场景:现在浏览器,除了ie8及以下的浏览器,当你切换标签页面时,浏览器会自动清除本页面的js缓存 解决办法:```document.addEventListener("visibilitychange",function(){ if(document.hidden){ //这里写切换到后台的时候要保存的东西 }else{ /
开通语雀(云端知识库),关注我的云笔记:《架构笔记》,文章内容更新,更全。 1. Java 核心技术 1.1. 基础知识 1.1.1. 进制转换 1.1.2. 异常处理 1.1.3. List分批代码 1.1.4. 字符串分割 1.1.5. 编码风格 1.2. 并发编程 1.2.1. 参考文章 1.2.2. 并发编程基础 1.2.3. 线程的安全性问题 1.2.4. 处理器内存模型 1.2.5. Java 内存模型(JMM) 1.2.6. volatile关键字 1.2.7. synchronized关键字 1.2.8. waitnotify 1.2.9. Lock 1.2.10. 同步器使用 1.2.11. 同步器原理分析