您的位置:首页 > 其它

MyBatis学习记录(一)之实现基本的增删改查

2020-01-14 21:41 232 查看

文章目录

  • MyBatis开发步骤(简化)
  • MyBatis开发步骤(动态代理)
  • MyBatis学习记录之实现基本的增删改查

    框架的三层架构

    三层架构包含的三层:

    1. 界面层(表示层,视图层)(User Interface layer): 主要功能是接受用户的数据,显示请求的处理结果。使用 web 页面和
      用户交互,手机 app 也就是表示层的,用户在 app 中操作,业务逻辑在服务器端处理。
    2. 业务逻辑层(Business Logic Layer):接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。
    3. 数据访问层(Data access layer):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交
      给业务层,同时将业务层处理的数据保存到数据库.

    三层的处理请求的交互:

    用户—> 界面层—>业务逻辑层—>数据访问层—>DB 数据库

    MyBatis开发步骤(初步)

    1. 创建Maven工程,加入MyBatis依赖
    2. 创建数据库中表对应的实体类
    3. 创建接口
    4. 创建接口对应的.xml配置文件(mapper文件)
    5. 在resources中创建.xml主配置文件
    6. 编写测试方法

    1.创建Maven工程,加入MyBatis依赖

    在pom.xml加入 :

    1. maven坐标
    2. junit的依赖
    3. mybatis依赖
    4. mysql驱动依赖
    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.bjpowernode</groupId>
    <artifactId>ch01-first-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <name>ch01-first-mybatis</name>
    <url>http://www.example.com</url>
    
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <dependencies>
    <!--junit依赖-->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    <!--mybatis依赖-->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.1</version>
    </dependency>
    <!--mysql驱动-->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
    </dependency>
    
    </dependencies>
    
    <build>
    <!--资源文件-->
    <resources>
    <resource>
    <directory>src/main/java</directory><!--所在的目录-->
    <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
    <include>**/*.properties</include>
    <include>**/*.xml</include>
    </includes>
    <filtering>false</filtering>
    </resource>
    </resources>
    
    <!--指定maven编译程序时使用的jdk版本-->
    <plugins>
    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>

    2.创建数据库中表对应的实体类

    3.创建接口(dao)

    ProvinceDao接口:

    public interface ProvinceDao {
    //定义对数据库的操作方法
    
    //查询数据库的所有数据
    List<Province> selectProvinces();
    
    //添加数据
    //返回值是表示对数据库影响的行数
    public int insertProvince(Province province);
    
    //更新
    //返回值是表示对数据库影响的行数
    public int updateProvince(Province province);
    
    //删除
    //返回值是表示对数据库影响的行数
    public int deleteProvinceById(Integer id);
    }

    4.创建mybatis使用的mapper文件

    注意

    1. mapper文件是xml格式的,也叫做映射文件
    2. 在mapper文件中写sql语句,MyBatis会执行这些sql语句
    3. mapper文件可以有多个,一般是一个表一个mapper文件
    4. mapper文件名称和dao接口名一样,区分大小写
    5. mapper文件和dao接口在同一目录

    ProvinceDao.xml:

    mapper文件中的约束文件:mybatis-3-mapper.dtd,扩展名为 .dtd

    约束文件作用:

    1. 定义在当前文件中可以使用的标签属性
    2. 定义标签,属性的出现顺序次数
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    mapper是根元素

    属性:

    namespace
    :表示命名空间,目的是给当前文件中的各个sql起一个唯一标识值
    namespace的值是自定义的, 可以a,b,c。推荐使用dao接口的全限定名称

    <mapper namespace="com.bjpowernode.dao.ProvinceDao">

    mapper内部写sql语句,不同的sql语句使用不同的标签

    • 查询select ---- <select>
    • 更新update ----<update>
    • 插入insert ----<insert>
    • 删除delete ----<delete>

    查询:

    select标签是表示执行select操作。

    语法:<select> select 语句</select>

    属性:

    • id
      :sql语句的唯一标识,可以自定义,推荐使用接口中的方法名称。当执行sql语句时,mybatis使用 namespace + id的值唯一标识一条sql语句

    • resultType
      :表示sql语句执行后,转为java对象的类型。
      推荐使用类型的全限定名称(包名加类名)
      mybatis的操作是执行sql语句,使用PreparedStatement.
      把查询的结果转为resultType指定的类,创建这个类的java对象,并把列的值赋值给同名的属性。

    <select id="selectProvinces" resultType="com.bjpowernode.domain.Province">
    select * from province;
    </select>

    添加:

    mybatis使用占位符,获取传入到xml文件中的数据

    #{java对象的属性名}
    : 表示获取这个属性的值,放到sql语句中。等同于PreparedStatment对象的
    ?

    <insert id="insertProvince">
    insert into student values(#{id},#{name},#{email},#{age})
    </insert>
    
    <!--更新 update -->
    <update id="updateProvince">
    update student set age=#{age} where id=#{id}
    </update>

    删除:

    当你的dao中,方法的参数是一个简单类型的数据时,在mapper文件中,使用这个参数值语法是

    #{任意变量名}


    简单类型:java的
    基本数据类型
    String

    <delete id="deleteProvinceById">
    delete from student where id=#{studentId}
    </delete>
    </mapper>

    5.在resources中创建.xml主配置文件

    1. 主配置文件是一个xml文件
    2. 主配置文件定义内容: 定义别名
    3. 定义数据库的连接信息
    4. 指定mapper文件的位置
    <?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>
    
    <!--配置mybatis日志,可以打印sql执行信息-->
    <settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--mybatis主配置文件: 指定连接数据库的信息
    environments:配置环境,一个环境表示连接的一个数据库的信息
    default:默认使用的环境名称
    -->
    <environments default="mysql">
    <!--第一个环境,id是自定义的环境名称,表示一个数据库的连接信息-->
    <environment id="mysql">
    <!--指定事务类型
    type:指定事务类型的具体值, 使用JDBC
    JDBC:表示使用jdbc中Connection对象的,事务提交commit, 回滚rollback
    -->
    <transactionManager type="JDBC"></transactionManager>
    <!--指定数据库的连接信息, 创建Conenction对象
    type:指定数据库连接的类型,有三个值
    POOLED:使用数据库的连接池
    -->
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
    <property name="username" value="root"/>
    <property name="password" value="123"/>
    </dataSource>
    </environment>
    </environments>
    
    <!--指定mapper文件的位置-->
    <mappers>
    <mapper resource="com/bjpowernode/dao/ProvinceDao.xml"/>
    </mappers>
    </configuration>

    6.编写测试方法

    public class Test {
    public static void main(String[] args) {
    //使用mybatis提供的方法操作数据库
    //1.指定mybatis主配置文件的位置, 放在resources目录下
    String config = "mybatis.xml";
    
    //2.读取主配置文件的内容
    InputStream in = null;
    try {
    in = Resources.getResourceAsStream(config);
    } catch (IOException e) {
    e.printStackTrace();
    }
    
    //3.创建mybatis中的对象 SqlSessionFactory
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);
    
    //4.获取SqlSession对象,使用SqlSession执行sql语句。
    SqlSession sqlSession = factory.openSession();
    
    //5.执行sql语句, 使用sql语句的唯一标识
    //namesapce + 每个sql语句自己的id
    String sqlid = "com.bjpowernode.dao.ProvinceDao.selectProvinces";
    List<Province> provinces = sqlSession.selectList(sqlid);
    
    //6.显示查询结果
    //students.forEach( stu -> System.out.println(stu));
    System.out.println(provinces);
    
    //7.关闭资源
    sqlSession.close();
    }
    }

    MyBatis开发步骤(简化)

    对于上面的步骤,main方法中的步骤大部分是固定的,可以将他们封装成一个工具类,减少代码量

    1. 将测试方法中的固定写法封装到一个工具类中
    public class MyBatisUtil {
    
    //定义一个全局的 SqlSessionFactory对象
    private  static SqlSessionFactory factory;
    static {
    String config="mybatis.xml";
    InputStream in = null;
    try {
    in = Resources.getResourceAsStream(config);
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    factory = builder.build(in);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    
    //定义方法获取SqlSession对象
    public  static SqlSession getSqlSession(){
    SqlSession sqlSession = null;
    if( factory != null){
    sqlSession = factory.openSession();
    }
    return sqlSession;
    }
    }
    1. 用工具类对数据库进行增删改查
    public class MyTest {
    //测试update
    @Test
    public void testUpdateProvince() throws IOException {
    //1.通过工具类获取sqlSession
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    
    //2.执行sql语句, 使用sql语句的唯一标识
    //  namesapce + 每个sql语句自己的id
    String id="updateProvince";
    String sqlid="com.bjpowernode.dao.ProvinceDao." + id;
    
    Province province= new Province();
    province.setId(1003);
    province.setAge(26);
    
    int rows = sqlSession.update(sqlid,province);
    System.out.println("updateStudent 返回的rows:"+rows);
    //3.提交事务, mybatis默认的操作是不自动提交事务。需要手工执行
    sqlSession.commit();
    //4.关闭资源
    sqlSession.close();
    }

    MyBatis开发步骤(动态代理)

    • 使用mybatis提供的动态代理对象,执行数据库的操作:

      mybatis内部使用动态代理,创建接口的实现类对象,在动态创建的对象中,调用SqlSession的方法访问数据库。
    • 使用动态代理要求
        dao接口和mapper文件名称要一样,放在同一目录
      1. mapper文件中的 namespace属性是接口的全限定名称
      2. mapper文件中的id和接口中的方法名称一样。

    使用动态代理MyBatis开发步骤与之前的开发步骤基本一致,唯一的不同是在最后一步的测试中,调用

    SqlSession
    的实例方法
    getMapper()
    创建动态代理类对象:

    接口类型的对象 = sqlSession.getMapper(接口的.class);


    然后再调用接口对象的方法,就相当于执行了mapper文件中的 id对应的sql语句

    public class MyTest {
    @Test
    public void testSelectStudents(){
    //使用mybatis的动态代理技术
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    //根据接口获取他的对象
    ProvinceDao dao = sqlSession.getMapper(ProvinceDao.class);
    //调用dao的方法
    List<Province> provinces = dao.selectProvinces();
    provinces.forEach( stu-> System.out.println(stu));
    }
    }
    • 通过dao,动态代理对象,执行方法的内部原理:
        dao执行方法时,方法名称就是mapper中的 id
      1. dao的数据类型,可以根据getMapper(接口的.class)能够获取到接口的全限定名称 com.bjpowernode.dao.StudentDao这个接口的全限定名称和mapper文件中的namespace是一样的。
      2. mybatis根据 接口的类型 + 方法名称就可以组成 要执行的是sql语句的id
    • 点赞 1
    • 收藏
    • 分享
    • 文章举报
    一名小码农 发布了42 篇原创文章 · 获赞 45 · 访问量 1362 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: