JDBC常用接口+PreparedStatement的使用+PreparedStatement防止SQL注入+JdbcUtil工具类+事务解决转账问题+MVC分层

1.JDBC常用接口

PreparedStatement : 它是Statement接口的子接口,用来执行预编译的SQL语句,它是通过调用Connection对象的prepareStatement方法获取的
PreparedStatement prepareStatement(String sql)throws SQLException;
预编译的SQL:当调用Connection的prepareStatement方法就传入了sql语句,然后将SQL语句发送到服务器端进行编译,在未调用executeQuery()或executeUpdate()方法前就已经编译了。只编译一次,以后可以重复使用该sql,只需要改变sql中的参数就可以了

Statement对象是调用Connection的createStatement()方法获取的,在调用executeQuery()或executeUpdate()方法时才把SQL语句发送给服务器端进行编译,即每次执行SQL语句都要重新发送SQL,重新编译.
Connection对象的三个和事务相关的重要方法
1)setAutoCommit(boolean autoCommit) :设置事务的自动提交模式,默认事务是自动提交的,如果参数为false,表示关闭自动提交,由程序来控制事务何时提交。不调用该方法,事务都是自动提交的
2).commit(): 配合setAutoCommit(false)使用,当需要提交事务时,调用commit()手动提交事务
3).rollback():配合setAutoCommit(false)使用,当需要回滚事务时,调用rollback()手动回滚事务

2.PreparedStatement的使用

步骤如下:
1)创建PreparedStatement的实例
PreparedStatement实例要包含预编译的Sql语句,sql语句特点是为每个输入参数保留一个占位符?
String sql = “insert into dept values(?,?,?)”;
PreparedStatement stmt = conn.prepareStatement(sql) ;
2)给SQL语句中的占位符?赋值
调用PreparedStatement对象的setXxx(int index, object value)来给?赋值.Xxx是输入参数的java类型,setXxx()的参数1是输入参数(?)的索引,从1开始,参数2是提供给输入参数的值
例如上面的sql中有3个输入参数(?),第1个?是部门号字段值,它的值是int类型,调用setInt(1, ‘开发部’ )
// 执行sql前要给每个?赋值
stmt.setInt(1, deptno);
stmt.setString(2, dname);
stmt.setString(3, loc);
3)调用executeQuery()或executeUpdate()执行Sql语句,不要再传入sql
int i = stmt.executeUpdate();

3.PreparedStatement防止SQL注入

SQL注入:在sql命令中注入非法的sql语句,从而实现恶意的登录等行为.例如下面的sql:
select * from t_user where username=‘xx’ and userpassword=‘bb’ or ‘1’=‘1’
上面注入了 or ‘1’='1’这样的非法sql,不管输入什么用户名和密码都能成功登录
使用PreparedStatement对象可以防止SQL注入
String sql = “select * from t_user where username=? and userpassword=?”;
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, userpwd);
// System.out.println(sql);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
System.out.println(“登录成功”);
} else {
System.out.println(“登录失败”);
}

4.JdbcUtil工具类

封装了3个方法
1)获取连接 2) 关闭资源 3)通用的增删改executeUpdate()
调用executeUpdate(),只能传入增删改的语句,不能传查询语句

5.修改Eclipse编辑器的工作空间编码

在这里插入图片描述
大家都统一,别人用UTF-8编码的项目导入到你的Eclipse后,就不会有中文乱码

6.事务解决转账问题

1).设置关闭自动提交
conn.setAutoCommit(false);
2)正常执行后,手动提交事务
conn.commit();
3)有异常,回滚事务
conn.rollback();

7.MVC分层

将项目分成Model,View,Controller三个组件(层)
如下图:红色框住的都属于Model, 绿色框里面的是View
在这里插入图片描述

各个包及类的命名:
1.entity包:该包下是实体类,实体类名称和表一致,命名要首字母大写,类里面的属性就符合驼峰命名法, 特殊情况:如果表名以t或t_开头,对应的实体类就去掉前缀t或t_.例如t_user或tuser表对应的实体类名User
2.dao包:该包下都是访问数据库表的接口,定义crud方法,dao接口的命名:”实体类名+Dao”或”实体类名+DAO”,它的子包impl下放dao接口的实现类,命名:dao接口名+Impl
3.utli包:该包下存放工具类,即封装通用操作/公共代码的类
4.test包:该包下存放测试类,用来提供控制台界面,属于View

8.使用properties文件

在项目的src根路径下创建db.properties文件,内容如下:
在这里插入图片描述

driver=oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=scott
password=tiger

9.使用MVC模式创建项目
要在测试类中去调用XxxDao中的方法

public static void main(String[] args) {
  	    //创建Dao实现类对象
  	    DeptDao  deptDao=new DeptDaoImpl();
  	    Dept dept=new Dept();
  	    dept.setDeptno(46);
  	    dept.setDname("研发2部");
  	    dept.setLoc("太原");
  	    int i = deptDao.insert(dept) ;
  	    if(i>0){
  	    	System.out.println("添加数据成功");
  	    }else{
  	    	System.out.println("添加数据失败");
  	    }	    
  }
抽取公共的Dao的父类BaseDao,封装的方法如下:
public List<T> getList(Class<T> clazz, String sql, Object... params) :传入一个查询语句,占位符的值以及要封装的视图对象的class,就可以将查询结果封装成对象的集合
抽取BaseDao后,我们自己的XxxDaoImpl要继承BaseDao,要传入实体类名进去
public class DeptDaoImpl  extends  BaseDao<Dept> implements DeptDao {
@Override
  public List<Dept> queryAll() {
  	// TODO Auto-generated method stub
  	String sql = "select *  from  dept";
  	// 调用getList方法,传入实体类名.class,查询语句,以及占位符的值
  	List<Dept> list =this.getList(Dept.class, sql);
  	return list;
  }
}

注意:当我们的DaoImpl类中继承BaseDao,并调用里面的getList()或getBean()有一个前提:实体类中必须有无参构造方法

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值