一、Service处理
概念:Service(Biz) 业务层 用户完成的一个功能,操作 就是业务。
业务的完成都是靠调用DAO中的方法。
可能调用一个DAO中的多个方法,可能调用多个DAO中的多个方法
二:先创建表:
create table emp(
id number(10) primary key,
name varchar2(30),
salary number(10,2),
age number(3)
)
三:创建实体类:用来映射建立的数据库
public class Emp {
private int id;
private String name;
private double salary;
private int age;
}
在这里书写属性的get、set方法以及有参无参构造函数
四:书写dao层:步骤:先写增删改查的接口。再实现接口
接口的好处:
public interface EmpDAO {
//插入员工信息
public void insertEmp(Emp emp);
//删除员工
public void deleteEmp(int id);
//修改员工信息
public void updateEmp(Emp emp);
//查询所有员工
public List<Emp> selectAllEmps();
//模糊查询
public Emp fuzzySelect(int id);
//模糊查询
List<Emp> selectByKey(String name);
//分页查询
List<Emp> selectByPage(int pageIndex);
}
实现接口:
先实现dao接口 然后在实现的接口中书写实现的代码
该代码是基础代码 是可以优化的
public class EmpDAOImpl implements EmpDAO{
@Override
public void insertEmp(Emp emp) {
Connection conn = null;
PreparedStatement pstm = null;
try{
conn = JDBCUtil.getConnection();
String sql="insert into emp values(?,?,?,?)";
pstm = conn.prepareStatement(sql);
pstm.setInt(1, emp.getId());
pstm.setString(2,emp.getName());
pstm.setDouble(3, emp.getSalary());
pstm.setInt(4, emp.getAge());
pstm.executeUpdate();
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("注册员工出现异常");
}finally{
JDBCUtil.close(null, pstm);
}
}
@Override
public void deleteEmp(int id) {
Connection conn = null;
PreparedStatement pstm = null;
try{
conn = JDBCUtil.getConnection();
String sql="delete from emp where id=?";
pstm = conn.prepareStatement(sql);
pstm.setInt(1, id);
pstm.executeUpdate();
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("删除员工DAO出现异常");
}finally{
JDBCUtil.close(null, pstm);
}
}
@Override
public void updateEmp(Emp emp) {
Connection conn = null;
PreparedStatement pstm = null;
try{
conn = JDBCUtil.getConnection();
String sql="update emp set name=?,salary=?,age=? where id=?";
pstm = conn.prepareStatement(sql);
pstm.setString(1, emp.getName());
pstm.setDouble(2, emp.getSalary());
pstm.setInt(3, emp.getAge());
pstm.setInt(4, emp.getId());
pstm.executeUpdate();
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("修改DAO出现异常");
}finally{
JDBCUtil.close(null, pstm);
}
}
@Override
public List<Emp> selectAllEmps() {
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
List<Emp> emps = new ArrayList<Emp>();
try{
conn = JDBCUtil.getConnection();
String sql="select * from emp";
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
while(rs.next()){
Emp emp = new Emp();
emp.setId(rs.getInt(1));
emp.setName(rs.getString(2));
emp.setSalary(rs.getDouble(3));
emp.setAge(rs.getInt(4));
emps.add(emp);
}
return emps;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("查询所有DAO出现异常");
}finally{
JDBCUtil.close(conn, pstm, rs);
}
}
public Emp fuzzySelect(int id){
Connection conn=null;
PreparedStatement psmt=null;
ResultSet rs=null;
try{
conn = JDBCUtil.getConnection();
String sql="select * from stu where id=?";
psmt=conn.prepareStatement(sql);
psmt.setInt(1, id);
rs=psmt.executeQuery();
Emp e = new Emp();
while(rs.next()){
e.setId(rs.getInt(1));
e.setName(rs.getString(2));
e.setSalary(rs.getDouble(3));
e.setAge(rs.getInt(4));
}
return e;
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
JDBCUtil.close(conn, psmt,rs);
}
}
@Override
public List<Emp> selectByKey(String name) {
Connection conn=null;
PreparedStatement psmt=null;
ResultSet rs=null;
try{
conn=JDBCUtil.getConnection();
String sql="select * from emp where name like ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1,"%"+name+"%" );
rs = psmt.executeQuery();
List<Emp> list = new ArrayList<Emp>();
while(rs.next()){
Emp employees = new Emp();
employees.setId(rs.getInt(1));
employees.setName(rs.getString(2));
employees.setSalary(rs.getDouble(3));
employees.setAge(rs.getInt(4));
list.add(employees);
}
return list;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
@Override
public List<Emp> selectByPage(int pageIndex) {
Connection conn=null;
PreparedStatement pamt=null;
ResultSet rs=null;
try{
conn=JDBCUtil.getConnection();
String sql="select * from(select t.*,rownum as rn from telbook t) where rn >= ? and rn<= ? ";
pamt=conn.prepareStatement(sql);
pamt.setInt(1,(pageIndex-1)*3+1);
pamt.setInt(2,pageIndex*3);
rs=pamt.executeQuery();
List<Emp> list = new ArrayList<Emp>();
while(rs.next()){
Emp employees = new Emp();
employees.setId(rs.getInt(1));
employees.setName(rs.getString(2));
employees.setSalary(rs.getDouble(3));
employees.setAge(rs.getInt(4));
list.add(employees);
}
return list;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("查询异常");
}finally{
JDBCUtil.close(conn, pamt, rs);
}
}
}
五:dao层写完之后就要书写service层了
和上面步骤一样 先书写接口
public interface EmpService {
//添加员工信息
public void AddEmp(Emp es);
//删除员工信息
public void removeEmp(int id);
//修改员工信息
public void modifyEmp(Emp emp);
//查询所有员工
public List<Emp> queryAll();
//模糊查询
List<Emp> selectByKey(String name);
//分页查询
List<Emp> selectByPage(int pageIndex);
}
然后实现service接口
public class EmpServiceImpl implements EmpService{
private EmpDAO ed = new EmpDAOImpl();
@Override
public void AddEmp(Emp emp) {
try{
TransactionManager.begin();
ed.insertEmp(emp);
TransactionManager.commit();
}catch(Exception e){
e.printStackTrace();
TransactionManager.rollback();
}
}
@Override
public void removeEmp(int id) {
try{
TransactionManager.begin();
ed.deleteEmp(id);
TransactionManager.commit();
}catch(Exception e){
e.printStackTrace();
TransactionManager.rollback();
}
}
//修改信息
@Override
public void modifyEmp(Emp emp) {
try{
TransactionManager.begin();
ed.updateEmp(emp);
TransactionManager.commit();
}catch(Exception e){
e.printStackTrace();
TransactionManager.rollback();
}
}
@Override
public List<Emp> queryAll() {
return ed.selectAllEmps();
}
@Override
public List<Emp> selectByKey(String name) {
List<Emp> list = ed.selectByKey(name);
return list;
}
@Override
public List<Emp> selectByPage(int pageIndex) {
List<Emp> list = ed.selectByPage(pageIndex);
return list;
}
}
到这里就书写完成了,但是注意的是:在实现service接口的时候用了事务
以下是事务实现的代码
六:事务的意义和好处
Service中的事务
Oracle:保证数据一致性 事务:保证一组sql语句执行的完整性 一起成功或失败
Service:保证业务操作的完整性。
保证实现业务的一组DAO方法要不一起成功,要不一起失败。
事务控制的位置:在Service的方法中
事务控制的方式:
JDBC默认的事务控制:自动提交 不建议使用容易出错
手工事务控制:不自动提交 换成手工控制
关闭原有的自动提交:Connection.setAutoCommit(false);
手工提交:Connection.commit();
手工回滚:Connection.rollback();
注意:
增删改操作,要进行事务控制
查询操作可以控制也可以不控制 建议不控制