进行了一周的岗前培训,特到这来总结一下这周学的内容。
本周主要学了iBatis,SQL和TA3(公司自己封装的框架)的jsp页面组件。我在想是分开写还是写在一起,鉴于是总结本周培训的相关知识,所以还是写在一起吧~
iBatis
iBatis是一款使用方便的数据访问工具,也可作为数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。相对于全自动SQL的Hibernate,iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。
iBatis在idea配置普通项目的过程就略过了,遇到问题最大的还是老师最后留给我们的将ibatis配置到Web项目中去,那么就大概描述以下,这中间遇到的一系列的坑。
- 在idea中创建web项目,配置过程略过
- 导入iBatis必要的jar包。主要的jar包主要如下:
在这里注意ojdbc6这个jar包,我在这里踩了坑,具体的错误显示如下:
ORA-28040: No matching authentication protocol(没有匹配的身份验证协议)
具体的解决办法见下。 - 创建与数据库表相对应的实体类,比如我创建的account类,其中包含了表中的所需的字段,代码如下:
package com.yinhai.domain;
public class Account {
private int id;
private String firstName;
private String lastName;
private String emailAddress;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
@Override
public String toString() {
return "Account [id=" + id + ", FirstName=" + firstName + ", LastName=" + lastName + "Email" +
emailAddress + "]";
}
}
- 创建iBatis的配置文件
SqlMapConfig.xml:顾名思义,就是数据库映射配置文件,即配置数据库连接环境,iBatis使用type="SIMPLE"来获取数据库环境
- 创建iBatis的实体与映射关系文件
insert into ACCOUNT (
ACC_ID,
ACC_FIRST_NAME,
ACC_LAST_NAME,
ACC_EMAIL
)
values (
#id#,
#firstName#,
#lastName#,
#emailAddress#
)
update ACCOUNT set
ACC_FIRST_NAME = #firstName#,
ACC_LAST_NAME = #lastName#,
ACC_EMAIL = #emailAddress#
where
ACC_ID = #id#
delete from ACCOUNT where ACC_ID = #id#
- 现在我们已经有了Mybatis的配置文件和表与实体之前的映射文件了,因此我们要将配置文件和映射文件关联起来
下面这个代码将添加至SqlMapConfig.xml文件中
- 在test包中创建工具测试类SimpleExample,static静态语句块通过配置文件和数据库的信息,获取sqlMapper,通过sqlMapper中的数据操纵函数来对数据库进行操作。
package com.yinhai.test;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.common.resources.Resources;
import com.yinhai.domain.Account;
import java.io.Reader;
import java.io.IOException;
import java.util.List;
import java.sql.SQLException;
/**
* This is not a best practices class. It's just an example
* to give you an idea of how iBATIS works. For a more complete
* example, see JPetStore 5.0 at http://www.ibatis.com.
*/
public class SimpleExample {
/**
* SqlMapClient instances are thread safe, so you only need one.
* In this case, we'll use a static singleton. So sue me. ;-)
*/
private static SqlMapClient sqlMapper;
/**
* It's not a good idea to put code that can fail in a class initializer,
* but for sake of argument, here's how you configure an SQL Map.
*/
static {
try{
Reader reader = Resources.getResourceAsReader("resources/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// Fail fast.
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
public static List selectAllAccounts () throws SQLException {
return sqlMapper.queryForList("selectAllAccounts");
}
public static Account selectAccountById (int id) throws SQLException {
return (Account) sqlMapper.queryForObject("selectAccountById", id);
}
public static void insertAccount (Account account) throws SQLException {
sqlMapper.insert("insertAccount", account);
}
public static void updateAccount (Account account) throws SQLException {
sqlMapper.update("updateAccount", account);
}
public static void deleteAccount (int id) throws SQLException {
sqlMapper.delete("deleteAccount", id);
}
}
至此,我们就把iBatis的环境配置完毕,下面我们就可以将其与web结合,将数据显示在网页上,用到的方法就是简单的servlet
- 创建ServletDemo类来将数据呈现在web页面上即可,代码如下:
package com.yinhai.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;
@WebServlet("/example")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
try{
List list = SimpleExample.selectAllAccounts();
out.println(list.toString());
}catch (SQLException e){
e.printStackTrace();
}
}
}
运行效果如图:
这个是对上文的ORA-28040: No matching authentication protocol(没有匹配的身份验证协议)进行解释:
问题描述:尝试利用ojdbc6来连接oracle12c数据库时发生该问题
网络上的解决方法,参见网址:
http://logic.edchen.org/how-to-resolve-ora-28040-no-matching-authentication-protocol/
发生该错误的原因:
There was no acceptable authentication protocol for either client or server.
版本之间可能存在一些互操作性问题,特别是当版本差距很大时。管理员应将客户端和服务器上的SQLNET.ALLOWED_LOGON_VERSION_SERVER和SQLNET. ALLOWED_LOGON_VERSION_CLIENT参数的值设置为与系统中支持的最低版本软件匹配的值。
当客户端对没有适用于客户端软件版本的验证器创建的用户帐户进行身份验证时,也会引发此错误ORA-28040。在这种情况下,必须重置该帐户的密码,以便生成所需的验证程序并允许验证成功进行。
应该使用SQLNET.ALLOWED_LOGON_VERSION_SERVER与身份验证协议的两端兼容。
使用该命令的目的在于设置连接到Oracle数据库实例时允许的最低身份验证协议。
使用说明:参数名称中的version指的是身份验证协议的版本,不是Oracle数据库版本
如果客户端版本不满足或者超过此参数定义的值,就会报出ORA-28040: No matching authentication protocol error 或者 ORA-03134: Connections to this server version are no longer supported error.
1.试图将ojdbc6换成ojdbc8 ---> 调试失败
2.在sqlnet.ora配置文件中加入SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
----> 成功
Oracle相关
培训老师只需让我掌握具体的sql的查询语句,即数据操纵语言(DML)。关于DDL等其他语言不重点掌握,想来也是,公司部门分工明确,我的岗位是java开发工程师,并非数据库管理员,建立用户,表信息等工作并非我等需要掌握的技能。但是个人觉得还是不能荒废触发器,试图,索引等相关知识,所以必须有空将其掌握熟悉,以便于整个职业生涯的发展。
由于主要学习的是SQL查询语句,所以将比较难的查询语句贴上来,以便后续的复习
题目1:查询scott用户下的所有表
答案:
select * from tabs
题目6:查询所有雇员编号,姓名,工作.按以下格式显示:编号:7369,姓名:SMITH,工作:CLERK
答案:
select '编号:'||empno || ',姓名:'||ename || ',工作:'||job from emp
题目14:查询在1981年雇用的员工信息
答案:
除了利用extract(year from hiredate)也可以用to_char(hiredate,’YYYY’)
select * from emp where extract(year from hiredate)=1981
题目43:找出早于12年前受雇的员工信息
答案:months_between(sysdate-hiredate)/12
select * from emp where (sysdate - hiredate)/365 >=12
题目44:以首字母大写的方式显示所有员工的姓名
答案:
select upper(substr(ename,1,1)) || lower (substr(ename,2,length(ename)-1)) from emp
题目65:创建报告,显示员工名和奖金系数,如果奖金系数为空,则显示"无奖金"
答案:
select ename,decode(comm,'','无奖金',comm) from emp;
解释:如果comm是null,则返回无奖金,不是null就返回奖金的数目
- decode函数
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值),这行代码就是decode全部的精髓以及用法。
该函数的含义如下:
IF 条件=值1 THEN RETURN(返回值1)
ELS IF 条件=值2 THEN RETURN(返回值2)
......
ELSIF 条件=值n THEN RETURN(返回值n)
ELSE RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多
下面举两个栗子:
栗子1:
你要统计students表中,男生女生的数量:
传统写法如下:
select count() from students where 性别 = 男;
select count() from students where 性别 = 女;
然后使用Union连接,得到最终的统计结果。
现在你只需要这样来写:
select decode(性别,男,1,0),decode(性别,女,1,0) from students
题目67:请使用decode语句,查询员工的job_id和级别.例如:
Job Grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
None of the above 0
答案:
select job,decode(job,
'CLERK','E',
'SALESMAN','D',
'ANALYST','C',
'MANAGER','B',
'PRESIDENT','A',
'0')
from emp;
题目68:请使用case语句,查询员工的job_id和级别.例如:
Job Grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
None of the above 0
答案:
SELECT job_id, CASE job_id
WHEN 'ST_CLERK' THEN 'E'
WHEN 'SA_REP' THEN 'D'
WHEN 'IT_PROG' THEN 'C'
WHEN 'ST_MAN' THEN 'B'
WHEN 'AD_PRES' THEN 'A'
ELSE '0' END GRADE
from employees;
题目78:查询每个部门中工资最高的雇员姓名,工作,工资,部门名称,最后按工资从高到低排序,工资相同的情况下按姓名排升序
答案:
select e.ename,e.job,e.sal,d.dname
from emp e,dept d,(select max(e.sal) sal
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno) temp
where e.deptno=d.deptno and e.sal=temp.sal
order by e.sal desc;
题目81:按部门分组,并显示部门的名称,以及每个部门的员工数
答案:
select d.dname,count(e.empno)
from dept d left join emp e
on e.deptno=d.deptno
group by e.deptno,d.dname;
TA3Cloud具体学习
今天刚开头,仅仅学了jsp页面组件,后续在更新