數據庫表:
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50717
Source Host : 127.0.0.1:3306
Source Database : test
Target Server Type : MYSQL
Target Server Version : 50717
File Encoding : 65001
Date: 2020-06-23 10:44:51
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `union_unique_name_phone` (`name`,`phone`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '張三', '123456', '12580');
INSERT INTO `user` VALUES ('2', '李四', '654321', '13333333333');
用戶實體類:
public class User {
private Integer id;
private String name;
private String password;
private String phone;
public User() {
}
public User(Integer id, String name, String password, String phone) {
this.id = id;
this.name = name;
this.password = password;
this.phone = phone;
}
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
依賴(版本根據自己本地的自行選擇):
<!-- MySQL Connector Dependency -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
BaseDao源碼,根據需要自行調整:
public class BaseDao {
private String dirverClassName="com.mysql.jdbc.Driver";
private String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=true";
private String userName="root";
private String password="root";
private Connection conn=null;
private void getConnection(){
if(conn==null){
//1、加載驅動
try {
Class.forName(dirverClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//2、創建連接
try {
conn = DriverManager.getConnection(url,userName,password);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public int common(String sql,Object[] params){
int changeRow=0;
PreparedStatement preparedStatement = null;
try {
preparedStatement = conn.prepareStatement(sql);
if(params!=null){
for (int i = 1; i <=params.length ; i++) {
preparedStatement.setObject(i,params[i-1]);
}
}
changeRow = preparedStatement.executeUpdate();
closeAll(null,preparedStatement,null);//此處不關閉連接
} catch (SQLException e) {
e.printStackTrace();
}
return changeRow;
}
public int add(String sql,Object[] params){
return common(sql,params);
}
public int remove(String sql,Object[] params){
return common(sql,params);
}
public int update(String sql,Object[] params){
return common(sql,params);
}
public List<User> query(String sql, Object[] params){
int changeRow=0;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<User> userList = new ArrayList<>();
try {
preparedStatement = conn.prepareStatement(sql);
if(params!=null){
for (int i = 1; i <=params.length ; i++) {
preparedStatement.setObject(i,params[i-1]);
}
}
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String password = resultSet.getString("password");
String phone = resultSet.getString("phone");
userList.add(new User(id,name,password,phone));
}
} catch (SQLException e) {
e.printStackTrace();
}
return userList;
}
public void closeAll(ResultSet resultSet,PreparedStatement preparedStatement,Connection conn){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
通過connection可以控制事務,連接數可以通過getConnection來控制,可以自行實現連接池(數組,列表,策略可以選擇輪詢、隨機);
PreparedStatement 的 execute方法和executeUpdate方法區別
此處轉載自:https://blog.csdn.net/xulianboblog/article/details/51135677,這位博主說的很清楚了,自己就不敲了
方法executeUpdate
用於執行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數據定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數(int),指示受影響的行數(即更新計數)。對於 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總爲零。
方法execute
可用於執行任何SQL語句,返回一個boolean值,表明執行該SQL語句是否返回了ResultSet。如果執行後第一個結果是ResultSet,則返回true,否則返回false。但它執行SQL語句時比較麻煩,通常我們沒有必要使用execute方法來執行SQL語句,而是使用executeQuery或executeUpdate更適合,但如果在不清楚SQL語句的類型時則只能使用execute方法來執行該SQL語句了 。
顯然方法execute多了判斷是否有結果集返回。