数据库类型bigint Java用什么接收
时间: 2024-06-05 19:09:23 浏览: 282
在 Java 中,可以使用 long 类型来接收数据库中的 bigint 类型。这是因为 bigint 类型在数据库中通常被映射为长整型,而在 Java 中长整型对应的数据类型就是 long。因此,如果你需要从数据库中读取 bigint 类型的数据,可以将其映射为 long 类型,然后在 Java 中进行处理。
相关问题
java网络编程聊天室 数据库
### 创建基于 Java 的网络编程聊天室并集成数据库
#### 设计概述
构建一个带有数据库支持的Java网络聊天室涉及多个方面,包括但不限于用户管理、消息传输以及数据持久化。为了实现这一目标,可以采用面向对象的方式设计程序架构,并利用JDBC接口连接MySQL或其他关系型数据库管理系统。
#### 数据库表结构定义
首先,在数据库中创建必要的表格用于存储用户信息和聊天记录:
```sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash CHAR(64),
status ENUM('online', 'offline') DEFAULT 'offline'
);
CREATE TABLE messages (
msg_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sender_id INT NOT NULL,
receiver_id INT COMMENT 'null means broadcast',
content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
send_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (sender_id) REFERENCES users(id),
FOREIGN KEY (receiver_id) REFERENCES users(id)
);
```
上述SQL语句定义了两个基本表单`users` 和 `messages`, 它们分别用来保存用户的登录状态和个人资料, 以及聊天过程中产生的对话内容[^1].
#### 用户认证模块
当新用户注册时,应用程序应当收集用户名与密码,并将其散列后的版本存入数据库;对于现有账户,则需验证提供的凭证是否匹配已有的哈希值:
```java
public class UserAuthenticator {
private final String DB_URL;
private final Properties props;
public boolean registerUser(String username, char[] password){
try(Connection conn = DriverManager.getConnection(DB_URL,props)){
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = md.digest(new String(password).getBytes());
PreparedStatement pstmt = conn.prepareStatement(
"INSERT INTO users(username,password_hash,status)" +
"VALUES (?, ?, ?)");
pstmt.setString(1,username);
pstmt.setBinaryStream(2,new ByteArrayInputStream(hashBytes),(long)hashBytes.length);
pstmt.setString(3,"offline");
int affectedRows = pstmt.executeUpdate();
return affectedRows>0;
} catch(Exception e){ /* handle exception */ }
return false;
}
}
```
这段代码展示了如何安全地处理用户密码并通过预编译语句防止SQL注入攻击[^2].
#### 聊天逻辑层
为了让多位参与者可以在同一时间交流互动,服务器端应该开启独立的服务线程监听各个客户端发送过来的信息请求。每当接收到新的发言后,就遍历当前在线成员列表并向他们转发该条目:
```java
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;
class ChatServer {
ConcurrentHashMap<Integer,Socket> activeConnections=new ConcurrentHashMap<>();
void broadcastMessage(int fromUserId,String messageText)throws IOException{
for(Map.Entry<Integer, Socket> entry : this.activeConnections.entrySet()){
DataOutputStream dos = new DataOutputStream(entry.getValue().getOutputStream());
// 构建JSON格式的消息体
JSONObject jsonMsg = new JSONObject();
jsonMsg.put("type","chat");
jsonMsg.put("from",fromUserId);
jsonMsg.put("text",messageText);
dos.writeUTF(jsonMsg.toJSONString());
}
}
}
```
此片段说明了怎样运用并发集合类维护活动连接池,并通过循环迭代器分发广播通知给所有订阅者.
#### 将聊天记录入库
每次成功接收一条完整的聊天指令之后,除了即时推送外还应同步更新到永久性的介质上——即前面提到的关系型数据库内:
```java
void saveChatRecordToDB(JSONObject chatJson){
try(Connection conn = DriverManager.getConnection(DB_URL,props)){
PreparedStatement pstmt = conn.prepareStatement(
"INSERT INTO messages(sender_id,content) VALUES (?,?)"
);
pstmt.setInt(1,(Integer)chatJson.get("from"));
pstmt.setString(2,(String)chatJson.get("text"));
pstmt.execute();
}catch(SQLException ex){/* error handling */}
}
```
以上函数负责把前端传来的原始字符串转换成适合插入数据库的形式,并执行相应的DML操作完成持久化的任务.
java实现@功能,给与被@人提示,并保存至数据库供再次展示的代码实例
下面是一个使用 `Java` 实现 `@` 功能,并且保存至数据库供再次展示的示例代码。
首先,假设我们有一个 `User` 实体类,其中包含用户的一些基本信息,比如 `name`、`email` 等属性。
```java
public class User {
private Long id;
private String name;
private String email;
// 省略 getter 和 setter 方法
}
```
然后,我们需要在数据库中创建一张 `message` 表,用于存储用户的消息。该表至少需要包含 `id`、`content`、`sender_id`、`receiver_id` 和 `created_at` 等字段。其中,`sender_id` 和 `receiver_id` 分别表示消息的发送者和接收者。
```sql
CREATE TABLE message (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
content TEXT NOT NULL,
sender_id BIGINT(20) UNSIGNED NOT NULL,
receiver_id BIGINT(20) UNSIGNED NOT NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (id)
);
```
接下来,我们可以通过以下步骤实现 `@` 功能:
1. 监听消息输入框的输入事件,在用户输入时判断是否输入了 `@` 符号。
2. 如果输入了 `@` 符号,则弹出一个下拉框,显示所有可选的用户列表(可以从数据库中查询)。
3. 当用户选择一个用户时,将其添加到消息输入框中,并提示被 `@` 的用户。
4. 在消息发送时,将消息内容保存至数据库,并在前端展示时将 `@` 提示的用户名字转化为链接。
下面是一个示例代码,仅供参考:
```java
@RestController
@RequestMapping("/messages")
public class MessageController {
@Autowired
private MessageService messageService;
@Autowired
private UserService userService;
@PostMapping("")
public void createMessage(@RequestBody MessageDto messageDto) {
// 保存消息至数据库
Message message = new Message();
message.setContent(messageDto.getContent());
message.setSenderId(messageDto.getSenderId());
message.setReceiverId(messageDto.getReceiverId());
message.setCreatedAt(LocalDateTime.now());
messageService.saveMessage(message);
}
@GetMapping("/users")
public List<User> getAllUsers() {
// 获取所有用户列表
return userService.getAllUsers();
}
}
```
```java
@Service
public class MessageService {
@Autowired
private MessageRepository messageRepository;
public void saveMessage(Message message) {
messageRepository.save(message);
}
}
```
```java
@Repository
public interface MessageRepository extends JpaRepository<Message, Long> {
}
```
```java
public class MessageDto {
private String content;
private Long senderId;
private Long receiverId;
// 省略 getter 和 setter 方法
}
```
```html
<template>
<div>
<label for="input">输入框:</label>
<input id="input" type="text" v-model="content" @input="handleInput"/>
<div v-if="showDropdown" class="dropdown">
<ul>
<li v-for="(user, index) in users" :key="index" @click="handleUserClick(user)">
{{ user.name }}
</li>
</ul>
</div>
<div v-html="formattedContent"></div>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
content: '',
showDropdown: false,
users: [],
atUsers: []
}
},
computed: {
formattedContent() {
let formatted = this.content;
for (let user of this.atUsers) {
formatted = formatted.replace(`@${user.name}`, `<a href="/users/${user.id}">@${user.name}</a>`);
}
return formatted;
}
},
methods: {
handleInput() {
if (this.content.endsWith('@')) {
this.showDropdown = true;
axios.get('/messages/users')
.then(response => {
this.users = response.data;
});
} else {
this.showDropdown = false;
}
},
handleUserClick(user) {
this.content = this.content.slice(0, -1) + `@${user.name} `;
this.showDropdown = false;
this.atUsers.push(user);
},
sendMessage() {
axios.post('/messages', {
content: this.content,
senderId: 1,
receiverId: 2
}).then(response => {
this.content = '';
this.atUsers = [];
});
}
}
}
</script>
```
在上面的代码中,我们通过 `atUsers` 数组来保存所有被 `@` 的用户,在发送消息时将其一并保存至数据库中。在前端展示时,我们使用 `v-html` 指令将消息内容中的 `@` 用户转化为链接。注意,这种做法可能存在安全隐患,因此需要进行输入过滤和转义。
阅读全文