封装,继承,多态。
其中多态详解请看这篇博文:
https://www.cnblogs.com/chenssy/p/3372798.html
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
其中有一个经典实例:
https://blog.csdn.net/thinkGhoster/article/details/2307001
如果对象的属性值要支持可扩展,那么属性的值我们就不能够在代码中去指定,必须通过某种方法分离出来,反射其实也是一种解耦的思想。
java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意一个方法和属性;这种动态获取信息以及动态调用对象方法的功能成为java语言的反射机制。
想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。
获取字节码文件对象的三种方式:
Class clazz1 = Class.forName("全限定类名");
例如:
Class clazz0=Class.forName("com.lemon.day13.section01.Student");
Class clazz2 = 类名.class;
例如:
Class clazz=Student.class;
Class clazz3 = p.getClass();
有了字节码文件对象才能获得类中所有的信息,我们在使用反射获取信息时,也要考虑使用上面哪种方式获取字节码对象合理,视不同情况而定。
反射详解:https://www.cnblogs.com/whgk/p/6122036.html
这里解析的是课程中关于调用student类,为其设置属性值的方法:
详见我的这篇博文:
https://blog.csdn.net/qq_34659777/article/details/87007252
传送门:https://blog.csdn.net/qq_34659777/article/details/87100266
传送门:https://blog.csdn.net/qq_34659777/article/details/83687434
这个博客讲得很好:
https://baijiahao.baidu.com/s?id=1588848792548192879&wfr=spider&for=pc
honghong1
20
java82
男
dom4j是一个Java的XML API。
我们打开maven 中央仓库,在其中搜索dom4j,选择1.6.1版本。
用来解析xml中的数据,例如:
honghong1
20
java82
男
将这个xml中的数据进行解析,使用方法:
//new一个工具类
SAXReader saxReade=new SAXReader();
//读取这个文件-->文档-->提取信息
Document document = saxReade.read(XmlReader.class.getResourceAsStream("/students.xml"));//类路径下根路径
//获得根元素
Element rootelement = document.getRootElement();
//获得根节点的所有子节点
List elements = rootelement.elements();
for (Element element : elements) {
//获得student子元素的id属性
Attribute idattribute = element.attribute("id");
//获得student元素的所有子元素
List stuSubElements=element.elements();
for (Element stuSubElement : stuSubElements) {
//获得每个标签的名称
System.out.println(stuSubElement.getName());
//获得每个标签中的值
System.out.println(stuSubElement.getText());
}
}
JDBC:Java数据库连接(Java DataBase Connectivity)
用于执行SQL语句的Java API,Java语言编写的类和接口,为多种关系数据库提供统一访问。
// id、user_name,phone,pwd -- sql 大小写不区分--》弱语法
create table member(
id in(10),
user_name varchar(20),
phone char(11),
pwd varchar(40)
);
insert into 表名(需要添加值的字段) values(每个字段的值);
insert INTO test(name,phone,sex) VALUES ("enna",MD5("13111111"),"nan")
删除表的所有记录
delete from 表名;
删除部分记录
delete from 表名 where 指定的条件;
删除整个表的记录(删除所有记录,而且会把自增长恢复到默认值)
truncate table member;
删除表(破坏性,谨慎操作,删除结构)
drop table member;
update member set 字段1='新的值',字段2='新值'
select 检索的字段 from 表名;
-- 多表查询
-- 查询出来45条记录,叫做笛卡尔积
SELECT * FROM t_user,t_lover_info;
-- 想要筛选出有意义的记录
-- 等值连接
SELECT * FROM t_lover_info as t1,t_user as t2 WHERE t1.u_id=t2.id
SELECT * FROM t_lover_info as t1 JOIN t_user as t2 ON t1.u_id=t2.id
-- 内连接或等值连接,可以获取两个表中字段匹配关系的记录
SELECT * FROM t_lover_info as t1 INNER JOIN t_user as t2 ON t1.u_id=t2.id
SELECT * FROM t_lover_info as t1 CROSS JOIN t_user as t2 ON t1.u_id=t2.id
--左连接,会读取左表的全部数据,即使右表没有对应数据。左连接从左表(A)产生一套完整的记录和右表匹配的记录,如果右表没有匹配记录,右侧结果集字段将为null
SELECT * FROM t_lover_info as t1 LEFT JOIN t_user as t2 ON t1.u_id=t2.id
-- 右连接是以右表为基础,与LEFT JOIN相反
SELECT * FROM t_lover_info as t1 RIGHT JOIN t_user as t2 ON t1.u_id=t2.id
其他sql语句的应用可以参考此前的博客:https://blog.csdn.net/qq_34659777/article/details/78225522
Navicat Premium v12.1.9破解版_x86_x64:
软件破解补丁:https://www.lanzous.com/i1v0ywd
12.x最新版本:http://download.navicat.com/download/navicat121_premium_cs_x64.exe
为了防止其中的软件及补丁分享失效,我在csdn上也已经上传了这两个软件的打包,链接:
https://download.csdn.net/download/qq_34659777/10968094
破解过程:卸载掉早期版本,卸载干净,然后安装最新版navicat,安装完成后将破解补丁复制到安装目录下,运行破解补丁,先patch;
然后选择版本和语言;
运行navicat,弹出注册界面,如果没有弹出注册界面,手动在菜单打开:帮助->注册,然后点击注册机的generate按钮,注册码会自动填写到navicat;点击navicat注册界面的激活按钮,提示手动激活;
点击手动激活。
然后将得到的RequestCode复制到注册机;
点击注册机左下方的Generate按钮,生成ActivationCode,复制粘贴到navicat的激活码框,完成激活;
//这一步首先要在maven或者程序中引入mysql-connector.jar
Class.forName("com.mysql.jdbc.Driver");
注意:
如果你在这里使用的是最新的mysql 连接驱动,那么驱动这里需要修改一下,否则会报异常:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
解决方法:
将以上代码改为:
Class.forName("com.mysql.cj.jdbc.Driver");
String user = "futurevistor";
String password = "123456";
//jdbc是指使用mysql连接数据库,各个数据库管理工具使用的语法各不相同
String url = "jdbc:mysql://120.78.128.25:3306/future";
//DriverManager:负责访问数据库的驱动管理
//Connection:与数据库进行连接的连接对象,所有与数据库的通信都是通过连接对象
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from member;";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet resultSet=pstmt.executeQuery();
while (resultSet.next()) {
String id=resultSet.getString(1);
String regName=resultSet.getString(2);
String pwd1=resultSet.getString(3);
String phone=resultSet.getString(4);
System.out.println(id+" , "+regName+" , "+pwd1+" , "+phone);
}
pstmt.close();
conn.close();
注: 其中PreparedStatement处理的步骤:
代码如下:
String sql = "select * from member_water where mmobilephone=? and pwd=?;";
PreparedStatement pstmt = conn.prepareStatement(sql);
//对占位符对应的参数进行设值,mobilePhone和pwd为传入的参数
pstmt.setString(1, mobilePhone);
pstmt.setString(2, pwd);
/**
* JDBC工具类,提供增删改查
* @author mayn
*
*/
public class DBUtil {
/**
* 0.注册驱动、连接数据库的而字符串代码冗余 1)只注册一遍 2)连接数据库的信息值声明一遍 1.重复的数据库的创建和关闭,形成资源的浪费
* 2.增删改查语法不具备通用性(没办法适用所有表、所有的增删改查数据)
*
* @param args
* @throws Exception
*/
private static String user;
private static String password;
private static String url;
private static String driver;
/**
* 静态代码块,只运行一次,用于编写一些只需要运行一边的代码逻辑 通过静态库,保证注册驱动,以及读取数据库连接信息的操作只运行一遍
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");
Properties properties = new Properties();
properties.load(DBUtil.class.getResourceAsStream("/jdbc.properties"));
driver = properties.getProperty("jdbc.driver");
user = properties.getProperty("jdbc.user");
password = properties.getProperty("jdbc.password");
url = properties.getProperty("jdbc.url");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
// insert("kaibin", "hhhh", "13255555555");
}
private static Connection getConnection() throws SQLException {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 不确定参数的类型和个数
*/
public static void execute(String sql, Object... params) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
int length = params.length;
for (int i = 0; i < length; i++) {
pstmt.setObject(i + 1, params[i]);
}
pstmt.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
close(conn, pstmt);
}
}
/**
*
* @param sql
* 要执行的sql语句
* @param params
* 占位符对应的参数
* @return
* @throws Exception
*/
public static List
其中还包含一个jdbc.properties:
jdbc.url=jdbc:mysql://120.78.128.25:3306/future
jdbc.user=futurevistor
jdbc.password=123456
jdcc.driver=com.mysql.cj.jdbc.Driver
写完之后,只需要传入sql语句和可变参数就可以直接调用并进行增删改查操作了,例:
//新建了一个DBTest类用来测试框架是否可用
public class DBTest {
public static void main(String[] args) throws Exception {
//1.测试插入:
// String sql="insert into member_water(regname,mobilephone,pwd,leaveamount) value(?,?,?,?);";
// DBUtil.execute(sql, "kaibin","13212575740","123456",100.0);
//修改
// String sql="update member_water set leaveamount=? where id=?";
// DBUtil.execute(sql,10.0,41);
//删除
// String sql="delete from member_water where id=?";
// DBUtil.execute(sql, 41);
//查询
String sql="select * from member_water ";
List> data=new ArrayList>();
data=DBUtil.select(sql);
for (Map map : data) {
System.out.println(map);
}
}
}
Testing Next Generation,下一代测试技术。
利用注解来强化测试功能的测试框架,可以用来做单元测试和集成测试。
首先将testNG插件放到eclipse对应的文件夹下,testNG插件下载:
链接:https://pan.baidu.com/s/1VxctS80R7ckuEscZE-e3ZA
提取码:waob
org.testng
testng
6.8.8
test
xml-apis
xml-apis
1.4.01
testNG的两种执行方式:
然后右键testng.xml–>Run As–>TestNG Suite,然后可以在控制台和Results of running suite中分别查看结果。
如果遇到eclipse乱码的问题,在eclipse.ini文件中添加:-Dfile.encoding=UTF-8
@Test(enable=false)
@Test(timeOut=1000)
@Test(expectedExceptions={NullPointerException.class,ClassNotFoundException.class})
@Test(dependsOnMethods={"e","d"})
方法的执行顺序:
dependsOnGroups:这个的测试方法依赖于某些组
语法:
测试方法属于哪一个分组:
@Test(groups={"g1,g2"})
此测试方法属于g1分组,但是依赖于g2分组:
@Test(dependsOnGroups={"g2"},groups={"g1"})
只会执行g1组的测试方法,其他测试方法都不会执行:(写在.xml文件中)
@Test(priority=1)
还要在.xml文件中开启
testNG提供了一种配置方式使得我们不需要去重构已经写好的junit单元测试类:
在testNG.xml中添加一个test,将junit属性设置为true即可:
public class DataProviderTest {
//表示由方法“dp”来注入数据,也叫数据驱动
@Test(dataProvider = "dp")
public void f(Integer n, String s,String name) {
System.out.println(n+","+s+","+name);
}
//下面的这个方法是为测试单元测试方法提供数据的
@DataProvider
public Object[][] dp() {
return new Object[][] {
new Object[] { 1, "a","tom" },
new Object[] { 2, "b" ,"jack"},
new Object[] { 3, "a" ,"kaibin"},
new Object[] { 4, "b" ,"honghong"},
};
}
}