网站建设从建立服务器开始,企业服务公司的经营范围有哪些,官方网站是什么,wordpress上一篇这是个MVC项目#xff0c;我不一定可以完整的实现这个项目#xff0c;但力求把这个复现出来#xff0c;尽量的复现细节。
第一步#xff1a;创建数据库 表
创建表如下#xff1a; 我们使用 int 是为了方便 然后采用 demcial#xff0c;精确度较高
添加两个用户 然后…这是个MVC项目我不一定可以完整的实现这个项目但力求把这个复现出来尽量的复现细节。
第一步创建数据库 表
创建表如下 我们使用 int 是为了方便 然后采用 demcial精确度较高
添加两个用户 然后开始构建Web项目 然后完善 依赖
加上 mysql mybatis log4j servlet的依赖 dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.10/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdversion8.0.31/version/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.0/versionscopeprovided/scope/dependencydependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency然后配置 mybatis.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttps://mybatis.org/dtd/mybatis-3-config.dtd
configurationsettingssetting namelogImpl valueLOG4J//settingsenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver value/property nameurl value/property nameusername value/property namepassword value//dataSource/environment/environmentsmappers/mappers
/configuration
我们如果将数据库的配置信息直接写到里面的话会导致后期修改过于麻烦因此我们可以写到xx.properties中后期修改方便
主要是使用 ${}里面填写相应的名字就可以获取到db.properties的数据了写法如下
configurationproperties resourcedatabase.properties /propertiessettingssetting namelogImpl valueLOG4J//settingsenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment/environmentsmappers/mappers
/configuration
db的内容如下
driver com.mysql.cj.jdbc.Driver
url jdbc:mysql://localhost:3306/prostudydb
username
password
然后我们先来写个简单的查询语句测试一下看是否可以获得对应的数据是否数据库部分配置好。
那么我们就需要先粗步的完善项目构造首先需要一个pojo类或者叫做entiry类
public class account {private Integer id;private Integer actno;private Long balance; public account(){}public account(Integer id, Integer actno, Long balance) {this.id id;this.actno actno;this.balance balance;}public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public Integer getActno() {return actno;}public void setActno(Integer actno) {this.actno actno;}public Long getBalance() {return balance;}public void setBalance(Long balance) {this.balance balance;}Overridepublic String toString() {return account{ id id , actno actno , balance balance };}
}完成有参 无参 get set tostring的方法然后我们需要创建util层提供一个静态的工具类提供我们需要的sqlsession 。
然后是utils类请注意utils类中需要使用静态方法因为工具类我们只需要使用就可以了不需要实例化对象因此在类加载的时候编译一次即可
public class sqlSession {
// 一个静态的 SqlSessionFactory 我们需要它在opensession中使用因此需要声明一下private static SqlSessionFactory sqlSessionFactory;static {try {
// 类加载的时候初始化sqlsessionfactorySqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();sqlSessionFactory sqlSessionFactoryBuilder.build(Resources.getResourceAsStream(mybatis-config.xml));} catch (IOException e) {throw new RuntimeException(在utils下的sqlsessionfactorybuilder中出现的异常 e);}}
// 返回sqlsession的方法 返回需要的sqlsessionpublic static SqlSession openSession (){return sqlSessionFactory.openSession();}// 执行selectone的方法/*** int id* sqlsession sqlsession* 因为要返回pojo对象所以我们需要返回account 通过传入id 一个session我们就可以得到需要的数据* */public static account getOneAccount(SqlSession sqlSession,Integer id ){account account new account();account sqlSession.selectOne(account.selectById,id);return account;}
}然后我们看一下测试方法 public void get(){
// 调用静态方法获取对象SqlSession sqlsession sqlSession.openSession();System.out.println(sqlsession);
// 得到值account a sqlSession.getOneAccount(sqlsession,1);System.out.println(a);
}
}看一下xxxmapper的内容
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespaceaccountselect idselectById resultTypepojo.accountselect * from try where id #{id}/select/mapper
成功获取到数据证明数据库和后端交流通常
然后我们来完成简单的前端部分和tomcat的配置
首先是一个简单的inex.html 一个web.xml请注意web.xml的版本尽可能高最好是4
!DOCTYPE html
html langen
headmeta charsetUTF-8title账户尝试/title
/head
bodyh1阿达是大大大是/h1
/body
/html
web-appxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlnshttp://xmlns.jcp.org/xml/ns/javaeexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdidWebApp_ID version4.0/web-app配置好tomcat后运行一下发现ok接下来就是完善表格 获取http传来的会话
!DOCTYPE html
html langen
headmeta charsetUTF-8title账户尝试/title
/head
bodyh1阿达是大大大是/h1form action/tranfser methodpostspan账号1/span input typetext nameshuzhi1 brspan账户2/span input typetext nameshuzhi2 input typesubmit value提交 /form
/body
/html
请在这里暂停捋一下思路。
前端发送数据 通过 transfer 转交json数据给后端我们可以通过req.getParmare通过name获得数据那么我们就需要重写HttpServlet。
我们需要在controller中获取前端传来的数据然后包装在一个新的account对象中。
并且通过方法完成字符串的转变为int long的转变 WebServlet(/tranfser)
public class transeferOnetoAnother extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String shuzhi req.getParameter(shuzhi2);Long shuzhi1 Long.parseLong(req.getParameter(shuzhi1));System.out.println(shuzhi1);System.out.println(3333333333333333333333333333);
// 通过parseLong将字符串转变为longLong shuzhi2 Long.parseLong(shuzhi);account account01 new account();account01.setBalance(shuzhi1);account01.setId(1);account account02 new account();account02.setBalance(shuzhi2);account02.setId(2);
然后我们就要调用service中处理转账的方法我们就可以传递两个account对象。
请注意service中我们要先写接口在实现方法通过接口命名方法有好处如下方便设计和沟通我们可以由一个人设计出接口分给每个人实现这样可以提高效率并且控制。2.可以解耦合实现更高的耦合度需要增加功能的话我们不需要改动原来的代码只需要正在接口中增加一个新的抽象方法然后在用一个新的实现类实现它保障原代码的安全性。 public interface transfer {
// 通过返回int看是否成功,我们可以通过两个实体类然后查看它的值来判断是否转账int transferOneToAnother(account account1, account account2);
}public class transferImpl implements transfer {Overridepublic int transferOneToAnother(account account1, account account2) {
// 第一步将后端的两个数据查询出来
// 我们需要查询所有通过list来获取完善select
/** 第一步 在accountMapper中完善Select语句填写好id selectAll* 第二步 前往utils中编写查询所有的方法 输入 sqlsession 返回list集合* 第三步 回到这里 完善业务处理方法** **/SqlSession sqls sqlSession.openSession();
/* 请注意我们这里是静态方法必须调用类我们通过调用静态方法获得session 在传值这样是不是多次一举呢* 事实上mybatis默认在数据库连接池中维护了10个数据库连接我们需要保证每次获取的session相同这点我也不清楚QAQ* **/Listaccount list sqlSession.getAll(sqls);account a01 list.get(0);account a02 list.get(1);
// 比较数值 假如是从 1 转账给 2 那我们怎么知道是从 1 转账给 2 呢
/*
* 模拟的话就是只要其中一个有数字 那么加 另一个减少只实现一个加的功能不提供减的
* *//*** 请注意这里 account1 和 a01 的区别一个是我们从前端传递后来包装的 一个是从数据库中包装的* */if (account1.getBalance() a01.getBalance() ){System.out.println(钱不够);}else {
// 那么账户1需要更新然后我们需要调用更新语句 更新数据库的值
// 返回到mapper完善更新语句 sqlsession完善更新需要的方法/** 更新语句 需要 sqlSession id balance 通过返回int值看是否成功 int 1 则是失败* */if ((sqlSession.updateOne(sqls,a01.getId(), a01.getBalance()-account1.getBalance()) 1)){System.out.println(更新语句失败);}else{
// session提交 session关闭sqls.commit();sqls.close();}}return 0;}
}同时我们需要在service的实现类中调用实现好的Select 和 update方法实现查找和更改 public static int updateOne( SqlSession sqlSession, int id,Long balance ){account account new account();account.setId(id);account.setBalance(balance);int count sqlSession.update(updatesOne,account);return count;}
最主要的就是形式参数的确定和一致
我们给出更新语句
update idupdatesOneupdate try set balance #{balance} where id #{id}
/update请注意 务必封装成一个完整的account类我们才能调用session.update方法进行自动匹配传递值。
然后基本上就实现了更改。