DM8-JDBC
1、对象说明
DriverManager:用于加载驱动和创建数据库连接,实际中采用Class.forName("")
来加载驱动,DriverManager用来创建与数据库的连接对象Connection。
URL:
常用数据库URL地址的写法:
Oracle写法:jdbc:oracle:thin:@localhost:1521:test
SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=test
MySql写法:jdbc:mysql://localhost:3306/test?
DM写法:jdbc:dm://localhost:5236/schema=test
在连接达梦数据时schema指定模式,schema=test
表示使用test模式,如果不使用schema则表示默认使用的是SYSDBA模式。
Connection:数据库连接对象,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成,常用方法如下:
createStatement()
:创建向数据库发送sql的statement对象。
prepareStatement(sql)
:创建向数据库发送预编译sql的PrepareSatement对象。
setAutoCommit(boolean autoCommit)
:设置事务是否自动提交。
commit()
:在链接上提交事务。
rollback()
:在此链接上回滚事务。
Statement:象用于向数据库发送SQL语句, Statement对象常用方法如下:
executeQuery(String sql)
:用于向数据发送查询语句。
executeUpdate(String sql)
:用于向数据库发送create、insert、update或delete语句,返回值表示你update影响的纪录条数,如果是-1表示无影响,如果是建表等语句,返回0。
execute(String sql)
:用于向数据库发送任意sql语句
addBatch(String sql)
:把多条sql语句放到一个批处理中。
executeBatch()
:向数据库发送一批sql语句执行。
返回值:executeUpdate();
PreparedStatement:作为Statement的子类,相对于Statement对象而言:PreperedStatement可以避免SQL注入的问题。PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率。并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。
ResultSet:Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
获取任意类型的数据
getObject(int index)
getObject(string columnName)
获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
ResultSet还提供了对结果集进行滚动的方法:
next()
:移动到下一行
Previous()
:移动到前一行
absolute(int row)
:移动到指定行
beforeFirst()
:移动resultSet的最前面。
afterLast()
:移动到resultSet的最后面
2、导入达梦JDBC驱动
3、配置文件jdbc.properties
Driver = dm.jdbc.driver.DmDriver
URL = jdbc:dm://localhost:5236/useSSL=false&userUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username = SYSDBA
password = wh17xktk!!
4、创建JDBC连接工具类JdbcUtils
package DM8_JDBC;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @ClassName JdbcUtils
* @Description DM8_JDBC工具
* @Author 浩儿
* @Date 2022/8/4 10:00
* @Version V1.0
*/
public class JdbcUtils {
private static String driver;
private static String url;
private static String username;
private static String password;
static{
try {
//加载JDBC配置文件jdbc.properties
InputStream jdbc = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(jdbc);
//获取配置文件信息
driver = properties.getProperty("Driver");
url = properties.getProperty("URL");
username = properties.getProperty("username");
password = properties.getProperty("password");
//加载驱动
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建数据库连接对象connection
public static Connection getconnection() throws SQLException {
Connection con = DriverManager.getConnection(url, username, password);
return con;
}
//释放资源
public static void release(Connection con, PreparedStatement pre, ResultSet res) throws SQLException {
if (con != null){
con.close();
}
if (pre != null){
con.close();
}
if (res != null){
res.close();
}
}
}
5、测试类DmTest
5.1 使用PreparedStatement预编译
package DM8_JDBC;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @ClassName Test
* @Description JDBC连接达梦数据库测试
* @Author 浩儿
* @Date 2022/8/4 10:39
* @Version V1.0
*/
public class DmTest {
public static PreparedStatement pre;
public static ResultSet re;
//数据库查询
@Test
public void TestSelect() throws SQLException {
//创建数据库连接
Connection con = JdbcUtils.getconnection();
if (con != null){
System.out.println(("数据库连接成功"));
}else {
System.out.println(("数据库连接失败"));
}
String sql = "select * from t1";
//执行SQL
pre = con.prepareStatement(sql);
//返回查询到的结果集
re = pre.executeQuery();
//循环输出结果集
while (true) {
if (!re.next()) break;
System.out.println("id:" + re.getObject("id")+"\t"+"name:" + re.getObject("name"));
System.out.println();
}
//释放资源
JdbcUtils.release(con,pre,re);
}
@Test
//插入数据
public void testInsert() throws SQLException {
//创建数据库连接
Connection con = JdbcUtils.getconnection();
String sql = "insert into t1 values(1,'xktk'),(2,'xktk2')";
PreparedStatement pre = con.prepareStatement(sql);
int i = pre.executeUpdate();
if (i != 0){
System.out.println("插入成功");
}else {
System.out.println("插入失败");
}
JdbcUtils.release(con,pre,re);
}
@Test
//更新数据
public void testUpdate() throws SQLException {
Connection con = JdbcUtils.getconnection();
String sql = "update t1 set name = 'xswl' where name = 'xktk'";
pre = con.prepareStatement(sql);
int i = pre.executeUpdate();
if (i != 0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
JdbcUtils.release(con,pre,re);
}
@Test
//删除数据
public void testDelete() throws SQLException {
Connection con = JdbcUtils.getconnection();
String sql = "delete from t1 where name = 'xktk2'";
pre = con.prepareStatement(sql);
int i = pre.executeUpdate();
if (i != 0){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
JdbcUtils.release(con,pre,re);
}
@Test
//创建表
public void TestCreate() throws SQLException {
Connection con = JdbcUtils.getconnection();
String sql = "create table t2 (id int,name varchar)";
pre = con.prepareStatement(sql);
int i = pre.executeUpdate(sql);
//返回值表示你update影响的纪录条数,如果是-1表示无影响,如果是建表等语句,返回0。
if (i == 0){
System.out.println("创建成功");
}else {
System.out.println("创建失败");
}
JdbcUtils.release(con,pre,re);
}
}
为了减少数据库增删查改时代码的编写量,和不必要的重复,可以考虑创建一个公共的查询方法和增、删、改方法。
这里引入一个object类型数组用来指定SQL中的条件值。
//数据库共查询方法
public static ResultSet commentSelect(Connection con, PreparedStatement pst , String sql, Object[] objects) throws SQLException {
pst = con.prepareStatement(sql);
for (int i = 0;i <= objects.length-1 ;i++){
pst.setObject(i+1,objects[i]);
}
ResultSet re = pst.executeQuery();
return re;
}
//公共增、删、改方法
public static void update(Connection con,PreparedStatement pre,String sql,Object[] objects) throws SQLException {
pre = con.prepareStatement(sql);
for (int i = 0; i <= objects.length-1; i++){
pre.setObject(i+1,objects[i]);
}
int i = pre.executeUpdate();
if (i > 0){
System.out.println("更新成功");
}
}
查询测试
@Test
//采用公共类来查询数据
public void commentSelect() throws SQLException {
Object[] object = {"信息管理与信息系统"};
Connection con = JdbcUtils.getconnection();
String sql = "select STU_NAME from T_STUDENT where SYSDBA.T_STUDENT.STU_MAJOR = ?";
re = JdbcUtils.commentSelect(con, pre, sql, object);
while (true) {
if (!re.next()) break;
System.out.println("STU_NAME:" + re.getObject(1));
System.out.println();
}
JdbcUtils.release(con,pre, DmTest.re);
}
5.2 Statement 类的使用方法
@Test
//使用测试statement查询数据
public void selectStatement() throws SQLException {
Connection con = JdbcUtils.getconnection();
Statement statement = con.createStatement();
String sql = "select * from T_STUDENT";
ResultSet re = statement.executeQuery(sql);
while (true){
if (!re.next()) break;
System.out.println("姓名:"+re.getObject("STU_NAME")+"\t"+"学号:"+re.getObject("STU_NUMBER"));
}
//关闭资源
if (con != null){
con.close();
}
if (statement != null){
statement.close();
}
if (re != null){
re.close();
}
}
@Test
//使用测试statement插入数据
public void insertStatement() throws SQLException {
Connection con = JdbcUtils.getconnection();
Statement statement = con.createStatement();
String sql = "insert into t2 values(1,'xswl'),(2,'xktk')";
int i = statement.executeUpdate(sql);
if (i > 0){
System.out.println("插入成功");
}else {
System.out.println("插入失败");
}
//关闭资源
if (con != null){
con.close();
}
if (statement != null){
statement.close();
}
if (re != null){
re.close();
}
}
修改、更新、删除的操作与插入类似,这里就不再提供示例。
6、DM8-Mybatis
注意:需手动导入dm8jdbc驱动
6.1 创建maven项目配置依赖
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>mybatis</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>DM8-Mybatis</artifactId>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
6.2 配置jdbc配置文件jdbc.properties
driver = dm.jdbc.driver.DmDriver
url = jdbc:dm://localhost:5236/useSSL=false&userUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username = SYSDBA
password = wh17xktk!!
6.4 在pojo中编写数据库实体类
package pojo;
import java.util.Date;
/**
* @ClassName User
* @Description 用户实体类
* @Author 浩儿
* @Date 2021/5/31 19:41
* @Version V1.0
*/
public class User {
private Integer id;
private String userCode;
private String userName;
private String userPassword;
private Integer gender;
private Date birthday;
private String phone;
private String address;
private Integer userRole;
private Integer createdBy;
private Date creationDate;
private Integer modifyBy;
private Date modifyDate;
有参构造
无参构造
get,set方法
tostring方法
}
6.5 在util中编写mybatis工具类进行数据库连接
这里运用到了工厂模式SqlSessionFactory
package utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
/**
* @ClassName MybatisUtils
* @Description mybatis工具类
* @Author 浩儿
* @Date 2021/5/31 19:44
* @Version V1.0
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory ;
static {
try {
String resource = "mybatis-config.xml";
//Ressoures调用getResourceAsStream方法读取resource文件并将它加载成流
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建SqlSessionFactory工厂,以便获取Sqlsession.通过SqlSessionFactoryBuilder()类调用build方法构建SqlSessionFactory工厂。
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取sqlSession并返回。通过SqlSessionFactory工厂调用openSession()方法获取Sqlsession.注意Sqlsessoin中封装了所有SQL执行命令的方法。
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
6.6 在持久层编写接口类
package dao;
import pojo.User;
import java.util.List;
/**
* @ClassName Usermapper
* @Description 用户实体类
* @Author 浩儿
* @Date 2021/5/31 19:20
* @Version V1.0
*/
public interface UserMapper {
List<User>selectUser();
}
6.7 在持久层1编写接口对应的实现类xml文件
namespace表示命名空间即对应的接口路径,id表示要实现的方法,resultType表示结果集类型,select * from smbms_user表示数据库操作语句。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserMapper">
<select id="selectUser" resultType="pojo.T_User">
select * from MYSQL.T_USER
</select>
</mapper>
6.8 在test中编写测试类查看运行结果
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import pojo.User;
import utils.MybatisUtils;
import java.util.List;
/**
* @ClassName MybatisTest
* @Description mtbatis测试
* @Author 浩儿
* @Date 2021/5/31 20:00
* @Version V1.0
*/
public class MybatisTest {
@Test
public void selectUser(){
Gson gson = new Gson();
//调用MybatisUtils中的getSession()方法获取Sqlsession
SqlSession session = MybatisUtils.getSession();
//session调用getMapper方法获取接口对象
UserMapper mapper = session.getMapper(UserMapper.class);
//调用接口方法返回查询到的结果集
List<T_User> users = mapper.selectUser();
for (T_User user: users){
System.out.println(user);
}
String jsonListString = gson.toJson(users);
System.out.println(jsonListString);
session.close();
}
}
如果还有任何问题,欢迎到达梦在线服务平台提问!
社区 | 达梦在线服务平台https://eco.dameng.com