上周网站写了两天,发现走的路好像不太对。想换一种新的思路,但需要从数据库中获取新的数据。
毕竟自己以后要接手前后端的,不能总是麻烦余平大佬,于是决定从他那里接过来后端的活,开始学习。
有关Ajax套用问题
本来是用Ajax里套一个Ajax的形式去实现,发现了问题。就是Ajax的实现方式默认是异步的。这样的意思是,可能第二个Ajax的函数会与第一个Ajax的函数同时执行,这样代码就会乱。
为了解决这个问题,可以在第二个Ajax里设置如下属性:
async: false,
这个代码将Ajax的同步方式改为了同步。如果这个Ajax的动作不执行完,将不会执行接下来的动作。
列表等宽属性
帮沈老师改网页的时候,为了布局好看一些,用到了一个列表等宽属性:
table-layout:fixed;
Mybatis与数据库的互动
虽然解决了Ajax乱执行的问题,但是函数写完后,会发现莫名其妙的多出</ul><li>
这个代码,无论是删一个这样的代码,还是加上去,最后都没有办法实现,也没有找到原因。于是准备换一种思路,不再生成package的时候生成class,而在生成完package之后,将class放进去。这样想,我需要多加几个表。去问了余平大佬,他说没有新添表,而是在后端进行了数据的操作,于是涉及到了Mybatis与数据库的交互问题。根据Mybatis官方文档以及某学习视频,尝试写了一个小Demo,之后整理了一下思路,具体如下:
配置环境
在Mybatis下与数据库进行交互,需要两个jar包:
- mybatis
- mysql-connector-java
这两个包可以在maven.oschina.net进行下载。
同时,为了方便,开启了eclipse的代码补全功能,开启方法:
点击菜单:Windows——>Preferences——>Java–>Editor–>Content Asist。将Auto activation triggers for Java后面的文本框改为“.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”。
概览
项目文件目录如图:
在图里,scr与conf可以看到图标是一个文件夹里夹着包,这代表这两个文件夹是源文件夹。而lib是非源文件夹。在项目中使用文件夹里的文件时,要将其转变为源文件夹。lib是库,Referenced Libraries里是使用的库。jUnit 4是测试库。
这个简单的小Demo分为三个部分:
Mybatis配置文件
对Mybatis的应用要又一个配置文件,在本Demo中,指的是Mybatis-config.xml。里面写了有关于本次Demo的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=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="api.xml"/>
</mappers>
</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=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
这个地方也是照抄,需要修改的地方只有地址账号和密码。代表的读取的哪个数据库。
<mappers>
<mapper resource="api.xml"/>
</mappers>
mapper代表你所用到的映射文件。在这个小Demo里,只读取了一个地方,使用了一个mapper进行练手。
读取部分
读取部分里有三个文件,分别是api.xml、api.java以及apiMapper.java。
首先说api.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.lvjing.mybatis.dao.apiMapper">
<select id="getApiFromSql" resultType="com.lvjing.mybatis.bean.api">
select * from package_list
library_id=26)
</select>
</mapper>
api.xml也是一个配置文件。它配置了你要取的内容的属性,即命名空间、唯一标识以及返回类型。在这个Demo里,api.xml只取了一个一次数据,命名空间设定为com.lvjing.mybatis.dao.apiMapper(为了编程的容易,以后将明明空间都明明为所取数据对应Mapper的Qualified Name),唯一标识为getApiFromSql(Mapper里函数的名字),返回类型是所取数据的java bean文件。然后写上Sql语句对数据进行处理。
再来说api.java,这个文件是一个bean文件,它指明了所取数据库里的内容,本次Demo代码如下:
package com.lvjing.mybatis.bean;
public class api {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFirst_version() {
return first_version;
}
public void setFirst_version(String first_version) {
this.first_version = first_version;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
private String name;
private String first_version;
private String type;
}
这里代表我从数据库取name、first_version以及type这三个量(这三个量在package_list里,选择package_list是在上边配置文件中的sql语句中指明)。并为这三个量加上get与set(可用eclipse直接加)。
最后是apiMapper,Mapper文件是一个接口,它是api.xml里的命名空间,它的函数是api.xml里的唯一标识,它被测试函数(下一部分)所使用。代码如下:
package com.lvjing.mybatis.dao;
import java.util.List;
import com.lvjing.mybatis.bean.api;
public interface apiMapper {
public List<api> getApiFromSql();
}
这代表我要的数据是一个api的List(多行api数据)。
以上三个文件是读取数据的部分,它要有一个接口,有一个bean文件和一个配置文件。
测试文件
MybatisTest.java是本Demo中的测试文件,尝试从数据库读取数据并返回。创建该测试文件时应该New-Junit Test Case,建立完成后ctrl+shift+O进行打包,打入InputStream以及apache。
文件代码如下:
package com.lvjing.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 org.junit.Test;
import com.lvjing.mybatis.bean.api;
import com.lvjing.mybatis.dao.apiMapper;
public class MybatisTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "Mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
@Test
public void test() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
apiMapper mapper = openSession.getMapper(apiMapper.class);
List<api> api = mapper.getApiFromSql();
for(int i=1;i<api.size();i++) {
System.out.println(api.get(i).getName());
}
}
finally {
openSession.close(); }
}
}
其中
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "Mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
这部分用来建立SqlSessionFactory,需要改动的部分只有String resource =”“;这里,将其改为Mybatis的配置文件。
@Test
public void test() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
apiMapper mapper = openSession.getMapper(apiMapper.class);
List<api> api = mapper.getApiFromSql();
for(int i=1;i<api.size();i++) {
System.out.println(api.get(i).getName());
}
}
finally {
openSession.close(); }
}
}
之后是测试的函数,将异常抛出,然后建立一个SqlSessionFactory的对象,用这个对象建立一个SqlSession,之后参考代码进行修改即可。