JDBC编程的完整步骤请参考:JDBC编程,这里以一个JDBC的实例类来说明:
import java.sql.*;
public class JDBC_Demo {
public static void main(String[] args) throws Exception {
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
try {
//加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
String DB_URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "123456";
connection = DriverManager.getConnection(DB_URL, USER, PASS);
//获取Statement
statement = connection.createStatement();
String sql = "SELECT * FROM Student where SID=1 ";
//执行查询操作
rs = statement.executeQuery(sql);
//处理结果集
while (rs.next()) {
String sid = rs.getString("SID");
String sname = rs.getString("Sname");
String ssex = rs.getString("Ssex");
String sage = rs.getString("Sage");
System.out.println(sid + ":" + sname + ":" + ssex + ":" + sage);
}
} finally {
//关闭资源、释放连接
if (rs != null)
rs.close();
if (statement != null)
statement.close();
if (connection != null)
connection.close();
}
}
}
问题分析:
1、在使用JDBC操作数据库前进行连接、操作完成之后关闭连接,造成系统资源浪费
,从而影响系统性能,对并发性能有很大的影响。
2、SQL语句硬编码
在Java代码中,需求改变需要改变Java代码本身。
3、使用 preparedStatement 向占有位符号传参数存在硬编码
,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
4、对结果集解析存在硬编码
(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。
MyBatis属于SQL映射框架;而Hibernate属于ORM框架。
Hibernate是一个全自动ORM(Object Relation Mapping
),旨在消除SQL。但这也是把双刃剑,直接造成了herbinate的优化成本高,因为其无法支持定制化SQL。
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis封装了JDBC的很多细节,使开发者只需要关注sql语句本身,无需关注注册驱动,创建连接等繁杂过程。使用了ORM思想实现了结果集的封装。
sql语句与代码分离,存放于xml配置文件中。
查询的结果集与java对象自动映射。
需编写原生SQL。
通过实际业务来研究:通过SID查询学生信息。
这里是通过maven
来管理MyBatis框架。
# 创建数据库
CREATE DATABASE test;
#创建表
CREATE TABLE `Student` (
`SID` int(11) NOT NULL,
`Sname` varchar(25) NOT NULL,
`Ssex` varchar(4) DEFAULT NULL,
`Sage` int(11) DEFAULT NULL,
PRIMARY KEY (`SID`),
UNIQUE KEY `SID` (`SID`),
KEY `idx_name` (`Sname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
#数据
mysql> select * from Student;
+-----+----------+------+------+
| SID | Sname | Ssex | Sage |
+-----+----------+------+------+
| 1 | zhaol | nan | 21 |
| 2 | qiandian | nan | 20 |
| 3 | sunfen | nan | 21 |
| 4 | wulan | nv | 18 |
| 5 | CJ1210 | 1 | 11 |
| 6 | LG1213 | NULL | 2 |
| 7 | CJ1210 | 1 | NULL |
| 8 | GY1803 | NULL | NULL |
+-----+----------+------+------+
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.32version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.1version>
dependency>
这里主要修改驱动名和数据库名,数据库账号密码等。格式较为固定。
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
mappers>
configuration>
//数据库中Student表对应的映射Java对象类
public class Student {
private Integer SID;
private String Sname;
private String Ssex;
private Integer Sage;
//省略getter和setter方法
}
public interface StudentMapper {
/**
* 通过SID查询数据实体
* @param sid
* @return
*/
public Student selectStudentByID(int sid);
}
<mapper namespace="com.tulun.MybatisDemo.StudentMapper">
<select id="selectStudentByID" resultType="com.tulun.MybatisDemo.Student">
select * from Student where SID = #{sid}
select>
mapper>
相关配置信息可查看:MyBatis官网配置信息
#{ }:占位符,向占位符中输入参数时,可以自动完成Java类型和数据库类型的映射
。
${ }:取值符,将参数原封不动的取出来
,与sql语句拼接。(缺点,不能防止sql注入)
两种方式都可以获取JavaBean中的属性,都使用了OGNL表达式。
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
## debug 级别
log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t] [%c] [%p] - %m%n
log4j.logger.com.mybatis=DEBUG /
##输出sql 语句
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
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 java.io.IOException;
import java.io.InputStream;
public class MybatisTLDemo {
public static void main(String[] args) throws IOException {
//mybatis配置文件
String resource = "mybatis-config.xml";
//通过mybatis提供的Resources类来得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传输mybatis配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过反射机制来获取对应mapper实例
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//调用mapper实例下方法
Student student = mapper.selectStudentByID(1);
System.out.println(student);
}
}
日志信息 | 日志分析 |
---|---|
Opening JDBC Connection | 打开JDBC链接 |
Created connection 22660280 | 创建连接 |
Setting autocommit to false on JDBC Connection | 事务自动提交失败 |
Preparing: select * from Student where SID = ? | SQL语句 |