SSM-Mybatis笔记(1)- MyBatis3.X入门

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&amp;characterEncoding=utf-8&amp;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());
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容