文章目录
1、JDBC编程和存在问题
- JDBC编程详解前面已经写过了这里就不细说了,详情请点击:JDBC编程
public class JDBCDemo {
/**
* 1、引入依赖驱动包
* mysql-connector-java
* 2、加载驱动
* Class.forName("");
* 3、连接数据库,获取Connection
* url:jdbc:mysql/ip+port(3306)/数据库名
* username:
* password:
* Connection connection = DriverManager.getConnetion();
*
* 4、获取Statement对象
* Statement statement = connection.createStatement();
*
* 5、执行数据库的操作(CRUD)
* statement.executorQuery();
*
* 6、获取结果集:ResultSet
*
* 7、关闭资源
* statement.close();
* connection.close();
*/
//第一步:导入jar包
//第二步:说明JDBC驱动的名称和数据库的地址
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/test";
//第三步:说明数据库的认证账户及密码
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
//第四步:加载数据库驱动.通常使用Class.forClass(String driverName);加载
try {
Class.forName(JDBC_DRIVER);
} catch (ClassNotFoundException e) {
//这里会发生类没有找到的异常!
e.printStackTrace();
}
//第五步:获得数据库连接
try {
//获取连接
Connection connection = DriverManager.getConnection(DB_URL,USER,PASS);
//第六步:执行查询语句
Statement statement = connection.createStatement();
String sql = "SELECT * FROM Student where SID=1 ";
ResultSet rs =statement.executeQuery(sql);
while (rs.next())
{
String title = rs.getString("SID");
String author = rs.getString("Sname");
System.out.println(title+":"+author);
}
//第七步:关闭连接资源
rs.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
//这里会发生SQL异常,因为我们提供的的账户和密码不一定能连接成功
}
}
JDBC 存在的问题:
总结如下:
- 1、数据库链接创建,释放频繁的操作造成系统的资源浪费,从而影响系统性能。
- 解决方法: (复用链接),通过连接池来解决,mybatis也能够进行链接的复用。
- 2、SQL语句在代码中硬编码,造成代码不易维护,实际的应用SQL变化是很大,SQL的改变时要引起java代码的改变
- 解决方法:SQL和java代码分离,SQL语句防止在配置文件中(xml),需求改变仅需要改变配置文件即可 。
- 3、对结果集的解析存在硬编码(查询列名),SQL改变导致解析代码也会发生改变,系统是不易维护
- 解决方法:数据库中的数据映射成Java对象
2、MyBatis介绍
- 1、MyBatis 是一款优秀的持久层框架。(MyBatis属于SQL映射框架;而Hibernate属于ORM框架)
- 2、它支持自定义 SQL、存储过程以及高级映射。
- 3、MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- 4、MyBatis 可以通过简单的 XML 或 注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
参考mybatis资料:MyBatis参考文档
3、MyBatis原理
Mybatis框架的特点
1、SQL语句与代码分离,存放于xml配置文件中。
- 优点:解除SQL与程序代码的耦合,便于维护管理。
- 缺点:降低了代码可读性,而且不利于调试。
2、查询的结果集与java对象自动映射。
- 优点:保证名称相同,配置好映射关系即可自动映射;不配置映射关系,通过配置列名=字段名也可完成自动映射。
- 缺点:对开发人员所写的SQL依赖很强。
3、需编写原生SQL。
- 优点:接近JDBC,比较灵活。
- 缺点:对SQL语句依赖程度很高,并且数据库移植比较麻烦。
4、MyBatis使用
(1)引入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!--mybatis配置-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
(2)全局配置文件(mybatis-config.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<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/Student23Mapper.xml"/>
</mappers>
(3)PoJo类(Student23.java)
public class Student23 {
private Integer SID;
private String Sname;
private String Ssex;
private String Sage;
//getter; setter ;to String
}
注意:Pojo类中的属性名和数据库中的类中的列名保持一一对应,可自动完成映射
(4)Mapper接口文件(Student23Mapper.java)
public interface Student23Mapper {
//通过id查询学生信息
public Student23 selectStudentByUid(Long uid);
}
(5)Mapper.xml文件(Student23Mapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper:根标签,namespace:命名空间,接口文件的全路径-->
<mapper namespace="com.tulun.inteface.Student23Mapper">
<!-- 通过id查询学生信息-->
<select id="selectStudentByUid" parameterType="long" resultType="com.tulun.pojo.Student23">
select * from Student where SID = #{uid}
</select>
</mapper>
-
#{ }:占位符,向占位符中输入参数时,可以自动完成Java类型和数据库类型的映射。
-
${ }:取值符,将参数原封不动的取出来,与sql语句拼接。(缺点,不能防止sql注入)
-
两种方式都可以获取JavaBean中的属性,都使用了OGNL表达式。
(6)添加日志
日志依赖jar包
<!--log4j日志文件-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
日志配置文件
创建log4j.properties
文件
## 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
(7)查询操作
import com.tulun.inteface.Student23Mapper;
import com.tulun.pojo.Student23;
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 MybatisDemo {
public static void main(String[] args) throws IOException {
//获取全局配置文件
String path = "mybatis-config.xml";
//通过mybatis提供共的Resources类来获取配置文件流
InputStream inputStream = Resources.getResourceAsStream(path);
//获取SQLSessionFactory对象
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取会话工厂
SqlSession sqlSession = sessionFactory.openSession();
//通过反射机制来后去到mapper的实例
Student23Mapper student23Mapper = sqlSession.getMapper(Student23Mapper.class);
Student23 student23 = student23Mapper.selectStudentByUid(1L);
System.out.println(student23);
sqlSession.close();
}
}
使用步骤总结:
- 1、配置一个全局的配置文件数据源、引入映射文件)
- 2、创建SQLSessionFactory对象(mybatis通过SqlSessionFactoryBuilder创建)
- 3、通过会话工厂创建SQLSession会话
- 4、通过SQLSession操作数据库
- 5、管理会话SQLSession
(8)执行结果
目录结构:
结果: