[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();
}
}
}
}








网友评论