栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

我的第一个框架(MyBatis)

Java 更新时间:发布时间: 百科书网 趣学号

前言

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。

​ 简而言之,框架是软件(系统)的半成品,框架封装了很多的细节,使开发者可以使用简单的方式实现功能,大大提高开发效率。

一、MyBatis框架概述

1.mybatis 是一个优秀的基于 java 的==持久层框架==,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

​ mybatis 通过xml 或注解的方式将要执行的各种statement 配置起来,并通过java 对象和statement 中sql的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql并将结果映射为 java 对象并返回。

​ 采用 ORM 思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。

2.我们由于前面学习了jdbc现在我们可以回顾一下

public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //1.加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.通过驱动管理类获取数据库链接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123456"); 
            //3.定义 sql 语句 ?表示占位符
            String sql = "select * from user where username = ?";
            //4.获取预处理 statement
            preparedStatement = connection.prepareStatement(sql);
            //5.设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "王五");
            //6.向数据库发出 sql 执行查询,查询出结果集
            resultSet = preparedStatement.executeQuery();
            //7.遍历查询结果集
            while (resultSet.next()) {
                System.out.println(resultSet.getString("id") + "
                        "+resultSet.getString(" username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
		//8.释放资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

 3.jdbc问题分析:

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

  2. Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大, sql 变动需要改变java 代码。

  3. 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。

  4. 对结果集解析存在硬编码(查询列名), sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便

4.小结

MyBatis: 持久层的一个框架, 封装了JDBC. 操作数据库

二、Mybatis入门 1.需求

使用MyBatis查询所有的用户, 封装到List集合

2.分析
  1. 创建Maven工程(jar), 添加坐标

  2. 创建pojo

  3. 创建UserDao接口

  4. 创建UserDao映射文件

  5. 创建MyBatis核心配置文件SqlMapConfig.xml

  6. 编写java代码测试

3.实现 3.1准备工作
  • 数据库
CREATE DATABASE mybatis_day01;
USE mybatis_day01;
CREATE TABLE t_user(
		uid int PRIMARY KEY auto_increment,
		username varchar(40),
	 	sex varchar(10),
		birthday date,
		address varchar(40)
);

INSERT INTO `t_user` VALUES (null, 'zs', '男', '2018-08-08', '北京');
INSERT INTO `t_user` VALUES (null, 'ls', '女', '2018-08-30', '武汉');
INSERT INTO `t_user` VALUES (null, 'ww', '男', '2018-08-08', '北京');
3.2创建Maven工程

3.2.1创建Maven工程(jar)导入坐标


    
    
      org.mybatis
      mybatis
      3.4.5
    
    
    
      mysql
      mysql-connector-java
      5.1.6
    
  	
    
      junit
      junit
      4.10
      test
    
  

3.2.2创建User实体类

  • User .java

public class User implements Serializable{
    private int uid; //用户id
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
	
    //get和set方法略
}

3.2.3创建 UserDao 接口

  • UserDao 接口就是我们的持久层接口(也可以写成 UserMapper) .我们就写成UserDao ,具体代码如下:

 public interface UserDao { public List findAll();
}

3.2.4创建 UserDao.xml 映射文件

注意: 该文件要放在com/itheima/dao里面, 不要写成com.itheima.dao





    
    
        SELECT *FROM t_user
    

3.1.2Mapper.java(dao接口)

public interface UserDao {

    
    List findAll();

}

3.2.3测试

public class DbTest {
    @Test
    public void fun01() throws Exception {
        //1. 读取SqlMapConfig.xml获得输入流
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory(构建者模式)
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(is);
        //3. 获得SqlSession(工厂模式)
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.获得UserDao代理对象(代理模式)
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        //5.调用方法
        List list = userDao.findAll();
        System.out.println(list);
        //6.释放资源
        sqlSession.close();
    }
}
3.2规范

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace必须和mapper(Dao)接口的全限定名相同。

2、Mapper.xml文件中select,update等的标签id的值必须和mapper(Dao)接口的方法名相同

3、Mapper.xml文件中select,update等的标签的parameterType必须和mapper(Dao)接口的方法的形参类型对应

4, Mapper.xml文件中select,update等的标签的resultType必须和mapper(Dao)接口的方法的返回值类型对应

5, Mapper.xml文件的文件名尽量和mapper(Dao)接口的名字一样

6, Mapper.xml文件的路径尽量和mapper(Dao)接口的路径在同一层目录

四.核心配置文件详解 1.目标

掌握SqlMapConfig.xml配置文件

2.路径
  1. 核心配置文件的顺序

  2. properties

  3. typeAliases

  4. Mapper

3.讲解

3.1.核心配置文件的顺序

properties(引入外部properties文件)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

​ environment(环境子属性对象)

​ transactionManager(事务管理)

​ dataSource(数据源)

mappers(映射器)

3.2.properties

  • jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_day01?characterEncoding=utf-8
jdbc.user=root
jdbc.password=123456

引入到核心配置文件


   
    
    
    
        
            
            
                
                
                
                
            
        
    
    ....
3.3typeAliases(类型别名)

3.3.1定义单个别名

  • 核心配置文件


      
 

修改UserDao.xml


         SELECT  * FROM  user
3.4Mapper

3.4.1方式一:引入映射文件路径


     
 

3.4.2方式二:扫描接口

注: 此方式只能用作:代理开发模式,原始dao方式不能使用.

配置单个接口


 	

批量配置


   
五.日志

我们在使用MyBatis的时候, 其实MyBatis框架会打印一些必要的日志信息, 在开发阶段这些日志信息对我们分析问题,理解代码的执行是特别有帮助的; 包括项目上线之后,我们也可以收集项目的错误日志到文件里面去; 所有我们采用专门的日志系统来处理.

导入坐标



    log4j
    log4j
    1.2.12



    org.slf4j
    slf4j-api
    1.6.6



    org.slf4j
    slf4j-log4j12
    1.6.6

拷贝log4j.properties到resources目录

##设置日志记录到控制台的方式
log4j.appender.std=org.apache.log4j.ConsoleAppender
log4j.appender.std.Target=System.err
log4j.appender.std.layout=org.apache.log4j.PatternLayout
log4j.appender.std.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n

##设置日志记录到文件的方式
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=mylog.txt
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

##日志输出的级别,以及配置记录方案
log4j.rootLogger= trace,std,file	

级别:error > warn > info>debug>trace

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/957486.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号