Hibernate是DAO层技术,对数据的使用,查询是最为重要的。Hibernate的查询技术非常强大,支持原始SQL语句查询,支持QBC查询以及Hibernate特有的HQL查询。
HQL,Hibernate Query Language,Hibernate查询语言,它和SQL非常相似,但是,HQL是面向对象的查询语言,而SQL是面向二维表的。HQL查询语句中使用的是类名和属性名,而SQL语句使用的是表名和字段名。
需要注意的是,在不使用类的别名的情况下,在HQL中直接使用字段名也是可以通过的。但是若使用“类别名.属性名"的形式,则不能够使用字段名。
QBC,Query By Criteria,标准查询,一种比HQL更为面向对象的查询方法。 1 API 1.1 Query接口
Hibernate进行HQL查询的接口,支持动态绑定参数的功能。使用Session对象的createQuery方法可获取Query对象。
Query query = session.createQuery(hql);。 1.2 SQLQuery接口
Hibernate进行SQL原生查询的接口,支持动态绑定参数的功能,是Query接口的子接口。使用Session对象的createSQLQuery()方法可获取SQLQuery对象。
SQLQuery sqlQuery = session.createSQLQuery(sql);。
其查询出的结果对象默认为Object,当然,若结果为List,则其元素为Object。使用SQLQuery的addEntity(Xxx.class)方法,可以将其结果泛型设定为指定类型。 1.3 Criteria接口
Criteria标准、准则,Hibernate进行Criteria查询的接口,与Query接口无关。使用Session对象的createCriteria()方法可获取Criteria对象。
Criteria criteria = session.createCriteria(Xxx.class);。 2 分类查询 2.1 查询测试前的准备工作 2.1.1 定义查询的实体
下面查询举例,均是对实体类Student进行操作,其映射关系如下:
2.1.2 定义主配置文件
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
root
02000059
org.hibernate.dialect.MySQL5Dialect
thread
update
true
true
2.1.3 定义Hibernate工具类 public class HbnUtils {
private static SessionFactory sessionFactory;
public static Session getSession() {
return getSessionFactory().getCurrentSession();
}
private static SessionFactory getSessionFactory() {
if(sessionFactory == null || sessionFactory.isClosed()) {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
return sessionFactory;
}
}
2.1.4 定义测试类的setUp()
创建好测试类MyTest后,完成初始化方法setUp(): public class MyTest {
private Session session;
@Before
public void setUp() {
session = HbnUtils.getSession();
}
}
2.1.5 准备测试数据 //完成数据插入
@Test
public void test00() {
try {
session.beginTransaction();
for(int i = 0; i < 10; i ++) {
Student student = new Student("n_" + i, 15 +i , 75 + i);
session.save(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.2 查询所有
查询所有的特点是,其查询结果为List集合。 2.2.1 SQL查询 //使用SQLQuery查询所有
@Test
public void test02_SQL() {
try {
session.beginTransaction();
String sql = "select * from t_student";
List students = session.createSQLQuery(sql).addEntity(Student.class).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.2.2 HQL查询 //使用HQL查询所有
@Test
public void test02_HQL() {
try {
session.beginTransaction();
String hql = "from Student";
List students = session.createQuery(hql).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.2.3 QBC查询 //使用QBC查询所有
@Test
public void test02_QBC() {
try {
session.beginTransaction();
List students = session.createCriteria(Student.class).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.3 查询结果排序
排序,即order by,asc表示升序,desc表示降序。
2.3.1 SQL查询 //使用SQLQuery查询所有,并排序
@Test
public void test03_SQL() {
try {
session.beginTransaction();
String sql = "select * from t_student order by sscore desc";
List students = session.createSQLQuery(sql).addEntity(Student.class).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.3.2 HQL查询 //使用HQL查询所有,并排序
@Test
public void test03_HQL() {
try {
session.beginTransaction();
String hql = "from Student order by score desc";
List students = session.createQuery(hql).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.3.3 QBC查询
通过addOrder()方法可以向Criteria对象添加排序功能。Order类有两个静态方法desc()和asc(),分别用于降序和升序功能,它们的参数为排序属性名,注意非字段名。 //使用QBC查询所有,并排序
@Test
public void test03_QBC() {
try {
session.beginTransaction();
List students = session.createCriteria(Student.class).addOrder(Order.desc("score")).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.4 动态参数绑定查询
动态参数绑定查询,即参数的值是由代码传递来的,而非固定在查询中。 2.4.1 SQL查询
方式一:使用”?"占位符占位,setXxx()方法绑定参数:setXxx(int position, Object value)。方法名中的Xxx表示该位置参数的类型。position表示第几个占位符,从0开始计数。 //使用SQLQuery查询年龄大于20岁,成绩小于98分的学生
@Test
public void test04_SQL_setXxx() {
try {
session.beginTransaction();
String sql = "select * from t_student where sage > ? and sscore < ?";
List students = session.createSQLQuery(sql)
.addEntity(Student.class).setInteger(0, 20).setDouble(1, 98).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
方式二:使用别名占位,setXxx()绑定参数:setXxx (String name, Object value)。别名的命名规则为:冒号后跟别名,别名可以是任意名称。 //使用SQLQuery查询年龄大于20岁,成绩小于98分的学生
@Test
public void test04_SQL_setXxx2() {
try {
session.beginTransaction();
String sql = "select * from t_student where sage > :tage and sscore < :tscore";
List students = session.createSQLQuery(sql)
.addEntity(Student.class).setInteger("tage", 20).setDouble("tscore", 98).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
方式三:使用“?”占位符占位,setParameter()绑定参数:SetParameter(int position, Object value)。position表示第几个占位符,从0开始计数。 //使用SQLQuery查询年龄大于20岁,成绩小于98分的学生
@Test
public void test04_SQL_setParameter() {
try {
session.beginTransaction();
String sql = "select * from t_student where sage > ? and sscore < ?";
List students = session.createSQLQuery(sql)
.addEntity(Student.class).setParameter(0, 20).setParameter(1, 98).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
方式四:使用别名占位,setParameter()绑定参数:SetParameter(String name, Object value)。别名的命名规则为:冒号后跟别名,别名可以是任意名称。 //使用SQLQuery查询年龄大于20岁,成绩小于98分的学生
@Test
public void test04_SQL_setParameter2() {
try {
session.beginTransaction();
String sql = "select * from t_student where sage > :tage and sscore < :tscore";
List students = session.createSQLQuery(sql)
.addEntity(Student.class).setParameter("tage", 20).setParameter("tscore", 98).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.4.2 HQL查询
使用HQL查询时,以上四种为动态参数赋值的方式均可成立,其用法相同。 //使用HQL查询年龄大于20岁,成绩小于98分的学生
@Test
public void test04_HQL() {
try {
session.beginTransaction();
String hql = "from Student where sage > :tage and sscore < :tscore";
List students = session.createQuery(hql)
.setParameter("tage", 20).setParameter("tscore", 98).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.4.3 QBC查询
需要向Criteria对象添加限制条件Restrictions,即添加查询条件。(Restriction,中文意思:限制,约束。)Restrictions具有很多静态方法可用于表示关系比较。
注意double类型数据的写法。
//使用QBC查询年龄大于20岁,成绩小于98分的学生
@Test
public void test04_QBC() {
try {
session.beginTransaction();
List students = session.createCriteria(Student.class)
.add(Restrictions.gt("age", 20))
//需要注意,这里不能够写成98
.add(Restrictions.lt("score", 98.0)).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.5 分页查询
分页查询的SQL语句:select * from … where …limit startIndex, pageSize。
其中,startIndex为开始索引,设置从总查询结果集的第几条记录作为本查询结果子集的开始,即本页的开始。总查询结果集从0开始计数。pageSize为该页所包含的记录数。 2.5.1 SQL查询 //使用SQLQuery查询出所有学生中从第4条开始的5名学生信息
@Test
public void test05_SQL() {
try {
session.beginTransaction();
String sql = "select * from t_student limit ?, ?";
List students = session.createSQLQuery(sql)
.addEntity(Student.class).setParameter(0, 3).setParameter(1, 5).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.5.2 HQL查询
Query接口中具有setFirstResult()方法,用于设置从总查询结果集的第几条记录作为本查询结果子集的开始,即本页的开始。总查询结果集从0开始计数。而setMaxResults()方法用于设置该页所包含的记录数。 //使用HQL查询出所有学生中从第4条开始的5名学生信息
@Test
public void test5_HQL() {
try {
session.beginTransaction();
String hql = "from Student";
List students = session.createQuery(hql)
.setFirstResult(3).setMaxResults(5).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.5.3 QBC查询
Criteria接口中也有setFirstResult()与setMaxResults()方法,其用法与意义和Query接口中的完全相同。由于Criteria与Query接口无关,所以这两组完全相同的方法也是没有关系的,仅仅是用法和写法上得相同而已。 //使用QBC查询出所有学生中从第4条开始的5名学生信息
@Test
public void test05_QBC() {
try {
session.beginTransaction();
List students = session.createCriteria(Student.class)
.setFirstResult(3).setMaxResults(5).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.6 模糊查询 2.6.1 SQL查询 //使用SQLQuery查询出所有姓名中包含字符n的学生
@Test
public void test06_SQL() {
try {
session.beginTransaction();
String sql = "select * from t_student where sname like :tname";
List students = session.createSQLQuery(sql)
.addEntity(Student.class).setParameter("tname", "%n%")
.list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.6.2 HQL查询 //使用HQL查询出所有姓名中包含字符n的学生
@Test
public void test06_HQL() {
try {
session.beginTransaction();
String hql = "from Student where name like :tname";
List students = session.createQuery(hql)
.setParameter("tname", "%n%")
.list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.6.3 QBC查询 //使用QBC查询出所有姓名中包含字符n的学生
@Test
public void test06_QBC() {
try {
session.beginTransaction();
List students = session.createCriteria(Student.class)
.add(Restrictions.like("name", "%n%")).list();
for(Student student : students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.7 唯一性查询 2.7.1 SQL查询
SQLQuery接口的uniqueResult()方法表示其查询结果为一条数据,其返回值为Object。 //使用SQLQuery查询id为5的学生
@Test
public void test07_SQL() {
try {
session.beginTransaction();
String sql = "select * from t_student where sid = ?";
Student student = (Student) session.createSQLQuery(sql)
.addEntity(Student.class).setInteger(0, 5).uniqueResult();
System.out.println(student);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.7.2 HQL查询 //使用HQL查询id为5的学生
@Test
public void test07_HQL() {
try {
session.beginTransaction();
String hql = "from Student where id = ?";
Student student = (Student) session.createQuery(hql)
.setInteger(0, 5).uniqueResult();
System.out.println(student);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.7.3 QBC查询 //使用QBC查询id为5的学生
@Test
public void test07_QBC() {
try {
session.beginTransaction();
Student student = (Student) session.createCriteria(Student.class)
.add(Restrictions.eq("id", 5)).uniqueResult();
System.out.println(student);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.8 聚合函数查询 2.8.1 SQL查询
注意区分count()与count(name)的不同。count( )与count(id)等价,均表示未空记录数,而count(name)则表示字段name的非空记录数。
//查询记录总数以及姓名非空的记录数
@Test
public void test08_SQL() {
try {
session.beginTransaction();
String sql1 = "select count(*) from t_student";
Object total1 = session.createSQLQuery(sql1).uniqueResult();
System.out.println(total1);
String sql2 = "select count(sname) from t_student";
Object total2 = session.createSQLQuery(sql2).uniqueResult();
System.out.println(total2);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.8.2 HQL查询 //查询记录总数以及姓名非空的记录数
@Test
public void test08_HQL() {
try {
session.beginTransaction();
String hql1 = "select count(*) from Student";
Object total1 = session.createQuery(hql1).uniqueResult();
System.out.println(total1);
String hql2 = "select count(sname) from Student";
Object total2 = session.createQuery(hql2).uniqueResult();
System.out.println(total2);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.8.3 QBC查询
Projection,中文意思:投影。Projection中包含很多聚合函数的静态方法。
//查询记录总数以及姓名非空的记录数
@Test
public void test08_QBC() {
try {
session.beginTransaction();
Object total1 = session.createCriteria(Student.class)
.setProjection(Projections.count("id")).uniqueResult();
System.out.println(total1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.9 投影查询 2.9.1 SQL查询
要求查询的字段的别名要与实体类的属性名相同,这样才能将结果转换为相应类的对象。 //使用SQLQuery查询所有学生的姓名与年龄
@Test
public void test09_SQL() {
try {
session.beginTransaction();
String sql = "select sname name, sage age from t_student";
List students = session.createSQLQuery(sql)
.setResultTransformer(Transformers.aliasToBean(Student.class)).list();
for(Student student: students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
aliasToBean()方法首先会创建一个空的Student对象,然后会将别名和Student属性名对比,再用查询出的值初始化创建的Student对象。 2.9.2 HQL查询
该查询要求实体类中具有相同投影作为参数的带参构造器。所以,首先要在Student类中添加相应的带参构造器。 public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
//使用HQL查询所有学生的姓名与年龄
@Test
public void test09_HQL() {
try {
session.beginTransaction();
String hql = "select new Student(name, age) from Student";
List students = session.createQuery(hql).list();
for(Student student: students) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.10 分组查询 2.10.1 SQL查询
having,对分组结果进行筛选。下面代码实现的功能是,查询出所有年龄段,以及人数多于1人的年龄段。 //查询出所有的年龄段,以及人数大于1人的年龄段
@Test
public void test10_SQL() {
try {
session.beginTransaction();
String sql = "select sage from t_student group by sage";
List result1 = session.createSQLQuery(sql).list();
for(Object object: result1) {
System.out.println(object);
}
System.out.println("------------------");
String sql2 = "select sage from t_student group by sage having count(sage) > ?";
List result2 = session.createSQLQuery(sql2).setInteger(0, 1).list();
for(Object object: result2) {
System.out.println(object);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
} 2.9.2 HQL查询 //查询出所有的年龄段,以及人数大于1人的年龄段
@Test
public void test10_HQL() {
try {
session.beginTransaction();
String hql1 = "select age from Student group by age";
List result1 = session.createQuery(hql1).list();
for(Object object: result1) {
System.out.println(object);
}
System.out.println("------------------");
String hql2 = "select age from Student group by age having count(age) > ?";
List result2 = session.createQuery(hql2).setInteger(0, 1).list();
for(Object object: result2) {
System.out.println(object);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
} 2.9.3 QBC查询
Hibernate不直接支持having操作。
//查询出所有的年龄段
@Test
public void test10_QBC() {
try {
session.beginTransaction();
List result1 = session.createCriteria(Student.class).
setProjection(Projections.groupProperty("age")).list();
for(Object object: result1) {
System.out.println(object);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
} 2.11 Query的list()与iterator() 2.11.1 Query的list()查询 //使用Query的list()查询所有
@Test
public void test11_HQL_list() {
try {
session.beginTransaction();
String hql = "from Student";
//第一次查询
List students1 = session.createQuery(hql).list();
for(Student student : students1) {
System.out.println(student);
}
//第二次查询
List students2 = session.createQuery(hql).list();
for(Student student : students2) {
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.10.2 Query的iterate()查询 //使用Query的iterate()查询所有
@Test
public void test11_HQL_list_iterate() {
try {
session.beginTransaction();
String hql = "from Student";
//第一次查询
Iterator it1 = session.createQuery(hql).iterate();
while(it1.hasNext()) {
Student student = it1.next();
System.out.println(student);
}
//第二次查询
Iterator it2 = session.createQuery(hql).iterate();
while(it2.hasNext()) {
Student student = it2.next();
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.10.3 Query的list()与iterator()的区别
使用Query接口的list()和iterate()进行查询,查看其控制台的SQL语句的输出情况,可以看到它们区别主要有两点: 1、使用list(),会一次性将所有符合条件的记录查询出来,而使用iterate(),则首先会查询所有符合条件的记录的id,然后在根据这些id逐个查询出记录的具体内容。 2、使用list(),不会使用缓存机制,即每次执行一次查询代码,控制台会执行一次SQL查询语句;而使用iterate(),则会使用缓存机制,只有第一次会执行SQL查询,再往后的查询会直接从缓存中读取。 2.10.4 N + 1问题
使用Query的iterate()方法虽然使用了Hibernate的缓存机制,但是同时也出现了N+1问题。
所谓N+1问题是指,从查询出有效数据角度来说,若要查询符合某条件的对象时,使用list(),则一次性即可查询出所有。而若使用iterate(),则会先查询出所有满足条件的对象的id,然后再逐个id进行select查询,即需要经过N+1次才能得出有效结果。这就是N+1问题。 2.10.5 N + 1问题的避免
若想要使用Hibernate缓存,即使用iterate()方法,还想要避免N + 1问题,就要保证在执行iterate()时,缓存中已经有数据,这样既可利用缓存,有可以避免N+1问题。所以,可以在第一次查询时使用list(),而以后的查询则使用iterate()。
//N + 1问题的避免
@Test
public void test11_HQL_list_iterate() {
try {
session.beginTransaction();
String hql = "from Student";
//第一次查询
List students = session.createQuery(hql).list();
for(Student student : students) {
System.out.println(student);
}
//第二次查询
Iterator it2 = session.createQuery(hql).iterate();
while(it2.hasNext()) {
Student student = it2.next();
System.out.println(student);
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
2.12 命名查询namedQuery
所谓namedQuery,是指HQL语句不直接写在Java代码中,而写入到映射文件。Java代码从映射文件中将被命名的HQL,通过名称读出执行。
将HQL写入到配置文件中的好处是,在项目真正上线后,若只需要修改HQL就可进行检索优化,则需修改配置文件中的HQL后,重启服务器即可,无需再次编译项目。
在映射文件中通过通过命名定义HQL,该标签写到哪个映射文件均可。 from Student where id = ?
java代码中通过Sesion的getNamedQuery()方法可以将映射文件中指定的HQL读取出来。
//命名查询
@Test
public void test12() {
try {
session.beginTransaction();
Student student = (Student) session.getNamedQuery("queryById").setInteger(0, 5).uniqueResult();
System.out.println(student);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
你可能感兴趣的:(Query接口,SQLQuery接口,Criteria接口,javaFrame)
芯麦GC8418:高性能数字音频信号接收与转换电路
青牛科技实业01
GLOBALCHIP 单片机 嵌入式硬件 音频处理器 笔记本电脑 科技
在数字音频领域,随着技术的不断进步,音频设备对信号接收和转换的要求越来越高。芯麦GC8418作为一款高性能的数字音频信号接收与转换电路,凭借其强大的功能和广泛的接口支持,成为音频设备设计中的理想选择。1.芯片概述GC8418是一款数字音频信号的CMOS单片接收与转换电路,具有八选一输入功能,支持多种主流音频接口标准,包括IEC60958、S/PDIF、EIAJCP1201和AES3。此外,该芯片集
挖数据平台对接DeepSeek推出一键云端部署功能:API接口驱动金融、汽车等行业智能化升级
wapi-API接口
挖数据 API 接口 金融 汽车 php python java 人工智能
云端部署引言:当数据生产力遇上云端智能化2025年2月23日,国内领先的数据服务商挖数据平台宣布与人工智能巨头DeepSeek达成战略合作,正式推出“一键云端部署”功能。这一功能以API(应用程序接口)为核心,通过云端自动化配置能力,将企业数据服务的部署周期从数周缩短至分钟级,标志着数据服务行业正式迈入“开箱即用”的智能化时代。在金融风控、汽车智能驾驶、供应链管理等场景中,API正成为驱动行业数字
Day54(补)【AI思考】-SOA,Web服务以及无状态分步解析与示例说明
一个一定要撑住的学习者
# AI深度思考学习方法 前端 java 开发语言
文章目录**SOA,Web服务以及无状态**分步解析与示例说明**分步解析与示例说明****1.核心概念解析****2.为什么说SOA与Web服务是“正交的”?****3.架构风格vs.实现技术****4.接口(Interface)的核心作用****5.Web服务的“被认为”与“无状态”****6.SOA在单系统中的应用示例****7.总结:SOA与Web服务的关系**SOA,Web服务以及无状态
Java统一异常设计:优雅处理异常,提升代码质量
Jayden
初级程序员进阶 项目实战 java 统一异常处理
文章目录为什么需要统一异常设计?统一异常设计的核心思想实现统一异常设计的步骤1.定义ErrorCode接口2.实现模块化枚举用户模块错误码枚举订单模块错误码枚举3.定义顶层业务异常(BizException)4.全局异常处理器5.异常信息封装6.统一返回格式UML类图代码示例统一异常设计的优势总结在Java开发中,异常处理是保证程序健壮性和可维护性的重要环节。然而,如果没有统一的异常设计,代码中可
Linux安装部署nacos以及解决各种报错
学Java的小蛋黄
linux 运维 服务器 java 开发语言
运行环境:linux+jdk17+nacos2.2.31.nacos是什么Nacos是阿里巴巴开源的服务注册中心以及配置中心,Nacos干掉了SpringCloud的三大组件,分别是注册中心Eureka、服务配置Config,服务总线Bus。2.Nacos主要提供以下四大功能1.服务发现和服务健康监测Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康
Viewer.js----图片查看
小丸子灬
javascript 开发语言 ecmascript
Viewer.js是一个用于展示图片、视频等多媒体内容的轻量级JavaScript库,提供了现代的图片查看器功能,比如放大、缩小、旋转、拖动等操作,适用于浏览器中查看图片等资源。官网地址:Viewer.js详细说明:Viewer.js–强大的JS/jQuery图片查看器_dowebok.如何使用Viewer.js1.1引入Viewer.js首先,你需要在HTML页面中引入Viewer.js。你可以
云计算中的API网关是什么?为什么它很重要?
云上的阿七
云计算
在云计算架构中,API网关(APIGateway)是一个重要的组件,主要用于管理、保护和优化不同服务之间的接口(API)通信。简单来说,API网关就像是一个中介,它充当客户端和后端服务之间的“桥梁”,帮助路由、管理、监控、限流以及安全控制所有进出服务的API请求。API网关的工作原理API网关位于应用架构的前端,通常处理以下几项工作:路由请求:根据客户端发起的请求,API网关将其转发到适当的后端服
Flask应用开发综合示例——博客系统
Botiway
FlaskWeb python flask
下面是一个与前面不同的综合示例,展示如何使用Python+Flask+HTML+CSS+JavaScript+jQuery+Bootstrap+SQLAlchemy开发一个简单的博客系统。用户可以注册、登录、发布博客、查看博客列表以及删除自己的博客。1.项目结构blog_system/│├──app.py#Flask应用主文件├──models.py#SQLAlchemy模型定义├──requir
QueryRunner常用方法
Tirzano
java基础 queryRunner java queryRunner
maven依赖:commons-dbutilscommons-dbutils1.6http://commons.apache.org/proper/commons-dbutils/api文档http://commons.apache.org/proper/commons-dbutils/apidocs/index.html查询SQL没参数publicstaticvoidmain(String[]a
JavaAPI(lambda表达式、流式编程)
NGC2237999
java 算法 开发语言
Lambda表达式本质上就是匿名内部类的简写方式(匿名内部类见:JAVA面向对象3(抽象类、接口、内部类、枚举)-CSDN博客)该表达式只能作用于函数式接口,函数式接口就是只有一个抽象方法的接口。可以使用注解@FunctionalInterface来验证publicclassLambdaDemo01{publicstaticvoidmain(String[]args){//InterAx=(int
【ABAP——面向对象】
irisawy
SAP-ABAP 开发语言 笔记 数据库
文章目录面向对象开发特点类和对象类的创建CLASS构成要素对象方法构造方法类的继承抽象类最终类接口事件从SAPR/34.0版本开始,ABAP就引入了面向对象的开发概念。ABAP语言的发展宏编译器ABAP语言出现-面向过程ABAP语言-面向对象(Object-oriented)•ABAP对象是ABAP的扩展,集合了Java,C++,Smalltalk等语言的特点,和原来的ABAP无缝集成面向对象解决
Spring Boot 如何保证接口安全
坚定信念,勇往无前
java spring boot 安全 后端
SpringBoot如何保证接口安全,需要架构设计、示例代码以及系统逻辑分析。首先,我得考虑常见的接口安全措施,比如身份认证、权限控制、数据加密、防止常见攻击等。然后,要结合SpringBoot的功能来实现这些措施。首先,身份认证,通常用SpringSecurity或者OAuth2。SpringSecurity比较基础,适合大部分场景。可能用JWT来做无状态认证,这样适合分布式系统。然后权限控制,
鸿蒙开发实战:状态管理框架代理-getTarget接口详解
我很英俊 小名男男
鸿蒙开发 OpenHarmony HarmonyOS harmonyos 华为 开发语言 前端 鸿蒙 移动开发 鸿蒙系统
鸿蒙开发往期必看:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)“一杯冰美式的时间”了解鸿蒙HarmonyOSNext应用开发路径!概述状态管理框架会对Class、Date、Map、Set、Array类型的原始对象添加代理,用于观测属性变化与API调用。这一层代理会使得变量类型改变,在类型判断、NAP
C++面试笔记(持续更新...)
快下雨了L
C++ 笔记
1.C++的特性封装:将数据和具体实现在类中隐藏,对外只留出接口方便调用。继承:子类继承父类的方法和全部数据,提高软件按复用率多态:自继承的条件下,继承自同一父类的类的同一的方法对同一个事物具有不同的表现状态。2.C++中类和结构体的区别1.默认的访问权限不同:结构体是public,类是private2.概念上:结构体偏向于数据的集合,类偏向于数据和行为的集合3.C++重写,重载,重定义,隐藏重写
SpringBoot 接入 豆包 火山方舟大模型
java15655057970
面试 学习路线 阿里巴巴 spring boot 后端 java
火山方舟控制台开通模型推理、知识库应用入口;文档中心各类接口说明及SDK获取;向量数据库VikingDB文档下翻找到有java操作案例;实现目标功能效果:通过SDK调用豆包大模型,在代码内实现问答的效果;官方示例通过使用知识库,自己上传文档。让豆包大模型可以回答你文档中的内容数据(即自定义属于你自己(自身业务领域)的大模型);前置步骤:点击右上角头像处去创建API访问密钥;控制台内模型推理-在线推
Express + MongoDB 实现列表分页查询
yqcoder
express mongodb 数据库
使用`find`方法查询数据,结合`skip`和`limit`方法实现分页效果//分页查询路由app.get("/users",async(req,res)=>{ try{ //获取页码和每页数量,默认为第1页,每页10条记录 constpage=parseInt(req.query.page)||1; constlimit=parseInt(req.query.limit)||10; /
高密原型验证系统解决方案(上篇)
思尔芯S2C
fpga开发 FPGA原型验证 prototyping 设计分割 SoC设计 TDM 设计综合
0引言随着当今SoC设计规模的快速膨胀,仅仅靠几颗当代最先进的FPGA已经无法满足原型验证的需求。简单的增加系统的容量,会遇到系统时钟复位同步,设计分割以及高速接口和先进Memory控制器IP验证等多重困难。此时,一个商用成熟的能解决以上多重挑战的通用高密原型验证系统方案显得十分有必要。本文主要分析了用户在进行大规模SoC设计原型验证过程中在全局时钟及复位同步,大规模设计分割以及高速接口和先进Me
使用NodeJs(Express)搞定用户注册、登录、授权(一)
Amnesia�
mongodb nodejs
最近在学些NodeJs和Express框架开发后台接口,Express是一个保持最小规模的灵活的Node.jsWeb应用程序开发框架,为Web和移动应用程序提供一组强大的功能。看到B站上全栈之巅-Node.js+Vue.js全栈开发深度爱好者和实践者,感觉Johnny博主的系列视频讲解得不错,其中看到一个视频是1小时搞定NodeJs(Express)的用户注册、登录和授权,介绍了在Express中
深入浅出微服务基础设施:服务发现的设计与实现
微服务架构
服务发现是微服务架构中的一个核心组件,它允许服务实例在启动时向注册中心注册自己的元数据,如网络地址、服务名称和标签等。这些信息使得其他服务能够发现并与之通信,从而实现服务间的动态解耦和高效协作。在本文中,我们将深入探讨服务发现的客户端接口设计。服务发现的客户端接口通常包括注册、注销和查询服务实例的方法。服务注册是服务实例将自己信息注册到注册中心的过程,注销则是服务实例在停止时从注册中心删除自己的信
QGroundControl@Jetson Orin Nano for L4T36.4.0/JP6.1
lida2003
Linux DIY Drones 开源 QGC
QGroundControl@JetsonOrinNanoforL4T36.4.0/JP6.11.源由2.准备2.1扩大虚拟内存2.2升级cmake版本2.3QT编译安装3.QGC编译安装4.问题汇总问题1:QNativeInterface::QX11Application接口问题问题2:RTP视频播放问题1.源由最近还是越来越有QGC最新版本在JetsonOrinNanoforL4T36.4.0
node.js+mongodb
猫咪大大
mongodb express jquery node.js ui
安装:Node.js:0.10.32Express:4.10.2MongoDB:2.6.1sublime3过程中要用到的东西amazeui前端框架,放在public文件夹下与其他并列vue和jquery:vue.js,jquery-2.1.4.min.js,JSXTranformer.js放在javascripts里安装的包有:"async":"^1.5.0","bluebird":"^3.3.5
[15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
明月醉窗台
CUDA - Opencv 计算机视觉 opencv 人工智能 图像处理 CUDA
使用Opencv_CUDA模块实现基本计算机视觉程序CUDA提供了出色的接口,发挥GPU的并行计算能力来加速复杂的计算应用程序利用CUDA和Opencv的功能实现计算机视觉应用1.对图像的算术和逻辑运算两个图像相加#include#include"opencv2/opencv.hpp"#include
python14-元组
文人sec
python自动化 c++ 开发语言
课程:B站大学记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化字符串那些事儿元组的定义元组的字面量定义元组的构造方法定义元组中元素的引用元组的切片操作元组的特点元组的应用场景元组的常用方法实践是检验真理的唯一标准#什么是元组元组是一种数据类型,在Python中用于存储多个元素。元组可以容纳多个值,但它们有一些重要的特点。元
如何在docker中访问宿主机其他服务的接口
2401_89793006
热门话题 docker 容器 运维
1.使用host.docker.internal(推荐)适用场景:DockerDesktop(Windows和macOS)或DockerEngine18.03+(Linux)。原理:Docker提供了一个特殊的主机名host.docker.internal,指向宿主机。使用方法:在容器中访问宿主机服务时,使用host.docker.internal代替localhost或127.0.0.1。例如,
python15-列表
文人sec
python自动化 python 数据库 redis 缓存 fastapi
课程:B站大学记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化列表那些事儿什么是列表列表的特点列表的定义字面量定义列表的构造方法定义列表中元素的引用列表中元素的修改列表的切片操作列表的用途列表操作获取列表元素个数统计查找操作增加元素删除元素列表排序元组和列表的区别相同点不同点内存占用实践是检验真理的唯一标准什么是列表列表是
驱动:gpio子系统
¥ 多多¥
c++ 驱动开发 嵌入式硬件
通过GPIO子系统接口完成LED驱动的编写,编写应用程序控制灯亮灭(流水灯)驱动程序#include#include#include#include#include#include"led.h"unsignedintmajor;//主设备号structclass*cls;//类指针structdevice*dev;//设备指针structdevice_node*np;//设备树节点指针//stru
Windows.h 是什么?
code_stream
# Windows 程序设计 windows
认识Windows.h在C++中,进行Windows开发通常使用的库是windows.h这是Windows平台特有的一个头文件,它包含了WindowsAPI(应用程序接口)的声明和定义,允许开发者编写与Windows操作系统交互的程序。windows.h是一个包含大量Windows平台特有的数据类型、宏、函数原型、结构等声明的头文件。通过这个头文件,你可以访问WindowsAPI,用于执行各种任务
MyBatisPlus实现多表查询
先睡
mybatis java 开发语言
在MyBatisPlus中实现多表查询,主要有以下几种方法:使用注解进行多表查询:你可以在Mapper接口中使用@Select注解来编写SQL查询语句,实现多表查询。例如,如果你想根据用户ID查询用户信息和对应的区域名称,可以这样写:@Select("SELECTuser.*,area.area_nameFROMuser,areaWHEREuser.area_id=area.idANDuser.i
嵌入式Modbus协议面试题及参考答案
大模型大数据攻城狮
嵌入式面试 嵌入式硬件 总线协议 Modbus 半双工通信 全双工通信 物联网
目录Modbus协议诞生的背景及主要解决的问题是什么?Modbus协议的主从模式如何定义?从机能否主动发送数据?Modbus支持的物理层接口有哪些?简述ModbusASCII与RTU模式的主要区别。ModbusTCP与RTU在协议栈上的核心差异是什么?ModbusPlus协议的特点及适用场景?解释Modbus协议中“开放式协议”的含义及其优势。为什么Modbus协议在工业领域广泛应用?列举至少3个
Java 反射 (Reflection) 详解
冰糖心书房
Java 开发 java
一、什么是Java反射?Java反射(Reflection)是Java语言的一个强大特性,它允许在运行时检查和修改类、接口、字段和方法的信息,而不需要在编译时知道这些信息。换句话说,反射可以让你在程序运行过程中“动态”地获取类的信息并操作类的成员。核心概念:Class对象:每个Java类都有一个与之对应的Class对象。Class对象包含了该类的所有信息,例如类名、包名、父类、接口、字段、方法、构
java观察者模式
3213213333332132
java 设计模式 游戏 观察者模式
观察者模式——顾名思义,就是一个对象观察另一个对象,当被观察的对象发生变化时,观察者也会跟着变化。
在日常中,我们配java环境变量时,设置一个JAVAHOME变量,这就是被观察者,使用了JAVAHOME变量的对象都是观察者,一旦JAVAHOME的路径改动,其他的也会跟着改动。
这样的例子很多,我想用小时候玩的老鹰捉小鸡游戏来简单的描绘观察者模式。
老鹰会变成观察者,母鸡和小鸡是
TFS RESTful API 模拟上传测试
ronin47
TFS RESTful API 模拟上传测试。
细节参看这里:https://github.com/alibaba/nginx-tfs/blob/master/TFS_RESTful_API.markdown
模拟POST上传一个图片:
curl --data-binary @/opt/tfs.png http
PHP常用设计模式单例, 工厂, 观察者, 责任链, 装饰, 策略,适配,桥接模式
dcj3sjt126com
设计模式 PHP
// 多态, 在JAVA中是这样用的, 其实在PHP当中可以自然消除, 因为参数是动态的, 你传什么过来都可以, 不限制类型, 直接调用类的方法
abstract class Tiger {
public abstract function climb();
}
class XTiger extends Tiger {
public function climb()
hibernate
171815164
Hibernate
main,save
Configuration conf =new Configuration().configure();
SessionFactory sf=conf.buildSessionFactory();
Session sess=sf.openSession();
Transaction tx=sess.beginTransaction();
News a=new
Ant实例分析
g21121
ant
下面是一个Ant构建文件的实例,通过这个实例我们可以很清楚的理顺构建一个项目的顺序及依赖关系,从而编写出更加合理的构建文件。
下面是build.xml的代码:
<?xml version="1
[简单]工作记录_接口返回405原因
53873039oycg
工作
最近调接口时候一直报错,错误信息是:
responseCode:405
responseMsg:Method Not Allowed
接口请求方式Post.
关于java.lang.ClassNotFoundException 和 java.lang.NoClassDefFoundError 的区别
程序员是怎么炼成的
真正完成类的加载工作是通过调用 defineClass来实现的;
而启动类的加载过程是通过调用 loadClass来实现的;
就是类加载器分为加载和定义
protected Class<?> findClass(String name) throws ClassNotFoundExcept
JDBC学习笔记-JDBC详细的操作流程
aijuans
jdbc
所有的JDBC应用程序都具有下面的基本流程: 1、加载数据库驱动并建立到数据库的连接。 2、执行SQL语句。 3、处理结果。 4、从数据库断开连接释放资源。
下面我们就来仔细看一看每一个步骤:
其实按照上面所说每个阶段都可得单独拿出来写成一个独立的类方法文件。共别的应用来调用。
1、加载数据库驱动并建立到数据库的连接:
Html代码
St
rome创建rss
antonyup_2006
tomcat cms xml struts Opera
引用
1.RSS标准
RSS标准比较混乱,主要有以下3个系列
RSS 0.9x / 2.0 : RSS技术诞生于1999年的网景公司(Netscape),其发布了一个0.9版本的规范。2001年,RSS技术标准的发展工作被Userland Software公司的戴夫 温那(Dave Winer)所接手。陆续发布了0.9x的系列版本。当W3C小组发布RSS 1.0后,Dave W
html表格和表单基础
百合不是茶
html 表格 表单 meta 锚点
第一次用html来写东西,感觉压力山大,每次看见别人发的都是比较牛逼的 再看看自己什么都还不会,
html是一种标记语言,其实很简单都是固定的格式
_----------------------------------------表格和表单
表格是html的重要组成部分,表格用在body里面的
主要用法如下;
<table>
&
ibatis如何传入完整的sql语句
bijian1013
java sql ibatis
ibatis如何传入完整的sql语句?进一步说,String str ="select * from test_table",我想把str传入ibatis中执行,是传递整条sql语句。
解决办法:
<
精通Oracle10编程SQL(14)开发动态SQL
bijian1013
oracle 数据库 plsql
/*
*开发动态SQL
*/
--使用EXECUTE IMMEDIATE处理DDL操作
CREATE OR REPLACE PROCEDURE drop_table(table_name varchar2)
is
sql_statement varchar2(100);
begin
sql_statement:='DROP TABLE '||table_name;
【Linux命令】Linux工作中常用命令
bit1129
linux命令
不断的总结工作中常用的Linux命令
1.查看端口被哪个进程占用
通过这个命令可以得到占用8085端口的进程号,然后通过ps -ef|grep 进程号得到进程的详细信息
netstat -anp | grep 8085
察看进程ID对应的进程占用的端口号
netstat -anp | grep 进程ID
&
优秀网站和文档收集
白糖_
网站
集成 Flex, Spring, Hibernate 构建应用程序
性能测试工具-JMeter
Hmtl5-IOCN网站
Oracle精简版教程网站
鸟哥的linux私房菜
Jetty中文文档
50个jquery必备代码片段
swfobject.js检测flash版本号工具
angular.extend
boyitech
AngularJS angular.extend AngularJS API
angular.extend 复制src对象中的属性去dst对象中. 支持多个src对象. 如果你不想改变一个对象,你可以把dst设为空对象{}: var object = angular.extend({}, object1, object2). 注意: angular.extend不支持递归复制. 使用方法: angular.extend(dst, src); 参数:
java-谷歌面试题-设计方便提取中数的数据结构
bylijinnan
java
网上找了一下这道题的解答,但都是提供思路,没有提供具体实现。其中使用大小堆这个思路看似简单,但实现起来要考虑很多。
以下分别用排序数组和大小堆来实现。
使用大小堆:
import java.util.Arrays;
public class MedianInHeap {
/**
* 题目:设计方便提取中数的数据结构
* 设计一个数据结构,其中包含两个函数,1.插
ajaxFileUpload 针对 ie jquery 1.7+不能使用问题修复版本
Chen.H
ajaxFileUpload ie6 ie7 ie8 ie9
jQuery.extend({
handleError: function( s, xhr, status, e ) {
// If a local callback was specified, fire it
if ( s.error ) {
s.error.call( s.context || s, xhr, status, e );
}
[机器人制造原则]机器人的电池和存储器必须可以替换
comsci
制造
机器人的身体随时随地可能被外来力量所破坏,但是如果机器人的存储器和电池可以更换,那么这个机器人的思维和记忆力就可以保存下来,即使身体受到伤害,在把存储器取下来安装到一个新的身体上之后,原有的性格和能力都可以继续维持.....
另外,如果一
Oracle Multitable INSERT 的用法
daizj
oracle
转载Oracle笔记-Multitable INSERT 的用法
http://blog.chinaunix.net/uid-8504518-id-3310531.html
一、Insert基础用法
语法:
Insert Into 表名 (字段1,字段2,字段3...)
Values (值1,
专访黑客历史学家George Dyson
datamachine
on
20世纪最具威力的两项发明——核弹和计算机出自同一时代、同一群年青人。可是,与大名鼎鼎的曼哈顿计划(第二次世界大战中美国原子弹研究计划)相 比,计算机的起源显得默默无闻。出身计算机世家的历史学家George Dyson在其新书《图灵大教堂》(Turing’s Cathedral)中讲述了阿兰·图灵、约翰·冯·诺依曼等一帮子天才小子创造计算机及预见计算机未来
小学6年级英语单词背诵第一课
dcj3sjt126com
english word
always 总是
rice 水稻,米饭
before 在...之前
live 生活,居住
usual 通常的
early 早的
begin 开始
month 月份
year 年
last 最后的
east 东方的
high 高的
far 远的
window 窗户
world 世界
than 比...更
在线IT教育和在线IT高端教育
dcj3sjt126com
教育
codecademy
http://www.codecademy.com codeschool
https://www.codeschool.com teamtreehouse
http://teamtreehouse.com lynda
http://www.lynda.com/ Coursera
https://www.coursera.
Struts2 xml校验框架所定义的校验文件
蕃薯耀
Struts2 xml校验 Struts2 xml校验框架 Struts2校验
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年7月11日 15:54:59 星期六
http://fa
mac下安装rar和unrar命令
hanqunfeng
mac
1.下载:http://www.rarlab.com/download.htm 选择
RAR 5.21 for Mac OS X 2.解压下载后的文件 tar -zxvf rarosx-5.2.1.tar 3.cd rar sudo install -c -o $USER unrar /bin #输入当前用户登录密码 sudo install -c -o $USER rar
三种将list转换为map的方法
jackyrong
list
在本文中,介绍三种将list转换为map的方法:
1) 传统方法
假设有某个类如下
class Movie {
private Integer rank;
private String description;
public Movie(Integer rank, String des
年轻程序员需要学习的5大经验
lampcy
工作 PHP 程序员
在过去的7年半时间里,我带过的软件实习生超过一打,也看到过数以百计的学生和毕业生的档案。我发现很多事情他们都需要学习。或许你会说,我说的不就是某种特定的技术、算法、数学,或者其他特定形式的知识吗?没错,这的确是需要学习的,但却并不是最重要的事情。他们需要学习的最重要的东西是“自我规范”。这些规范就是:尽可能地写出最简洁的代码;如果代码后期会因为改动而变得凌乱不堪就得重构;尽量删除没用的代码,并添加
评“女孩遭野蛮引产致终身不育 60万赔偿款1分未得”医腐深入骨髓
nannan408
先来看南方网的一则报道:
再正常不过的结婚、生子,对于29岁的郑畅来说,却是一个永远也无法实现的梦想。从2010年到2015年,从24岁到29岁,一张张新旧不一的诊断书记录了她病情的同时,也清晰地记下了她人生的悲哀。
粗暴手术让人发寒
2010年7月,在酒店做服务员的郑畅发现自己怀孕了,可男朋友却联系不上。在没有和家人商量的情况下,她决定堕胎。
12月5日,
使用jQuery为input输入框绑定回车键事件 VS 为a标签绑定click事件
Everyday都不同
jsp input 回车键绑定 click enter
假设如题所示的事件为同一个,必须先把该js函数抽离出来,该函数定义了监听的处理:
function search() {
//监听函数略......
}
为input框绑定回车事件,当用户在文本框中输入搜索关键字时,按回车键,即可触发search():
//回车绑定
$(".search").keydown(fun
EXT学习记录
tntxia
ext
1. 准备
(1) 官网:http://www.sencha.com/
里面有源代码和API文档下载。
EXT的域名已经从www.extjs.com改成了www.sencha.com ,但extjs这个域名会自动转到sencha上。
(2)帮助文档:
想要查看EXT的官方文档的话,可以去这里h
mybatis3的mapper文件报Referenced file contains errors
xingguangsixian
mybatis
最近使用mybatis.3.1.0时无意中碰到一个问题:
The errors below were detected when validating the file "mybatis-3-mapper.dtd" via the file "account-mapper.xml". In most cases these errors can be d