1 使⽤原⽣jdbc访问数据库
- 原⽣jdbc访问数据库步骤
加载JDBC驱动程序
创建数据库的连接
创建preparedStatement
执⾏SQL语句
处理结果集
关闭JDBC对象资源 - Springboot项⽬测试原⽣JDBC连接
添加依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
编写main函数访问
public class JdbcApp {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
//连接
String url = "jdbc:mysql://hadoop101:3306/online_video?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String username = "root";
String password = "root";
//获取连接对象,并连接数据库
Connection connection = DriverManager.getConnection(url, username, password);
//获取语句对象
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from video");
while (resultSet.next()) {
System.out.println("视频标题:" + resultSet.getString("title"));
}
statement.close();
}
}
2 原⽣jdbc访问数据库缺点和ORM框架介绍
原⽣jdbc缺点
每次要加载驱动,连接信息是硬编码
sql和java代码耦合⼀起,改动不易
参数设置缺少灵活性
处理结果集麻烦,不能⾃动映射到实体类
连接资源不能复⽤,资源浪费什么是ORM框架
对数据库的表和POJO(Plain Ordinary Java Object)Java对象的做映射的框架
市⾯上常见的ORM框架
hibernate (ssh)
⽐较笨重,sql调优麻烦
推荐指数:不推荐JPA - Spring Data JPA
Java Persistence API, 轻量级,部分中⼩项⽬适合
推荐指数:次之mybatis
半⾃动化(半ORM框架),便于写sql,轻量级,在阿⾥等⼤⼚⼴泛使⽤
推荐指数:推荐
3 Mybatis3.x简介
- 什么是 MyBatis ?
MyBatis是Apahce的⼀个开源项⽬,它是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射,免除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作,通过简单的 XML 或注解来配置和映射 Java对象 到 数据库中的记录。 - Mybatis核心流程
每个基于 MyBatis 的应⽤都是以⼀个 SqlSessionFactory 的实例为核⼼,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得,SqlSessionFactoryBuilder 可以从 XML 配置⽂件或⼀个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例,⼯⼚设计模式⾥⾯ 需要获取SqlSession ,⾥⾯提供了在数据库执⾏ SQL 命令所需的所有⽅法
4 Mybatis3.X快速⼊⻔示例
- 创建springboot项目
- 创建POJO对象类
public class Video implements Serializable {
private Integer id;
private String title;
private String summary;
private Integer price;
@JsonProperty("cover_img") // 给字段取别名
private String coverImg;
@JsonFormat(pattern="yyyy-MM-dd hh:mm:ss",locale="zh",timezone="GMT+8")
@JsonProperty("create_time")
private Date createTime;
@JsonProperty("chapter_list")
private List<Chapter> chapterList;
...
- 在resources目录下创建config和mapper目录
- 编写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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://hadoop101:3306/online_video?useUnicode=true&characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/VideoMapper.xml"/>
</mappers>
</configuration>
- 编写VideoMapper.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">
<!--
namespace: 名称空间,一般需要保持全局唯一, 最好是和dao层的java接口一致,
可以映射 sql语句 到对应的方法名称和参数、返回类型
mybatis是使用接口动态代理
-->
<mapper namespace="com.jackyan.springbootdemo2.mapper.VideoMapper">
<!--
statement sql
id: 当前mapper下需要唯一
resultType : sql查询结果集的封装
-->
<select id="selectById" resultType="com.jackyan.springbootdemo2.domain.Video">
select * from video where id = #{video_id}
</select>
<select id="selectListByXML" resultType="com.jackyan.springbootdemo2.domain.Video">
select * from video
</select>
</mapper>
- 获取参数中的值
注意 :取java对象的某个值,属性名⼤⼩写要⼀致
#{value} : 推荐使⽤, 是java的名称
${value} : 不推荐使⽤,存在sql注⼊⻛险
- 编写mapper类VideoMapper
@Repository
public interface VideoMapper {
/**
* 根据视频id查找视频对象
* @param videoId
* @return
*/
public Video selectById(@Param("video_id") int videoId);
/**
* 查询全部视频列表
* @return
*/
List<Video> selectListByXML();
/**
* 通过注解查询全部视频列表
* @return
*/
@Select("select * from video")
List<Video> selectList();
}
- 编写测试类SqlSessionDemo测试
public class SqlSessionDemo {
public static void main(String [] args) throws IOException {
String resouce = "config/mybatis-config.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resouce);
//构建Session工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取Session
try(SqlSession sqlSession = sqlSessionFactory.openSession()){
VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
// 通过id获取视频信息
// Video video = videoMapper.selectById(44);
// System.out.println(video.toString());
// 通过注解获取视频信息
List<Video> videoList = videoMapper.selectList();
// List<Video> videoList = videoMapper.selectListByXML();
//
System.out.println(videoList.toString());
}
}
}
- 通过注解读取(如果sql简单,没有过多的表关联,则⽤注解相对简单)
# VideoMapper.java
/**
* 通过注解查询全部视频列表
* @return
*/
@Select("select * from video")
List<Video> selectList();
# SqlSessionDemo.java
// 通过注解
List<Video> videoList = videoMapper.selectList();
System.out.println(videoList.toString());