victory的博客

长安一片月,万户捣衣声

0%

Java中的6大框架

6大框架
1)structs1
2)structs2
3)hibernate
4)spring
5)springMVC
6)mybatis
SSM
SSM=spring+springMVC+mybatis
框架分类
MVC框架:struts1(封装了servlet),struts2(封装了filter),springMVC
持久层框架:hibernate,mybatis
整合型框架,设计型框架:spring

事务

当我们一次需要执行多条sql语句时就要考虑控制事务以避免出现一些错误。
例如:当我们从一个账户给另一个账户转账时,假设第一个账户的余额已经扣除,此时电脑断电了,
第二个账户的余额也没有增加;为了避免此类事情的发生,我们可以对事物进行控制,要么增扣除和增加都成功,
要么扣除、增加都失败。
创建表user

CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
NAME VARCHAR(20),
balance DOUBLE
);

创建测试类Test1.java

package com.oracle.test;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.oracle.utils.DataSourceUtils;

public class Test1 {

    public static void main(String[] args){
        try {
            //开启事务
            DataSourceUtils.startTransaction();
            //创建QueryRunner对象
            QueryRunner qr = new QueryRunner();
            //编写sql语句
            String sql1 = "update user set balance=balance-500 where id=1";
            String sql2 = "update user set balance=balance+500 where id=2";
            //执行sql
            qr.update(DataSourceUtils.getConnection(), sql1);
            
            //失败
            int c=100/0;
            
            qr.update(DataSourceUtils.getConnection(), sql2);
            //事务提交
            DataSourceUtils.commitAndRelease();
            //关闭事务
            DataSourceUtils.closeConnection();
        } catch (Exception e) {
            //失败则回滚
            try {
                DataSourceUtils.rollback();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }

}

QueryRunner和数据库增删改查操

基于JavaWeb项目开发 | jdbc中的配置编写以下代码实现数据库的增删改查(CRUD)。
在test1数据库中建表dept

create table dept(
int id primary key auto_increment not null,
varchar(20) name
)

Dept.java(JavaBean)

package com.oracle.bean;

public class Dept {
    private int id;
    private String name;
    public Dept() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Dept(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    
}

新建一个Test类实现数据库增删改查操作

package com.oracle.test;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.oracle.bean.Dept;
import com.oracle.utils.DataSourceUtils;

public class Test {
    
    public static void main(String[] args) throws SQLException {
        //创建QueryRunner对象
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        
        //增加数据
        //String sql = "insert into dept(name) values(?)";
        //qr.update(sql, "需求部");
        
        //修改数据
        //String sql = "update dept set name=? where id=?";
        //qr.update(sql, "需求组", 4);
        
        //删除数据
        //String sql = "delete from dept where id=?";
        //qr.update(sql, 4);
        
        //查询数据
        //(1)查询结果为一行
        //String sql = "select * from dept where id=?";
        //Dept d = qr.query(sql, new BeanHandler<>(Dept.class), 1);
        //System.out.println(d.getId());
        //System.out.println(d.getName());
        
        //(2)查询结果为多行
//        String sql = "select * from dept";
//        List<Dept> list = qr.query(sql, new BeanListHandler<>(Dept.class));
//        for(Dept d:list) {
//            System.out.println(d.getId());
//            System.out.println(d.getName());
//        }
        
        //(2)查询结果为聚合函数
        String sql = "select count(*) from dept";
        
        int i = ((Long) qr.query(sql, new ScalarHandler())).intValue();
        
        System.out.println(i);
    }
}

jdbc

在使用Java语言进行开发时,我们可以使用jdbc操作数据库;实际开发中我们通常直接导入数据库连接池(c3p0-0.9.1.2.jar)、
数据库驱动(mysql-connector-java-5.0.4-bin.jar)和简化jdbc操作的类库(commons-dbutils-1.4.jar);并在c3p0-config.xml中配置数据库。

数据库配置(c3p0-config.xml)
配置数据库的用户名、密码、驱动以及要连接的数据库
(本例连接用户名为root、密码为root、数据库驱动为mysql数据库驱动、连接的数据库为本地的test1数据库)

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test1</property>
    </default-config> 
</c3p0-config> 

注:以上三个jar包可在网上通过名称搜索自行下载。

SQL语句实例大全

SQL语句分类

  1. DDL(Data Definition Language)数据定义语言
    用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter等
    DDL参考
  2. DML(Data Manipulation Language)数据操作语言
    用来对数据库中表的数据进行增删改。关键字:insert, delete, update等
  3. DQL(Data Query Language)数据查询语言
    用来查询数据库中表的记录(数据)。关键字:select, where等
  4. DCL(Data Control Language)数据控制语言(了解)
    用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE等
    注:重点关注DML、DQL;实际开发中我们可以使用数据库软件来创建数据库、表、列等(DDL了解即可);DCL为DBA关注的事情。
阅读全文 »

111.二叉树的最小深度

题目描述

给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。

题目链接

思路

方法一:深度优先搜索
首先可以想到使用深度优先搜索的方法,遍历整棵树,记录最小深度。
对于每一个非叶子节点,我们只需要分别计算其左右子树的最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。
方法二:广度优先搜索
使用广度优先搜索的方法,遍历整棵树。
当我们找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。

代码

# Definition for a binary tree node.
import collections


class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution(object):
    def minDepth(self, root):
        """
        深度优先搜索
        :type root: TreeNode
        :rtype: int
        """
        def get_depth(root):
            if root is None:
                return 0
            left_depth = get_depth(root.right)
            right_depth = get_depth(root.left)
            return min(right_depth, left_depth) + 1

        return get_depth(root)

    def minDepth1(self, root):
        """深度优先搜索"""
        if not root:
            return 0

        if not root.left and not root.right:
            return 1

        min_depth = 10 ** 9
        if root.left:
            min_depth = min(self.minDepth1(root.left), min_depth)
        if root.right:
            min_depth = min(self.minDepth1(root.right), min_depth)
        return min_depth + 1

    def minDepth2(self, root):
        """深度优先搜索"""
        if not root:
            return 0

        que = collections.deque([(root, 1)])
        while que:
            node, depth = que.popleft()
            if not node.left and not node.right:
                return depth
            if node.left:
                que.append((node.left, depth + 1))
            if node.right:
                que.append((node.right, depth + 1))

        return 0

    def create_binary_tree(self, nodes_list):
        node1 = TreeNode(nodes_list[1])
        node3 = TreeNode(nodes_list[3])
        node4 = TreeNode(nodes_list[4])
        node2 = TreeNode(nodes_list[2], node3, node4)
        root = TreeNode(nodes_list[0], node1, node2)
        return root


if __name__ == "__main__":
    slt = Solution()
    root = slt.create_binary_tree([3, 9, 20, 15, 7])
    print(slt.minDepth(root))