1 框架的概念
写好的程序的半成品:大师根据功能或者某层搭好的软件基础:
程序员在框架的基础上进行开发
框架: 提高开发效率 降低开发难度
常见的框架:
hibernate:持久层(替代jdbc)
mybatis:持久层(替代jdbc)
springmvc:控制层(替代servlet)
struts2:控制层(替代servlet)
mybatisplus:持久层(替代jdbc)
spring:中间层(整合其他层和技术)
springsecurity:权限
fastdfs:图片服务器
oss:图片服务器
sso:点单登录·
2 框架基础
框架底层的技术:
1 反射 reflect
2 注解 annotation
3 xml dom解析
4 代理 proxy
5 io
6 socket
7 序列化:ObjectStream
3 反射
反射:通过类的字节码文件 动态的创建对象和获取类的成员
参照:杀鸡取卵、守株待兔
反射相关的四个类:Class:类的字节码文件对象
Constructor:类的构造方法对象
Field:类的成员变量对象
Method:类的普通方法对象
4 Class类
4.0 准备工作
package com.zhiyou100.demo012_reflect;
public class Student {
private int sid;
private String sname;
private float score;
private String sex;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(int sid, String sname, float score, String sex) {
System.out.println("构造方法:public Student(int sid, String sname, float score, String sex)");
this.sid = sid;
this.sname = sname;
this.score = score;
this.sex = sex;
}
public Student() {
System.out.println("构造方法:public Student()");
}
public void hehe(){
System.out.println("普通方法::public void hehe()");
}
public double haha(int a,float b){
System.out.println("普通方法::public double haha(int a,float b)");
return a+b;
}
private void hh(){
System.out.println("普通方法::private void hh()");
}
}
4.1 获取一个类的字节码文件对象的方式
Student student=new Student();
Class cla1=student.getClass();
System.out.println(cla1);
Class cla2=Student.class;
System.out.println(cla2);
System.out.println(cla1==cla2);
Class cla3=Class.forName("com.zhiyou100.demo012_reflect.Student");
System.out.println(cla3);
4.2 研究Class类中的方法
System.out.println("获取类名(包名.类名):getName::"+cla1.getName());
System.out.println("获取类名:getSimpleName::"+cla1.getSimpleName());
Student s2=(Student)cla1.newInstance();
System.out.println(s2);
System.out.println("获取所有的public修饰的构造方法对象::getConstructors::"+Arrays.toString(cla1.getConstructors()));
System.out.println("获取所有的构造方法对象::getDeclaredConstructors::"+Arrays.toString(cla1.getDeclaredConstructors()));
System.out.println("获取public修饰的无参数的构造方法::getConstructor::"+cla1.getConstructor(null));
System.out.println("获取public修饰的参数类型为double的构造方法::getConstructor::"+cla1.getConstructor(double.class));
System.out.println("获取任意修饰的参数类型为double的构造方法::getDeclaredConstructor::"+cla1.getDeclaredConstructor(int.class));
System.out.println("获取public修饰的某个成员变量:getField"+cla1.getField("a"));
System.out.println("获取任意修饰的某个成员变量:getDeclaredField"+cla1.getDeclaredField("c"));
System.out.println("获取public修饰的所有成员变量:getField"+Arrays.toString(cla1.getFields()));
System.out.println("获取任意修饰的所有成员变量:getDeclaredField"+Arrays.toString(cla1.getDeclaredFields()));
System.out.println("获取public修饰的某个普通方法:getMethod"+cla1.getMethod("haha", int.class,float.class));
System.out.println("获取任意修饰的某个普通方法:getDeclaredMethod"+cla1.getDeclaredMethod("hh"));
System.out.println("获取public修饰的所有普通方法:getMethods"+Arrays.toString(cla1.getMethods()));
System.out.println("获取任意修饰的所有普通方法:getDeclaredMethods"+Arrays.toString(cla1.getDeclaredMethods()));
5 Constructor类
Class cla1=Class.forName("com.zhiyou100.demo012_reflect.Student");
Constructor con1=cla1.getDeclaredConstructor(int.class,String.class,float.class,String.class);
System.out.println(con1);
System.out.println("getName:获取方法名:"+con1.getName());
System.out.println("getModifiers:获取修饰符:"+con1.getModifiers());
System.out.println("getParameterTypes:获取参数列表类型:"+Arrays.toString(con1.getParameterTypes()));
Student s1=(Student)con1.newInstance(1,"eheh",1.1f,"男");
System.out.println("s1="+s1);
con1=cla1.getDeclaredConstructor(int.class);
System.out.println(con1);
con1.setAccessible(true);
s1=(Student)con1.newInstance(1);
System.out.println("s1="+s1);
6 Field类
Class cla1=Class.forName("com.zhiyou100.demo012_reflect.Student");
Field f1=cla1.getDeclaredField("sex");
Student s1=new Student(101, "韩梅梅", 11f, "女");
f1.setAccessible(true);
f1.set(s1, "妖");
System.out.println("获取s1对象的sex属性的值:"+f1.get(s1));
System.out.println(s1);
System.out.println("获取属性名:"+f1.getName());
System.out.println("获取属性类型:"+f1.getType());
System.out.println("获取属性修饰符:"+f1.getModifiers());
7 Method类
Class cla1=Class.forName("com.zhiyou100.demo012_reflect.Student");
Method m1=cla1.getDeclaredMethod("haha", int.class,float.class);
System.out.println("m1==="+m1);
System.out.println("getName:获取方法名::"+m1.getName());
System.out.println("getName:获取方法修饰符::"+m1.getModifiers());
System.out.println("getName:获取方法返回值类型::"+m1.getReturnType());
System.out.println("getName:获取方法参数列表::"+Arrays.toString(m1.getParameterTypes()));
System.out.println("getName:获取方法抛出的异常类型::"+Arrays.toString(m1.getExceptionTypes()));
Student s1=new Student(101, "韩梅梅", 11f, "女");
m1.setAccessible(true);
Object result=m1.invoke(s1, 11,22.1f);
System.out.println("方法返回值值:"+result);
总结:
反射其实就是4个类+(4+1+2+1)个方法
8 反射练习1:
需求
写一个通用的dao实现 所有实体类对数据库的crud
:::dao就是就是java对象-数据库行 数据库行-java对象 的映射关系
大纲
public interface Demo05Mapper<E,ID_TYPE>{
public int addOne(E e);
public int aupdateOneById(E e);
public int deleteOneById(ID_TYPE id,Class cla);
public E getOneById(ID_TYPE id,Class cla);
public List<E> getAll(Class cla);
}
数据库准备
CREATE DATABASE db_4 CHARSET='utf8';
USE db_4;
CREATE TABLE teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
tming_zi VARCHAR(11),
txing_bie CHAR(1),
tfen_shu FLOAT(4,1),
tdang_yuan_ma BOOL
);
INSERT INTO teacher VALUES(NULL,
SUBSTRING(UUID(),1,10),
IF(RAND()>0.5,'男','女'),
TRUNCATE(RAND()*100,1),
RAND()>0.5
);
实现类
package com.zhiyou100.demo012_reflect;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class Demo05MapperImp<E,ID_TYPE> implements Demo05Mapper<E, ID_TYPE>{
public int addOne(E e){
Class cla=e.getClass();
String claName=cla.getSimpleName();
String tableName=getColumnNameByFieldName(claName);
Field[] fieldArr=cla.getDeclaredFields();
StringBuffer stb=new StringBuffer("");
stb.append("insert into ");
stb.append(tableName+"(");
for (Field field : fieldArr) {
String fieldName=field.getName();
String columnName=getColumnNameByFieldName(fieldName);
stb.append(columnName+",");
}
stb.setCharAt(stb.length()-1, ')');
stb.append(" values( ");
for (int i = 0; i < fieldArr.length; i++) {
stb.append("?,");
}
stb.setCharAt(stb.length()-1, ')');
System.out.println("slq:::"+stb.toString());
Connection con=JdbcUtil.getCon();
PreparedStatement pre=null;
int hang=0;
try {
pre=con.prepareStatement(stb.toString());
for (int i = 0; i < fieldArr.length; i++) {
Field field=fieldArr[i];
field.setAccessible(true);
pre.setObject(i+1, field.get(e));
}
hang=pre.executeUpdate();
} catch (Exception e2) {
throw new RuntimeException(e2);
}
JdbcUtil.close(con, pre, null);
return hang;
}
public int aupdateOneById(E e){
Class cla=e.getClass();
String claName=cla.getSimpleName();
String tableName=getColumnNameByFieldName(claName);
Field[] fieldArr=cla.getDeclaredFields();
StringBuffer stb=new StringBuffer("");
stb.append("update ");
stb.append(tableName+" set ");
for (Field field : fieldArr) {
String fieldName=field.getName();
if(fieldName.equals("id")){
continue;
}
String columnName=getColumnNameByFieldName(fieldName);
stb.append(columnName+" = ? ,");
}
stb.deleteCharAt(stb.length()-1);
stb.append(" where id=?");
System.out.println("slq:::"+stb.toString());
Connection con=JdbcUtil.getCon();
PreparedStatement pre=null;
int hang=0;
try {
pre=con.prepareStatement(stb.toString());
Object idValue=null;
for (int i = 0,index=0; i < fieldArr.length; i++) {
Field field=fieldArr[i];
field.setAccessible(true);
if(field.getName().equals("id")){
idValue=field.get(e);
continue;
}
pre.setObject(index+1, field.get(e));
index++;
}
pre.setObject(fieldArr.length, idValue);
hang=pre.executeUpdate();
} catch (Exception e2) {
throw new RuntimeException(e2);
}
JdbcUtil.close(con, pre, null);
return hang;
}
public int deleteOneById(ID_TYPE id,Class cla){
String claName=cla.getSimpleName();
String tableName=getColumnNameByFieldName(claName);
StringBuffer stb=new StringBuffer("delete from ");
stb.append(tableName+" where id=?");
System.out.println("slq:::"+stb.toString());
Connection con=JdbcUtil.getCon();
PreparedStatement pre=null;
int hang=0;
try {
pre=con.prepareStatement(stb.toString());
pre.setObject(1, id);
hang=pre.executeUpdate();
} catch (Exception e2) {
throw new RuntimeException(e2);
}
JdbcUtil.close(con, pre, null);
return hang;
}
public E getOneById(ID_TYPE id,Class cla){
String claName=cla.getSimpleName();
String tableName=getColumnNameByFieldName(claName);
StringBuffer stb=new StringBuffer("");
stb.append("select * from ");
stb.append(tableName+" where id=?");
System.out.println("slq:::"+stb.toString());
Connection con=JdbcUtil.getCon();
PreparedStatement pre=null;
ResultSet set=null;
E obj=null;
try {
pre=con.prepareStatement(stb.toString());
pre.setObject(1, id);
set=pre.executeQuery();
if(set.next()){
obj=(E)cla.newInstance();
Field[] fieldArr=cla.getDeclaredFields();
for (Field field : fieldArr) {
field.setAccessible(true);
String fieldName=field.getName();
String columnName=getColumnNameByFieldName(fieldName);
field.set(obj, set.getObject(columnName));
}
}
} catch (Exception e2) {
throw new RuntimeException(e2);
}
JdbcUtil.close(con, pre, set);
return obj;
}
public List<E> getAll(Class cla){
String claName=cla.getSimpleName();
String tableName=getColumnNameByFieldName(claName);
StringBuffer stb=new StringBuffer("");
stb.append("select * from ");
stb.append(tableName);
System.out.println("slq:::"+stb.toString());
Connection con=JdbcUtil.getCon();
PreparedStatement pre=null;
ResultSet set=null;
List<E> list=new ArrayList<E>();
try {
pre=con.prepareStatement(stb.toString());
set=pre.executeQuery();
while(set.next()){
E obj=(E)cla.newInstance();
Field[] fieldArr=cla.getDeclaredFields();
for (Field field : fieldArr) {
field.setAccessible(true);
String fieldName=field.getName();
String columnName=getColumnNameByFieldName(fieldName);
field.set(obj, set.getObject(columnName));
}
list.add(obj);
}
} catch (Exception e2) {
throw new RuntimeException(e2);
}
JdbcUtil.close(con, pre, set);
return list;
}
private String getColumnNameByFieldName(String fieldName){
String columnName="";
for (int i = 0; i < fieldName.length(); i++) {
char c=fieldName.charAt(i);
if(i!=0&&Character.isUpperCase(c)){
columnName+="_";
}
columnName+=c;
}
columnName=columnName.toLowerCase();
return columnName;
}
public static void main(String[] args) {
Demo05MapperImp<Teacher,Integer> demo05=new Demo05MapperImp<Teacher, Integer>();
System.out.println("获取一个:::"+demo05.getOneById(1,Teacher.class));
System.out.println("获取所有:::"+demo05.getAll(Teacher.class));
}
}
9 反射练习2:
通过反射写一个工具类 可以针对于所有类型的对象 保存为对应的xml
要求:主键名必须是id id为标签的唯一属性 其他属性都是子标签
文件名就是类名
标签名就是类名
属性名就是子标签名
跟标签统一为 root
位置都当前包
package com.zhiyou100.demo012_reflect;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Generated;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class Demo06<E,ID_TYPE>{
private static String path="src/com/zhiyou100/demo012_reflect/";
public static void main(String[] args) throws Exception{
Demo06<Teacher,Integer> d6=new Demo06<Teacher, Integer>();
d6.addOne(new Teacher(111, "张1三1", "男", 211f, true));
d6.addOne(new Teacher(121, "张2三1", "妖", 212f, true));
d6.addOne(new Teacher(131, "张3三1", "女", 213f, false));
System.out.println("获取一个::"+d6.getOneById(11, Teacher.class));
System.out.println("获取所有::"+d6.getAll(Teacher.class));
}
public int addOne(E e)throws Exception{
Class cla=e.getClass();
String className=cla.getSimpleName();
Document doc=readXml2Doc(className);
Element root=(Element)doc.getElementsByTagName("root").item(0);
Element classEle=doc.createElement(className);
Field[] fieldArr=cla.getDeclaredFields();
for (Field field : fieldArr) {
String fieldName=field.getName();
field.setAccessible(true);
Object fieldValue = field.get(e);
if(fieldName.equals("id")){
classEle.setAttribute("id", fieldValue+"");
continue;
}
Element fieldEle=doc.createElement(fieldName);
fieldEle.setTextContent(fieldValue+"");
classEle.appendChild(fieldEle);
}
root.appendChild(classEle);
writeDoc2Xml(doc, className);
return 1;
}
public int updateOneById(E e)throws Exception{
Class cla=e.getClass();
String className=cla.getSimpleName();
Field idField=cla.getDeclaredField("id");
idField.setAccessible(true);
Object idValue=idField.get(e);
Document doc=readXml2Doc(className);
Element root=(Element)doc.getElementsByTagName("root").item(0);
NodeList list=root.getElementsByTagName(className);
for (int i = 0; i < list.getLength(); i++) {
Element classEle=(Element)list.item(i);
String idAttrValue=classEle.getAttribute("id");
if(idAttrValue.equals(idValue+"")){
Field[] fieldArr=cla.getDeclaredFields();
for (Field field : fieldArr) {
String fieldName=field.getName();
if(fieldName.equals("id")){
continue;
}
field.setAccessible(true);
Object fieldValue=field.get(e);
Element ziEle=(Element)classEle.getElementsByTagName(fieldName).item(0);
ziEle.setTextContent(fieldValue+"");
}
break;
}
}
writeDoc2Xml(doc, className);
return 1;
}
public int deleteOneById(ID_TYPE id,Class cla){
String className=cla.getSimpleName();
Document doc=readXml2Doc(className);
Element root=(Element)doc.getElementsByTagName("root").item(0);
NodeList list=root.getElementsByTagName(className);
for (int i = 0; i < list.getLength(); i++) {
Element classEle=(Element)list.item(i);
String idAttrValue=classEle.getAttribute("id");
if(idAttrValue.equals(id+"")){
root.removeChild(classEle);
break;
}
}
writeDoc2Xml(doc, className);
return 1;
}
public E getOneById(ID_TYPE id,Class cla)throws Exception{
E e=null;
String className=cla.getSimpleName();
Document doc=readXml2Doc(className);
Element root=(Element)doc.getElementsByTagName("root").item(0);
NodeList list=root.getElementsByTagName(className);
for (int i = 0; i < list.getLength(); i++) {
Element classEle=(Element)list.item(i);
String idAttrValue=classEle.getAttribute("id");
if(idAttrValue.equals(id+"")){
e=(E)cla.newInstance();
Field[] fieldArr=cla.getDeclaredFields();
for (Field field : fieldArr) {
field.setAccessible(true);
String fieldName=field.getName();
if(fieldName.equals("id")){
field.set(e, id);
continue;
}
Element fieldEle=(Element)classEle.getElementsByTagName(fieldName).item(0);
String fieldvalue=fieldEle.getTextContent();
field.set(e, changeType(fieldvalue, field.getType()));
}
break;
}
}
return e;
}
public List<E> getAll(Class cla)throws Exception{
List<E> listObj=new ArrayList<E>();
String className=cla.getSimpleName();
Document doc=readXml2Doc(className);
Element root=(Element)doc.getElementsByTagName("root").item(0);
NodeList list=root.getElementsByTagName(className);
for (int i = 0; i < list.getLength(); i++) {
Element classEle=(Element)list.item(i);
String idAttrValue=classEle.getAttribute("id");
E e=(E)cla.newInstance();
Field[] fieldArr=cla.getDeclaredFields();
for (Field field : fieldArr) {
field.setAccessible(true);
String fieldName=field.getName();
if(fieldName.equals("id")){
field.set(e, changeType(idAttrValue, field.getType()));
continue;
}
Element fieldEle=(Element)classEle.getElementsByTagName(fieldName).item(0);
String fieldvalue=fieldEle.getTextContent();
field.set(e, changeType(fieldvalue, field.getType()));
}
listObj.add(e);
}
return listObj;
}
private static Object changeType(String value,Class type)throws Exception{
if(type==byte.class || type==Byte.class){
return Byte.parseByte(value);
}
if(type==short.class || type==Short.class){
return Short.parseShort(value);
}
if(type==int.class || type==Integer.class){
return Integer.parseInt(value);
}
if(type==char.class || type==Character.class){
return value.indexOf(0);
}
if(type==long.class || type==Long.class){
return Long.parseLong(value);
}
if(type==float.class || type==Float.class){
return Float.parseFloat(value);
}
if(type==double.class || type==Double.class){
return Double.parseDouble(value);
}
if(type==boolean.class || type==Boolean.class){
return Boolean.parseBoolean(value);
}
if(type==Date.class){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value);
}
return value;
}
public static Document readXml2Doc(String className){
File file=new File(path+className+".xml");
try {
if(!file.exists()) {
BufferedWriter bout=new BufferedWriter(new FileWriter(file));
bout.write("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>");
bout.newLine();
bout.flush();
bout.write("<root> </root>");
bout.flush();
bout.close();
}
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void writeDoc2Xml(Document doc,String className) {
try {
Transformer tf=TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
File file=new File(path+className+".xml");
tf.transform(new DOMSource(doc), new StreamResult(file));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}