JDBC01 利用JDBC连接数据库【不使用数据库连接池】
目录:
1 什么是JDBC
2 JDBC主要接口
3 JDBC编程步骤【学渣版本】
5 JDBC编程步骤【学神版本】
6 JDBC编程步骤【学霸版本】
1 什么是JDBC
JDBC是JAVA提供的一套标准连接数据库的接口,规定了连接数据库的步骤和功能;不同的数据库提供商提供了一套JDBC实现类,他们称为数据库驱动。
2 JDBC的主要接口
Connection 与数据库连接有关
DriverManager 与创建数据库连接对象有关
Statement 与执行SQL语句有关
ResultSet 与返回的结果及有关
注意:通过JDBC操作数据库是自动提交的,当然也可是设置成手动提交
3 利用JDBC操作数据库的步骤【学渣版本】
3.1 导入数据库驱动
Class.forName(“数据库驱动包”);
注意:Class.forName的底层实际上是利用的java反射机制
例如:Class.forName("com.mysql.jdbc.Driver"); //mysql驱动包的固定写法
3.2 创建连接
Connection conn = DriverManager.getConnection(“jdbc:mysql:// + IP + : + 端口 + / + 数据库名称”,“数据库用户名”,“密码”);
注意:DriverManager是一个驱动管理类,通过调用该类的静态方法DriverManager来创建连接对象
例如: Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", // jdbc:mysql:// + IP + : + 端口 + / + 数据库名称
"root", // 用户名
"182838"); // 用户密码
3.3 创建语句对象
Statement state = conn.createStatement();
注意:利用连接对象来创建语句对象
3.4 执行SQL语句
ResultSet executeQuery(String sql)
用来执行查询语句(DQL)的方法,返回的是一个查询结果集
Integer executUpdate(String sql)
用来执行DML语句的方法,返回值为执行了该DML后影响了数据库中多少条数据
boolean execute(String sql)
可以执行所有类型的SQL语句,但是DQL,DML都有专门的方法,所以该方法通常
用来执行DDL语句.当返回值为true时表示该SQL语句执行后有结果集,没有结果集
的都是返回的false.(并不是根据语句的对错来返回true或者false)
注意:利用语句对象来执行SQL语句,DQL指查询,DML指修改、删除、插入,DDL指新建
注意:如果是查询语句会得到一个结果集,结果集类型是ResultSet,可对结果集进行遍历
3.5 遍历结果集
3.6 关闭语句对象、关闭连接对象
执行对象.close();
连接对象.close();
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.xiangxu</groupId>
<artifactId>testJDBC</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
maven依赖包
CREATE TABLE user (
id INT (10) PRIMARY KEY,
name VARCHAR (10),
pwd VARCHAR (10)
); DESC USER; DROP TABLE user; SELECT * FROM user;
SQL语句
package testJDBC; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import org.junit.Test; public class TestCase {
@Test
public void test01() {
Connection conn = null;
try {
// 01 导入驱动模块
Class.forName("com.mysql.jdbc.Driver"); // 02 初始化连接对象(以为在之前就创建了,进行初始化就行啦)
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "182838"); // 03 创建执行对象
Statement state = conn.createStatement(); String sql = "SELECT * FROM user "; // 04 执行SQL语句
ResultSet rs = state.executeQuery(sql); // 查询结果的类型为ResultSet // 05 遍历查询结果
while(rs.next()) { // 遍历结果集
System.out.println(rs.getString("name"));
} // 06 关闭执行对象、连接对象
state.close();
conn.close(); } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(null != conn) { // 判断连接是否关闭
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
}
java代码
4 存在的问题
4.1 重复编译问题
利用 Statement对象执行SQL语句时每执行一条SQL语句在数据库端就会进行一次变异,如果是类似的SQL语句也是这样;严重加大了数据库的负担
改进:利用预编译的Statement
注意:预编译statement向数据库中发送一个sql语句,数据库编译sql语句,并把编译的结果保存在数据库砖的缓存中。下次再发sql时,如果sql相同,则不会再编译,直接使用缓存中的。
4.2 释放资源问题
程序执行后应该对 结果集、执行对象、连接对象进行释放,而且在finally那里还需要判断是否成功释放(注意:try里面定义的变量在finally是获取不到的)
改进:在程序的最前面定义 连接对象、执行对象、结果集对象;在程序结束后调用各自的close方法来释放资源,在finally中判断这三个对象是否成功关闭
5 jdbc编程步骤【学神版本】
加载数据库驱动
创建并获取数据库链接
创建jdbc statement对象
设置sql语句
设置sql语句中的参数(使用preparedStatement)
通过statement执行sql并获取结果
对sql执行结果进行解析处理
释放资源(resultSet、preparedstatement、connection)
package testJDBC; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; public class TestCase {
@Test
public void test01() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动 conn = DriverManager.getConnection( // 初始化连接对象
"jdbc:mysql://localhost:3306/test", "root", "182838"); String sql = "SELECT * FROM user WHERE pwd = ? "; // 拼接SQL语句,位置参数用?代替 ps = conn.prepareStatement(sql); // 初始化预编译执行对象 ps.setString(1, "182838"); // 设置SQL语句中的位置位置参数(注意:是从1开始数不是从0开始数) rs = ps.executeQuery(); // 执行SQL语句 while(rs.next()) { // 遍历结果集
System.out.println("====================");
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
System.out.println(rs.getString("pwd"));
} // 释放资源
rs.close();
ps.close();
conn.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
}
优化后的java代码
6 可优化的地方【学霸版本】
没有将查询到的结果封装换成一个对象
package cn.xiangxu.entity; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = -5109978284633713580L; private Integer id;
private String name;
private String pwd;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(Integer id, String name, String pwd) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
} }
user表对应的实体类
package testJDBC; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import org.junit.Test; import cn.xiangxu.entity.User; public class TestCase {
@Test
public void test01() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动 conn = DriverManager.getConnection( // 初始化连接对象
"jdbc:mysql://localhost:3306/test", "root", "182838"); String sql = "SELECT * FROM user WHERE pwd = ? "; // 拼接SQL语句,位置参数用?代替 ps = conn.prepareStatement(sql); // 初始化预编译执行对象 ps.setString(1, "182838"); // 设置SQL语句中的位置位置参数(注意:是从1开始数不是从0开始数) rs = ps.executeQuery(); // 执行SQL语句 List<User> users = new ArrayList<User>(); // 创建一个集合来存放记录对象
while(rs.next()) { // 遍历结果集
// System.out.println("====================");
// System.out.println(rs.getInt("id"));
// System.out.println(rs.getString("name"));
// System.out.println(rs.getString("pwd"));
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPwd(rs.getString("pwd"));
users.add(user); // 向集合中添加元素
} System.out.println(users); // 打印输出集合
for(User user : users) {
System.out.println(user);
} // 释放资源
rs.close();
ps.close();
conn.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
}
对查询结果进行封装了的java代码
7 小案例
用户登录、转账系统
package day01; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; /**
* 用户登录系统
* Description:
*/
public class Service {
private static final int USER_REG = 1;
private static final int USER_LOGIN = USER_REG + 1;
private static final int USER_UPDATE = USER_LOGIN + 1;
private static final int USER_DELETE = USER_UPDATE + 1;
private static final int USER_INFO = USER_DELETE + 1;
private static final int USER_TRANSFER = USER_INFO + 1;
private static final int USER_QUIT = USER_TRANSFER + 1;
private static final int EXIT = USER_QUIT + 1; UserInfo user = null; public static void main(String[] args) {
Service serv = new Service();
serv.start();
} private void start() {
welcome();
int code = getCode();
execute(code);
} /**
* 执行选择
* Description:
*/
private void execute(int code) {
switch (code) {
case USER_REG:
user_reg();
break;
case USER_LOGIN:
user_login();
break;
case USER_UPDATE:
user_update();
break;
case USER_DELETE:
user_delete();
break;
case USER_INFO:
user_info();
break;
case USER_TRANSFER:
user_transfer();
break;
case USER_QUIT:
user_quit();
break;
case EXIT:
exit();
break;
default:
System.out.println("输入错误,请重新输入");
start();
break;
}
} /**
* Description:
*/
private void exit() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("当前用户还没有退出,所以执行自动退出当前用户");
user_quit();
}else {
System.out.println("你选择了退出系统");
System.out.println("系统退出成功");
} } /**
* 退出当前用户
* Description:
*/
private void user_quit() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了退出当前用户功能");
this.user = null;
if(null == this.user) {
System.out.println("成功退出当前用户");
}else {
System.out.println("退出当前用户失败");
}
}else {
System.out.println("你还没有登录成功,还不能使用该功能");
System.out.println("请登录!");
user_login();
}
start();
} /**
* 转账功能
* Description:
*/
private void user_transfer() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了转账功能!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入转入账户的用户名:");
String name = scanner.nextLine();
System.out.println("请输入转账金额:");
int money = Integer.parseInt(scanner.nextLine()); Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement(); //转出
String out_sql = "UPDATE userinfo_fury "
+ "SET account = account - '"+money+"' "
+ "WHERE username = '"+this.user.getUsername()+"' ";
int judge01 = state.executeUpdate(out_sql);
if(judge01 > 0) {
System.out.println("转出成功");
}else {
System.out.println("转出失败");
} //转入
String in_sql = "UPDATE userinfo_fury "
+ "SET account = account + '"+money+"' "
+ "WHERE username = '"+name+"' ";
int judge02 = state.executeUpdate(in_sql);
if(judge02 > 0) {
System.out.println("转入成功");
}else {
System.out.println("转入失败");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
}else {
System.out.println("请先登录!");
user_login();
}
start();
} /**
* 查询表中的所有数据
* Description:
*/
private void user_info() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了查询所有用户功能!");
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement();
String sql = "SELECT id,username,password,email,nickname,account "
+ "FROM userinfo_fury ";
ResultSet rs = state.executeQuery(sql);
List<UserInfo> list = new ArrayList<UserInfo>(); while(rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
String nickname = rs.getString("nickname");
double account = rs.getDouble("account");
UserInfo userinfo = new UserInfo(id, username, password, email, nickname, account);
list.add(userinfo);
}
for(UserInfo lis : list) {
System.out.println(lis);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
}else {
System.out.println("请先登录");
user_login();
}
start();
} /**
* 删除用户
* Description:
*/
private void user_delete() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了删除用户功能");
System.out.println("你不是超级用户,你无法使用删除用户功能");
}else {
System.out.println("请先登录!");
user_login();
}
start();
} /**
* 修改用户信息
* Description:
*/
private void user_update() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了修改当前用户功能!");
//可改进 -->> 可由用户选择需要修改的字段
System.out.println("你当前的昵称为:" + this.user.getNickname());
Scanner scanner = new Scanner(System.in);
System.out.println("你想将你的昵称修改为:");
String nickname = scanner.nextLine(); Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement(); String sql = "UPDATE userinfo_fury "
+ "SET nickname = '"+nickname+"' "
+ "WHERE username = '"+this.user.getUsername()+"' ";
int judge = state.executeUpdate(sql);
if(judge > 0) {
this.user.setNickname(nickname);
System.out.println("修改昵称成功,当前昵称为:" + this.user.getNickname());
}else {
System.out.println("修改昵称失败");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
}else {
System.out.println("请登录成功后在进行此操作!");
user_login();
}
start();
} /**
* 用户登录
* Description:
*/
private void user_login() {
// TODO Auto-generated method stub
System.out.println("你选择了用户登录功能!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine(); Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement(); String sql = "SELECT id, username, password,email, nickname,account "
+ "FROM userinfo_fury "
+ "WHERE username = '"+username+"' "
+ "AND password = '"+password+"' ";
System.out.println(sql);
ResultSet rs = state.executeQuery(sql);
if(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("username");
String word = rs.getString("password");
String email = rs.getString("email");
String nickname = rs.getString("nickname");
double account = rs.getDouble("account");
UserInfo userinfo = new UserInfo(id, name, word, email, nickname, account);
this.user = userinfo;
System.out.println("登录成功,你的昵称为:" + this.user.getNickname());
}else {
System.out.println("登录失败:" + this.user);
}
/*
* 注意:
* 当用户输入的密码个的格式是: 任意字符' or '数值开头 时无论用户名和密码正确与否,都会登录成功
* 因为 如果这样输入就改变了 SQL 语句的原意(在SQL语句中AND的优先级要高于OR)
* 实例 : asdfaer1234' or '1
*/
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
start();
} /**
* 用户注册
* Description:
*/
private void user_reg() {
System.out.println("你选择了用户注册功能!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
System.out.println("请输入邮箱:");
String email = scanner.nextLine();
System.out.println("请输入昵称:");
String nickname = scanner.nextLine();
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement();
String sql = "INSERT INTO userinfo_fury "
+ "(username,password,email,nickname) "
+ "VALUES "
+ "('"+username+"','"+password+"','"+email+"','"+nickname+"')";
int judge = state.executeUpdate(sql);
if(judge > 0) {
System.out.println("注册成功");
}else {
System.out.println("注册失败");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
start();
} /**
* 功能选择
* Description:
*/
private int getCode() {
System.out.println("请选择功能:");
Scanner scanner = new Scanner(System.in);
int code = Integer.parseInt(scanner.nextLine());
return code;
} /**
* 界面信息
* Description:
*/
private void welcome() {
System.out.println("欢迎使用用户登录系统!");
System.out.println("请输入需要操作的功能序号");
System.out.println("======================");
System.out.println("================");
System.out.println("1 : 用户注册");
System.out.println("2 : 用户登录");
System.out.println("3 : 修改用户信息");
System.out.println("4 : 删除用户");
System.out.println("5 : 查看所有用户信息");
System.out.println("6 : 转账业务");
System.out.println("7 : 用户退出");
System.out.println("8 : 退出系统");
System.out.println("================");
System.out.println("======================");
}
}
JDBC01 利用JDBC连接数据库【不使用数据库连接池】的更多相关文章
- JDBC02 利用JDBC连接数据库【使用数据库连接池】
目录 1/2/3 Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...
- 利用JDBC连接数据库(MySQL)
1 在eclipse中创建一个maven项目(在Java模式下,不要在JavaEE模式下) 1.1 file -->> new -->> project 2 下载数据库驱动 ...
- JDBC(11)—数据库连接池
在实际开发过程中,特别是在web应用系统中,如果程序直接访问数据库中的数据,每一次数据访问请求丢必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接.而连接并打开数据库是一件既消费资源又费时的 ...
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- JDBC基础学习(六)—数据库连接池
一.数据库连接池介绍 1.数据库连接池的缘由 对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什 ...
- 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...
- JDBC(三)数据库连接池(DBCP、C3P0)
前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...
- JDBC(四)----数据库连接池
## 数据库连接池 * 概念:其实就是一个容器(集合) * 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后会将连接对象归还给容 ...
- java基础之JDBC六:DBCP 数据库连接池简介
我们之前写的代码中的数据库连接每次都是自己创建,用完以后自己close()销毁的,这样是很耗费资源的,所以我们引入DBCP DBCP简介 概述: Data Base Connection Pool, ...
随机推荐
- Day4-软件目录开发规范
层次清晰的目录结构:1. 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目.2. 可维护性高: 定义好 ...
- Linux如何安装VMware Tools
第一步:安装VMware Tools 桌面上会出现一个光盘,并且会弹出一个框框,里面是VMware Tools的安装包,将其拖到桌面上 就像下面这样 进入终端,将文件拷贝到/tmp目录下面,并解压(也 ...
- 为什么重写equals时必须重写hashCode方法?(转发+整理)
为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...
- Linux环境下配置JDK,java环境
1.查看Linux自带的JDK是否已安装 # java -version 2. 查看JDK信息 # rpm -qa | grep java 显示: java-x.x.x-gcj-compat-x.x. ...
- ASP.NET Core:使用EntityFrameworkCore操作MySql来丰富仓储模块
概述 上一篇简单介绍了Dapper的基本用法,数据的存储为SqlServer.那么这一篇就记录一下使用EFCore来操作MySql的一些方式,这种模式比较适合那种一个项目中需要操作多种数据库的模式.不 ...
- Yii2.0中场景的使用小记
熟悉Yii框架的人都知道,灵活的使用场景可以达到事半功倍的效果! 比如普通的数据的新增.修改,新增需要验证其中两个字段,而修改只需要验证其中一个字段:还有种情况,也是我们现在用到的,同一张表(同一个m ...
- 使用 Hive装载数据的几种方式
装载数据 1.以LOAD的方式装载数据 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION( ...
- 【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
- Nodejs-express 4.0框架 简单介绍
http://www.expressjs.com.cn/4x/api.html 这个是express API的中文手册 但是只是翻译了一点 英语比较差比较难受. 1. 关于安装 现在网上查的时候有一 ...
- a标签点击之后有个虚线边框,怎么去掉
1.行内处理方式1 <a hidefocus="true" href="#"></a> 2.行内处理方式2,让a标签获得焦点就失去焦点, ...