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();
}
}
}
}
基于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);
}
}
在使用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语句分类
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
方法一:深度优先搜索
首先可以想到使用深度优先搜索的方法,遍历整棵树,记录最小深度。
对于每一个非叶子节点,我们只需要分别计算其左右子树的最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。
方法二:广度优先搜索
使用广度优先搜索的方法,遍历整棵树。
当我们找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。
# 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))