万维易源使用帮助手册
[TOC]
我们在使用各种语言的驱动连接MySQL时,是这个样子的:

通常稍大的系统,都会使用不止一种数据库,您的项目里可能会放置各种数据库的驱动包。
而如果使用易源平台操作MySQL,则会是这个样子的:

<br/><br/><br/><br/>
# 1. 用易源平台操作MySql
易源的MySQL连接器将MySQL数据库转化为通用数据源,并可以使用http接口进行全部数据库操作,包括但不限于增、删、查、改方法。
<br/><br/><br/><br/>
## 1.1 创建表
我们来创建一张简单的表,结构如下代码:
```java
{
"age": "int",
"name": "varchar(255)",
"address": "varchar(255)"
}
```
进入[【MySQL通用模板接口】](https://www.showapi.com/apiGateway/view?apiCode=27 "【MySQL通用模板接口】"),按以下图示进行操作:

至此建表完成。
<br/><br/><br/><br/>
## 1.2 查看所有数据表
我们来验证下刚才建的表是否成功,如下操作:

也可以打开MySQL客户端,查看表结构:

<br/><br/><br/><br/>
## 1.3 插入记录
表已经有了,现在来插入一条记录,如下操作:

<br/><br/><br/><br/>
## 1.4 插入记录(高级用法)
在上面的章节中,您需要构建一个这样的对象,然后把它tostring()过来:
```json
{
"name": "李四",
"age": 28
}
```
感觉还是麻烦。假设我要插入一条新记录,这条记录有10个字段,其中8个字段是默认值,不需要外面传入,只有2个变量是客户端传入,我们也可以在上面的章节基础上,做一些高级用法。
<br/><br/><br/><br/>
## 1.4.1 定义输入参数
以上面的例子,新插入的记录中有 name和age两个字段,我们也可以这样定义:

后面我们需要把表单post过来的name,age字段合成MySQL连接器认识的格式(一个JSON对象,就是在1.3小节中的insert_data字段),那如何合成呢,我们往下走。
好,我们接着往下走。
<br/><br/><br/><br/>
## 1.4.2 定义合成字段

<br/><br/><br/><br/>
## 1.4.3 查看效果

<br/><br/><br/><br/>
## 1.5 查询列表
现在来验证一下刚才插入的数据是什么样子的。

<br/><br/><br/><br/>
## 1.6 查询单条记录
很多时候只想查询单条记录,比如通过id获取,我们看下怎么操作:

<br/><br/><br/><br/>
## 1.7 查询单条记录(高级用法)
采用【合成字段配置】的方法,可以实现很多用法。
以上小节为例:

您可能会想,我能不能只输入一个id参数就能查询呢?像table、fields、where、where_param、order_by这些我一个也不想见到!
可以的,我们来看怎么做。
首先,按照您的想法,只要客户端输入id参数,那我们这样定义:

客户端看不到table、fields、where、where_param、order_by这些参数,并不代表MySQL连接器胃口不好,不吃它们了。我们还是得把这些参数喂给连接器,怎么传呢?看下图

其中合成传入了table和where字段,这是因为MySql的select_one连接器对table字段是必选的,其他可选,如下图:

我们在合成字段时,需要合成哪些字段,可以参照MySQL连接器通用模板里需要的参数。
<br/><br/><br/><br/>
## 1.8 修改记录
修改操作当然也是必不可少,操作也很简单。

好了,刚才更新成功,我们来看看更新结果,那就再查一次:

<br/><br/><br/><br/>
## 1.9 删除记录
删除记录的操作大同小异。

<br/><br/><br/><br/>
## 1.10 分页查询
待编写。。
<br/><br/><br/><br/>
## 1.11 强大的功能-自定义sql语句
假如我们一个很长的sql语句,涉及子查询、联合查询等,中间只要传入几个变量,能不能实现呢?
答案是可以的,我们可以使用几乎万能的MySql连接器的【自定义sql语句】功能。操作顺如下:
### 第1步:配置连接

<br/><br/><br/><br/>
### 第2步:配置req请求

<br/><br/><br/><br/>
### 第3步:进行测试

<br/><br/>
客户端完全看不到sql语句的样子,它只需要知道输入参数id即可。
# 2. 用java操作MySQL(和易源操作进行对比)
先制作一个工具类:
```java
public class DbUtil {
public static final String URL = "jdbc:mysql://localhost:3306/imooc";
public static final String USER = "liulx";
public static final String PASSWORD = "123456";
private static Connection conn = null;
static{
try {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
//后续需要自己关闭链接
return conn;
}
public static void close(Statement stmt, Connection conn) throws Exception {
if (stmt != null) {
stmt.close();
if (conn != null) {
conn.close();
}
}
}
```
## 2.1 插入记录
```java
//增加
public void addStudent(Student g) throws SQLException {
//获取连接
Connection conn = DbUtil.getConnection();
//sql
String sql = "INSERT INTO student(user_name, sex, age, birthday )"
+"values("+"?,?,?,? )";
//预编译
PreparedStatement ptmt = conn.prepareStatement(sql); //预编译SQL,减少sql执行
//传参
ptmt.setString(1, g.getUser_name());
ptmt.setInt(2, g.getSex());
ptmt.setInt(3, g.getAge());
ptmt.setString(4, g.getBirthday());
//执行
ptmt.execute();
DbUtil.close(ptmt,conn);
}
```
## 2.2 查询列表
```java
public List<Student> query() throws SQLException {
Connection conn = DbUtil.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM student");
List<Student> list = new ArrayList<Student>();
Student stu = null;
while(rs.next()){
list = new Student();
list.setUser_name(rs.getString("user_name"));
list.setAge(rs.getInt("age"));
list.add(list);
}
DbUtil.close(stmt,conn);
return list;
}
```
## 2.3 查询单条记录
```java
public Student get(){
Student stu = null;
//获取连接
Connection conn = DbUtil.getConnection();
//sql, 每行加空格
String sql = "select * from student where id=?";
//预编译SQL,减少sql执行
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参
ptmt.setInt(1, id);
//执行
ResultSet rs = ptmt.executeQuery();
while(rs.next()){
stu = new Student();
stu.setId(rs.getInt("id"));
stu.setUser_name(rs.getString("user_name"));
stu.setAge(rs.getInt("age"));
stu.setSex(rs.getInt("sex"));
stu.setBirthday(rs.getString("birthday"));
stu.setEmail(rs.getString("email"));
}
DbUtil.close(ptmt,conn);
return stu;
}
```
## 2.4 修改记录
```java
public void updateStudent(){
//获取连接
Connection conn = DbUtil.getConnection();
//sql
String sql = "UPDATE Stdudent" +
" set user_name=?, sex=?, age=?, birthday=?, email=? "+
" where id=?";
//预编译
PreparedStatement ptmt = conn.prepareStatement(sql); //预编译SQL,减少sql执行
//传参
ptmt.setString(1, g.getUser_name());
ptmt.setInt(2, g.getSex());
ptmt.setInt(3, g.getAge());
ptmt.setDate(4, g.getBirthday());
ptmt.setInt(5, g.getId());
//执行
ptmt.execute();
DbUtil.close(ptmt,conn);
}
```
## 2.5 删除记录
```java
public void delStudent(){
//获取连接
Connection conn = DbUtil.getConnection();
//sql, 每行加空格
String sql = "delete from student where id=?";
//预编译SQL,减少sql执行
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参
ptmt.setInt(1, id);
//执行
ptmt.execute();
DbUtil.close(ptmt,conn);
}
```
## 2.6 分页查询
分页查询比较复杂,以下使用hibernate代码进行演示。如果使用纯sql,操作过程会更繁杂。
```java
public PageBean searchByHQL(final String hql, final Object para[],
final int page,final int pageSize) {
String str = hql;
int index = str.indexOf("order by");
if (index != -1)
str = str.substring(0, index); //从原hql语句中截除掉order by
index = str.indexOf("from");
if (index != -1)
str = str.substring(index);
//以下使用hibernate,根据传入的参数组para,生成sql语句,获取总条目数
List allNumList = hibernateTemplate
.find("select count(*) " + str, para);
//总条目数
int allNum = Integer.parseInt(allNumList.get(0).toString());
final int maxResult = pageSize;
//查询结果列表
List allList = (List) hibernateTemplate
.execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query q = session.createQuery(hql);
q.setFirstResult((page - 1) * maxResult);
q.setMaxResults(maxResult);
if (para != null) {
for (int i = 0; i < para.length; i++) {
q.setParameter(i, para[i]);
}
}
return q.list();
}
});
int allPage = 0;
int temp = allNum;
if (allNum % maxResult == 0)
allPage = allNum / maxResult;
else
allPage = allNum / maxResult + 1;
//将查询结果封装到pagebean中
PageBean pageBean = new PageBean(temp, allPage, page, allList,
maxResult);
return pageBean;
}
```
还有各种其他语言,不再举例,其流程和java相差不大。
# 3. 总结
用易源操作数据库非常简单,而且是多种数据库的http操作类似,这样您不需要再了解各种数据库驱动程序的用法,就算是开发新手也能以最快的速度操作数据库,以完成您的核心业务。
总体来说,使用易源连接器操作MySQL有以下优点:
1. 把数据库操作HTTP化,使用门槛几乎降低为0。
2. 连接器自带连接池,可以保证极高性能(Http的损耗相对于业务处理的时间来说可以忽略)。
3. 采用sql语句中挖空变量,从客户端传值的方式,极大地便利了业务端API的建立。
4. 权限容易控制,有日志,有监控,有报警。