javaee的开发模式:
mvc,三层架构
web层:接收数据,用户交互
service层:写中间的逻辑
dao层:数据库访问代码
DBUtils如何使用
1.先导包
2.和正常的dao层一样书写
其中update还是增删改
query是查询
流程:
①创建方法
②获得JDBCUtils连接对象
③创建QueryRunner对象
④书写数据库
⑤(可以创建Object对象直接赋值),也可以(直接在update里面的可变参数书写)
⑥必写int row =qr.update(conn,sql.可变参数)
查询方法
①创建方法
②获得JDBCUtils连接对象
③创建QueryRunner对象
④书写数据库
⑤通过query方法,
书写第一条:Object [] obj=qr.query(conn, sql, new ArrayHandler());
list集合返回 ArrayListHandler所有的信息
BeanHandler第一条信息封装到javabean中
BeanListHandler封装所有javabean中
⑥必写int row =qr.update(conn,sql.可变参数)
第一queryRunner runner=new QueryRunner(DataSource dateSource存放的是调用的连接池工具类),省去了开头连接Connection的代码。
public class UserDao { //添加用户 public void addUser() throws SQLException{ //获得连接对象 //创建QueryRunner对象 QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource());//自动穿一个空闲连接池对象 String sql="insert into users (uid,username,password)values(?,?,?)"; Object[] obj={"aaa","宋大树","123456"}; int row=qr.update( sql, obj); System.out.println("row"); } //修改用户 public void updateUser() throws SQLException{ Connection conn=JDBCUtils.getConn(); QueryRunner qr=new QueryRunner(); String sql="UPDATE users SET username=? WHERE username=?"; Object[] obj={"礼物","李四"}; int row =qr.update(conn, sql, obj); System.out.println(row); } //删除 public void deleteUser() throws SQLException{ Connection conn=JDBCUtils.getConn(); QueryRunner qr=new QueryRunner(); String sql=" delete from users where uid=?"; //Object[] obj={"123"}; int row =qr.update(conn, sql, "aaa"); System.out.println(row); } //ArrayListHandlar //Object [] 查询所有用户信息(第一条) public void get1() throws SQLException{ Connection conn=JDBCUtils.getConn(); //创建QueryRunner QueryRunner qr=new QueryRunner(); String sql="select * from users"; Object [] obj=qr.query(conn, sql, new ArrayHandler()); for(Object o:obj){ System.out.println(o); } } public void get2() throws SQLException { Connection conn=JDBCUtils.getConn(); //创建QueryRunner QueryRunner qr=new QueryRunner(); String sql="select * from users"; List<Object[]> list=qr.query(conn, sql, new ArrayListHandler()); for(Object [] obj:list){ for(Object o:obj){ System.out.println(o); } } } //BeanHandlar public void get3() throws SQLException { Connection conn=JDBCUtils.getConn(); //创建QueryRunner QueryRunner qr=new QueryRunner(); String sql="select * from users where username=? and password=?"; Object [] obj={"小红帽","123456"}; Users user =qr.query(conn, sql, new BeanHandler<Users>(Users.class), obj); System.out.println(user); } //BeanListHandlar //List<JavaBean> 查询结果集的所有用户信息 public void get4() throws SQLException { Connection conn=JDBCUtils.getConn(); //创建QueryRunner QueryRunner qr=new QueryRunner(); String sql="select * from users "; //封装的对象 List<Users> list =qr.query(conn, sql, new BeanListHandler<Users>(Users.class)); System.out.println(list); } //ColumnListHandlar //List<Column>类 查询某一字段的所有信息 public void get5() throws SQLException { Connection conn=JDBCUtils.getConn(); //创建QueryRunner QueryRunner qr=new QueryRunner(); String sql="select username from users "; //封装的对象 List<String>list= qr.query(conn, sql,new ColumnListHandler<String>()); System.out.println(list); } //ScalarHeader //查询count\avg聚合函数的结果信息 public void get6() throws SQLException { //创建QueryRunner QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource()); String sql="select count(*) from users "; //封装的对象 Long conut= qr.query( sql,new ScalarHandler<Long>()); int c=conut.intValue(); System.out.println(c); }
DBUTlis连接池
修改代码:
就是用来管理conn的,通过池来获取Connection对象。主要是针对dao层
先导包→编写工具类(都是静态修饰的方法,或者静态代码块,或者静态常量)
JDBC事务
- 也就是在一次任务中要把所有的单元放在一个事务中执行。
- 默认的是一条sql语句就是一个事务
- 开启事务:start transaction
- 提交事务:commit(如果不提交只是存储到内存,提交之后真正更新数据)
- 回滚:rollback,如果没有提交事务则回滚到最初状态
- 如何修改DBUTlis事务
-
public class AccountDao { //转出方法 public void outMoney(Connection conn,String out,double money) throws SQLException{ QueryRunner qr= new QueryRunner(); String sql="update account set money=money-? where aname=?"; qr.update(conn,sql,money,out); } //out是转入账号也就是tom public void inMoney(Connection conn,String in,double money) throws SQLException{ QueryRunner qr= new QueryRunner(); String sql="update account set money=money+? where aname=?"; qr.update(conn,sql,money,in); }
-
public void transfer(String out,String in,double money){ Connection conn=MyDBUtils.getConn(); try { //手动开启事务 conn.setAutoCommit(false); //收账人 accountDao.outMoney(conn,out, money);//往下走conn已经开始调取这一句方法 int y =1/0; //转账人 accountDao.inMoney(conn,in, money); conn.commit(); } catch (SQLException e) { //事务回滚 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }
//解决中文乱码 request.setCharacterEncoding("UTF-8"); //获取参数 String out=request.getParameter("out"); String in=request.getParameter("in"); String moneyStr=request.getParameter("money"); double money=Double.parseDouble(moneyStr); //调用Service层的转账方法 accountService.transfer(out, in, money); //解决乱码 response.setContentType("text/html;charset=UTF-8"); //重定向 response.getWriter().write("转账成功");
它的好处是即使出现异常,也不会出现钱转了,但是收方没有找到钱的问题。
事务只能走一个数据库语句,要不全部执行,要不不执行
事务具有原子性、一致性、隔离性、持久性。 - ajax
同步是服务器返回客户端之前,客户端无法操作。
异步是客户端请求服务器,服务器是否返回客户端,都可以操作。
ajax就是替代了request请求直接发送到到tomat服务器,做一个中转站。
json数据格式,键值对
1、对象{“key”“obj”} -
var person={"firstname":"张","lastname":"三丰","age":100}; //取值:变量名.方法名() alert(person.firstname); var persons=[ {"name":"张三","age":18}, {"name":"司南","age":19} ]; alert(persons[0].name); var shcool={ "oracle":[ {"name":"司南","age":20}, {"name":"李治烽","age":21} ] } alert(shcool.oracle[0].name);
3、和jq相关的ajax技术
其中
$.get(url,[data],[callback],[type])
$.post(url,[data],[callback],[type])
url地址,data请求服务器数据,callback回调函数,type数据类型(text,json,html)
$.ajax
asyc:true异步
dataType发送的参数
success:回调函数
type请求方式
url服务器地址