• 主页
  • 随笔
  • 归档
总文章数 19
所有文章 友链 关于我

  • 主页
  • 随笔
  • 归档

CRM项目知识点补充


阅读数: 次    2020-10-15

一:AJAX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
关于同步和异步:

设置
async:true 异步
通过观察得到结果,下面的alert弹框没有等到上面的ajax执行完毕,就执行了
全程是两根线程,一根主线程负责执行方法中普通的代码,一根线程负责执行ajax
两根线程彼此之间相互独立,互相是不受影响的

async:false 同步
通过观察得到结果,下面的alert弹框必须要等到上面的ajax执行完毕后,才能够执行
全程是一根线程,线程是按照代码从上向下的顺序依次执行
下面的代码必须要等到上面的代码执行完毕后,才能够执行


未来实际项目开发中,一般情况下,我们都是使用异步请求可以有效的提升用户体验
在特殊需求下,也会使用到同步

1.设置全局的绝对路径

1
2
3
4
5
6
7
<%
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
%>

<html>
<head>
<base href="<%=basePath%>">//

2.JSON

1
2
格式:  //一般key和value都要加双引号,数字类型和boolean类型的valu可以不用加双引号
{"string":"abc","num":10,"success":true}

3.json应用

  • 如果后端传入json,jsp中alert(data)的类型是object Object

servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyServlet02 extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入到servlet02");

//{"str1":"aaa","str2":"bbb"}
String str = "{\"str1\":\"aaa\",\"str2\":\"bbb\"}";

PrintWriter out = response.getWriter();
out.print(str);
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>mytitle</title>
<script src="js/jquery-1.8.3.min.js"></script>
<script>
$(function () {
$("#djBtn").click(function () {
//$("#msg").html(123);
$.ajax({
url : "myServlet02.do",
type : "get",
dataType : "json",
success : function (data) {

//alert(data); //object Object

//我们是以json.key的形式来取得value
alert(data.str2);
}
})
})
})
</script>
</head>
<body>
<button id="djBtn">点击</button>
</body>
</html>

4.domin:领域模型

1
2
3
pojo, bean, javabeen, 实体类
//实体类是为了方便和数据库交互,每一张表都对应一个实体类,并且数据库中表中每一个字段都与实体类
//的属性相对应,其中每个属性都是private,set个get方法为了方便存取值
  • 实体类的无参构造方法是为了反射

5.以后最常用的json格式

多个json对象的嵌套:

1
{"s1":{"id":"?","name":"?","age":?},"s2":{"id":"?","name":"?","age":?}}

取值:

1
2
3
4
5
6
7
8
9
10
11
success : function (data) {

$("#id1").html(data.s1.id);
$("#name1").html(data.s1.name);
$("#age1").html(data.s1.age);

$("#id2").html(data.s2.id);
$("#name2").html(data.s2.name);
$("#age2").html(data.s2.age);

}

6.jQuery存取值理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
相当于原生js的 document.getElementById(“”).value
针对于表单元素的value属性值的存取值操作
例如
input,select
val(值):存值
val():取值

相当于原生js的document.getElementById(“”).innerHTML
针对于标签对中的内容的存取值操作
该形式对于html元素,随着内容可以动态的赋予
html(“<font color=’red’>aaa</font>”):存值
html():取值

与上述的html()方法非常相似,也是针对于标签对中的内容的存取值操作
与上述html()方法不同的是,text()方法只针对于内容本身,不注重html元素的动态赋予
text(“aaa”):
text():

7.前后端传值方式

1
2
3
4
5
6
7
8
9
10
11
12
前端为后端传值,一般都叫做传参数
url?key1=value1&key2=value2
form name
ajax
data:{}
以上都是前端为后台提供参数的方式,但是不论你使用的是哪种形式为后台提供参数,后台一律使用String value = request.getParameter(key)的形式来接收参数

特殊形式:同一个key下有多个value
例如,执行批量删除的操作
xxx/xxx/delete.do?id=A0001&id=A0002&id=A0003
String ids[] = request.getParameterValues(“id”);

image-20200720152122285

8.数据库补充

  • OA–>办公自动化系统
  • CRM—>客户关系管理系统
  • CMS—>内容管理系统

以后一般都是一对多或者多对一的关系,设置外键时一般都在多的一方设置

9.UUID

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test1 {

public static void main(String[] args) {

UUID uuid = UUID.randomUUID();

String str = uuid.toString();

str = str.replaceAll("-", "");
System.out.println(str);
System.out.println(str.length());
}
}
  • 实际项目开发中,很少使用整型作为主键来使用

  • 实际项目开发中,使用字符串当做主键字段类型比较多

  • UUID

    • 使用UUID会为我们生成一组由数字字母以及横杆所组成的随机串,这个随机串有36位,这个随机串一定是全世界唯一的。
  • char和varchar的区别

    • char–>不可变长
    • varchar–>可变长
    • char类型可以提高sql效率,一般用于已知长度的定量

二:MyBatis

1.使用步骤

一张表操作对应一个mapper文件

1.xxxMapper.xml

创建与实体类对应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?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">
<!--

namespace:命名空间
不同的mapper映射文件使用namespace来做区分
不同的mapper映射文件所使用的namespace的命名不允许出现重复

使用命名空间.sqlId的形式来找到我们想要执行的sql语句

test1.getById1

-->
<mapper namespace="test1">

<!--
sql语句必须要写在相应的标签当中
<insert>:在标签对中写insert开头的sql语句 处理添加操作
<update>:在标签对中写update开头的sql语句 处理修改操作
<delete>:在标签对中写delete开头的sql语句 处理删除操作
<select>:在标签对中写select开头的sql语句 处理查询操作

parameterType:为sql语句传递的参数的类型
-->

<select id="getById" parameterType="java.lang.String" resultType="com.bjpowernode.domain.Student">

select * from tbl_student where id=#{id}

</select>

<!-- 如果返回的是多条记录,那么resultType返回值类型,应该写为集合的泛型 -->
<select id="getAll" resultType="com.bjpowernode.domain.Student">
select * from tbl_student
</select>

<!--
注意:
在未来实际项目开发中
所有的标签都必须要写id属性
<select>标签parameterType属性可以省略不写
resultType属性必须得写

对于<insert><update><delete>这3个标签
通常我们只写id属性,其他属性一概不写
-->
<insert id="save" parameterType="com.bjpowernode.domain.Student">

insert into tbl_student(id,name,age) values(#{id},#{name},#{age})

</insert>

<update id="update">

update tbl_student set name=#{name},age=#{age} where id=#{id}

</update>

<delete id="delete">

delete from tbl_student where id=#{id}

</delete>

</mapper>

2.mybatis-config.xml

用来注册每个mapper文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

<mappers>
<!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
<mapper resource="com/bjpowernode/mapper/StudentMapper.xml"/>
</mappers>
</configuration>

3.测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.bjpowernode.test;

import com.bjpowernode.domain.Student;
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;
import java.util.List;

/**
* Author 北京动力节点
*/
public class Test1 {

public static void main(String[] args) {

String resource = "mybatis-config.xml";
//输入流
InputStream inputStream = null;
try {
//通过加载MyBatis的主配置文件mybatis-config.xml,创建输入流对象
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
/*

SqlSessionFactoryBuilder:SqlSessionFactory的建造者
通过该建造者对象调用建造方法,为我们创建一个SqlSessionFactory对象

sqlSessionFactory对象唯一的作用就是为我们创建SqlSession对象


*/
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//我们未来所有的操作,使用的都是SqlSession对象session来完成
//例如增删改查,处理事务等等,都是统一使用session对象来完成
SqlSession session = sqlSessionFactory.openSession();

/*
需求:根据id查单条
如果取得的是单条记录,我们调用selectOne方法
参数1:根据命名空间.sqlId的形式找到我们需要使用的sql语句
参数2:我们要为sql语句中传递的参数
*/
Student s = session.selectOne("test1.getById", "A0001");
System.out.println(s);
session.close();

//查询学生信息表中所有的记录
List<Student> sList = session.selectList("test1.getAll");
for(Student s:sList){
System.out.println(s);
}
session.close();

/* MyBatis默认情况下是手动提交事务*/
//添加操作
Student s = new Student();
s.setId("A0006");
s.setName("cxk");
s.setAge(23);
session.insert("test1.save", s);
session.commit();//事务提交
session.close();

//修改操作
Student s = new Student();
s.setId("A0006");
s.setName("cxk1");
s.setAge(24);
session.update("test1.update", s);
session.commit();
session.close();

//删除操作
session.delete("test1.delete", "A0006");
session.commit();
session.close();
}
}

4.==注意事项==

  • 我们未来所有的操作,使用的都是SqlSession对象session来完成
  • 实体类pojo—>domain
  • 所有的标签都必须要写id属性,

tag:

  • 随笔

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
很惭愧<br><br>只做了一点微小的工作<br>谢谢大家