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
后续继续补充