JDBC

java data base connectivity ,全称,是一项数据库连接技术。

作用:通过java给的一系列接口去实现java连接数据库的crud (增删改查)操作。

1.java提供的一系列接口包括:

    数据库连接接口 Connection
    处理sql语句接口 Statement、PreparedStatement
    结果集接口 ResultSet
    接口:CallableStatement  调用存储过程准备的。

PreparedStatement和Statement和CallableStatement的区别:

    Statement对象:
    可以对数据库进行批量处理,同时支持sql语句的拼接。是父级接口。
    PreparedStatement对象:
    可以对sql语句进行预编译,将sql语句变成Java代码,使sql语句更加灵活。
    劣势:容易引起sql语句注入,从而使sql语句安全性降低。
    CallableStatement对象:
    可以对数据库的存储过程进行调用的处理对象。

2.调用存储过程

JDBC连接存储过程"CallableStatement接口调用存储过程"

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection= DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","JAVATEST","123456");
//定义调用procedure的命令,test是存储过程名
String sql ="{call test(?,?)}";
CallableStatement cstm = connection.prepareCall(sql);
cstm.setInt(1, 1);
//输出类型参数需要注册返回值数据类型
cstm.registerOutParameter(2, Types.VARCHAR);
//将sql语句提交给数据库进行相关处理,
cstm.execute();
//通过输出类型的参数取值
String string = cstm.getString(2);
System.out.println(string);

通过JDBC连接存储过程输出结果集

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection= DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","JAVATEST","123456");
//定义调用procedure的命令,test是存储过程名
String sql ="{call test(?)}";
CallableStatement cstm = connection.prepareCall(sql);
//输出类型参数需要注册返回值数据类型,OracleTypes.CURSOR
cstm.registerOutParameter(1, OracleTypes.CURSOR);
//将sql语句提交给数据库进行相关处理,
cstm.execute();
//通过输出类型的参数取值
ResultSet rs = (ResultSet)cstm.getObject(1);
while (rs.next()) {
    System.out.println(rs.getString(2));
}

Mybatis连接存储过程

		SqlSession sqlSession = MybatisUtil.getSqlSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		BugUser bugUser = new BugUser();
		bugUser.setUser_type(1);
		
		mapper.selectBytype(bugUser);
		
		List<BugUser> bugusers = bugUser.getBuguser();
		for (BugUser bugUser2 : bugusers) {
			System.out.println(bugUser2);
		}
接口对应的xml内容:
	<resultMap type="com.easy.model.BugUser" id="userMap">
		<result property="user_id" column="user_id"/>
		<result property="user_name" column="user_name"/>
		<result property="user_password" column="user_password"/>
		<result property="user_type" column="user_type"/>
	</resultMap>
	<!-- List<BugUser> selectBytype(BugUser bugUser); 根据账户类型查询账户信息
		buguser是在BugUser中定义的集合接cursor的值
	-->
	<select id="selectBytype" statementType="CALLABLE">
		{call test3(#{user_type,mode=IN,jdbcType=INTEGER},
		 #{buguser,jdbcType=CURSOR,mode=OUT,javaType=resultSet,resultMap=userMap})
		}
	</select>

解释如下:
	<!--调用procedure使用 select标签,声明statement类型为CALLABLE
		调用命令的格式:{call 存储过程名(参数)}
		参数格式:#{方法参数成员变量,jdbcType=数据库类型,mode=参数类型(IN/OUT)}
		如果输出参数是游标,则额外声明两个属性:javaType=resultSet(Java类型,结果集对应的是resultSet)
							resultMap=是实体类中,接游标数据的集合的泛型与结果集列名的映射
		Java中的数据库类型	对应的	Oracle数据类型
			VARCHAR         		 VARCHAR / VARCHAR2 /VARCHAR
			INTEGER                  NUMBER
			CURSOR                   SYS_REFCURSOR
	-->
	
实体类中需要额外定义一个集合,用来接游标:
	//定义一个集合用来接游标
	private List<BugUser> buguser;

JDBC连接数据库字符串

oracle
    driverClass:oracle.jdbc.driver.OracleDriver
    url:jdbc:oracle:thin:@127.0.0.1:1521:dbname
mysql
    driverClass:com.mysql.jdbc.Driver

    PS:有的时候,mysql的驱动类也也会看到使用org.gjt.mm.mysql.Driver的情况,org.gjt.mm.mysql.Driver是早期的驱动名称,后来就改名为com.mysql.jdbc.Driver,现在一般都推荐使用 com.mysql.jdbc.Driver。在最新版本的mysql jdbc驱动中,为了保持对老版本的兼容,仍然保留了org.gjt.mm.mysql.Driver,但是实际上 org.gjt.mm.mysql.Driver中调用了com.mysql.jdbc.Driver,因此现在这两个驱动没有什么区别。
    url:jdbc:mysql://localhost:3306/mydb
DB2
    driverClass:com.ibm.db2.jcc.DB2Driver
    url:jdbc:db2://127.0.0.1:50000/dbname
sybase
    driverClass:com.sybase.jdbc.SybDriver
    url:jdbc:sybase:Tds:localhost:5007/dbname
PostgreSQL
    driverClass:org.postgresql.Driver
    url:jdbc:postgresql://localhost/dbname
Sql Server2000
    driverClass:com.microsoft.jdbc.sqlserver.SQLServerDriver
    url:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname
Sql Server2005
    driverClass:com.microsoft.sqlserver.jdbc.SQLServerDriver
    url:jdbc:sqlserver://localhost:1433; DatabaseName=dbname

后续继续补充

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神lwz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值