[TOC]
SqlSource 说明
SqlSource
四种接口实现类的区别如下:
DynamicSqlSource
:动态SQL语句,包含动态SQL节点或者含有‘${}’占位符的语句
RawSqlSource
原生SQL语句。指非动态语句,语句中可能含有‘#{}’占位符,但不含有动态SQL节点,也不含有 '${}'占位符
StaticSqlSource
静态语句。语句中可能含有‘?’,可以直接提交给数据库执行
ProviderSqlSource
上面的几种都是通过XML文件获取到的SQL语句。而 providerSqlSource 是通过注解获取到的SQL语句
转换过程
ProviderSqlSource
---》BynamicSouce
| RawSqlSource
----〉StaticSqlSource
Statement说明
Statement
有一个子接口 PreparedStatement
而 PreparedStatement
也有一个子接口 CallableStatement
这三个依次对应设置SQL语句时的简单语句、预编译语句、存储过程语句
PreparedStatement
在Statement
的基础上,增加了一些 set 方法,能够按照参数位置对参数进行赋值。
CallableStatement
则在 PreparedStatement
的基础上进一步增加了方法。主要分为一下四类:
- 按照参数名称赋值方法:这一类方法能够为存储过程中指定名称的参数赋值。如
setInt(String , int)
- 注册输出参数方法方法:这一类方法能够向存储过程注册输出函数。
registerOuterParameter(int, int)
- 按照参数位置读取方法:这一类方法能够读取存储过程中指定位置的参数值。例如:
getInt(int)
- 按照参数名称读取值方法:这一类方法能够读取存储过程中指定名称的参数的值。例如:
getInt(string)
Executor 的实现类区别
-
CLosedExecutor
:一个仅能表征自身已经关闭的执行器,没有实际的功能。 -
SimpleExecutor
:一个最为简单的执行器 -
BatchExecutor
:支持批量执行功能的执行器 -
ReuseExecutor
:支持 statement 对象复用的执行器
Java.sql包和javax.sql包
java.sql
被称为 JDBC 核心API包,完成一次数据库操作的步骤如下:
- 建立
DriverManager
对象 - 从
DriverManager
对象中获取Connection
对象 - 从
Connection
对象中获取Statement
对象 - 将SQL语句交给
Statement
对象执行,并获取返回结果,结果通常放在ResultSet
中
javax.sql
被称为 JDBC 核心扩展包,它扩展了JDBC 核心包的功能,提供了对于服务端的支持,是Java企业版的重要部分
javax.sql 扩展了JDBC 核心包的功能,建议使用 DataSource
来获取 Connection 对象而不是直接使用DriverManager
对象。
- 建立
DataSource
对象 - 从
DataSource
对象中获取Connection
对象
从Connection
对象中获取Statement对象
- 将SQL语句交给
Statement
对象执行,并获取返回结果,结果通常放在ResultSet
中
Mybatis 操作数据与传统方式示例
Mybatis操作数据
public class Test {
public static void main(String[] args) throws IOException {
//声明配置文件地址
String resource = "mybatis-config.xml";
//得到输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sql会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//打开sql会话
SqlSession session = sqlSessionFactory.openSession();
//获取查询结果
List<User> lu = session.selectList("listUser");
for (User u : lu) {
System.out.println(u.getUser_name());
System.out.println(u.getUser_id());
System.out.println(u.getUser_phone());
System.out.println("------------------------");
}
}
}
传统JDBC操作数据:
public class JdbcTest {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加载mysql数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "");
// sql语句
String sql = "select * from user where userName = ?";
// 预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,针对sql中占位符中
preparedStatement.setString(1, "Tony");
// 发起查询
resultSet = preparedStatement.executeQuery();
User user = new User();
// 遍历查询结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String userName = resultSet.getString("userName");
int userAge = resultSet.getInt("userAge");
int sex = resultSet.getInt("sex");
String userAddress = resultSet.getString("userAddress");
// 封装结果为User对象
user.setId(id);
user.setUserName(userName);
user.setSex(sex);
user.setUserAge(userAge);
user.setUserAddress(userAddress);
}
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}