zoukankan      html  css  js  c++  java
  • MyBatis自学(2):MyBatis初识

     什么是MyBatis

       简单来说,MyBatis是一个实现了数据库持久化的开源框架,支持三种语言:Java、.Net以及Ruby。当然我们只关心Java的使用,所以可以将MyBatis理解为一个JDBC的封装框架。

      我们知道Java开发经常使用到的JDBC封装框架就是Hibernate和MyBtis,那么他们有什么区别和共同点?

      MyBatis和Hibernate都是ORM(Object Relational Mapping 对象关系映射)框架。

      MyBatis是“半自动化”的ORM实现,这里的半自动化是相对于Hibernate提供的全面数据库封装机制的“全自动化”ORM实现而言,“全自动化”实现了POJO和数据库表之间的映射,以及sql的自动生成和执行。

      而MyBatis的关注点,在于POJO和sql之间的映射关系。

      MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索。MyBatis可以使用简单的xml或者注解用于配置和原始映射。通过接口将JavaBean映射成数据库中的记录。

      MyBatis框架的优点:

    1.  与JDBC相比,减少了50%的代码量。
    2.  MyBatis是最简单的持久化框架,小巧并且简单易学。
    3.  MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在xml中,从程序代码中彻底分离,降低耦合度,便以统一管理和优化,并可重用。
    4.  提供xml标签,支持编写动态sql语句。
    5.  提供映射标签,支持对象与数据库的ORM字段关系映射。

      MyBatis框架的缺点:

    1.  SQL语句编写工作量大,尤其是字段对、表关联多的时候,对开发人员的SQL语句功底有一定要求。
    2.  因为都是SQL语句编写,SQL语句依赖数据库,导致移植性比较差,不能随便更换数据库。

      MyBatis框架使用场景:

      MyBatis专注与SQL本身,是一个足够灵活的DAO层解决方案。对性能要求很高,或者需求变化比较多的项目,如互联网项目,MyBatis是一个不错的选择。

     快速入门

      1:搭建环境,maven配置MyBatis依赖jar包。

    1 <dependency>
    2     <groupId>org.mybatis</groupId>
    3     <artifactId>mybatis</artifactId>
    4     <version>3.4.5</version>
    5 </dependency>
    6 <dependency>
    7     <groupId>mysql</groupId>
    8     <artifactId>mysql-connector-java</artifactId>
    9 </dependency>

      2:新建数据表

    1 CREATE TABLE `t_user` (
    2   `id` int(11) NOT NULL DEFAULT '0',
    3   `username` varchar(50) DEFAULT NULL,
    4   `password` varchar(50) DEFAULT NULL,
    5   PRIMARY KEY (`id`)
    6 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

      3:创建对应的实体类User

     1 package com.yulei.mybaits.model;
     2 
     3 /**
     4  * 实体类User
     5  * @author 码农小菜鸡
     6  *
     7  */
     8 public class User {
     9 
    10     private int id;
    11     private String username;
    12     private String password;
    13     
    14     public int getId() {
    15         return id;
    16     }
    17     public void setId(int id) {
    18         this.id = id;
    19     }
    20     public String getUsername() {
    21         return username;
    22     }
    23     public void setUsername(String username) {
    24         this.username = username;
    25     }
    26     public String getPassword() {
    27         return password;
    28     }
    29     public void setPassword(String password) {
    30         this.password = password;
    31     }
    32     
    33 }

      4:添加MyBatis的配置文件config.xml(文件名可自定义)。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     3   "http://mybatis.org/dtd/mybatis-3-config.dtd">
     4 <configuration>
     5   <environments default="development">
     6     <environment id="development">
     7       <transactionManager type="JDBC"/>
     8       <dataSource type="POOLED">
     9         <property name="driver" value="com.mysql.jdbc.Driver"/>
    10         <property name="url" value="jdbc:mysql://219.235.1.148:3306/school?characterEncoding=utf-8"/>
    11         <property name="username" value="root"/>
    12         <property name="password" value="123456"/>
    13       </dataSource>
    14     </environment>
    15   </environments>
    16 </configuration>  

      5:MyBatis开发有两种方式:

    • 使用原生接口,Mapper代理实现自定义接口。

        (1):创建Mapper文件UserMapper.xml。

          出于规范,namespcae通常设置为 包名 + 文件名。

          parameterType为参数的数据类型。

          resultType为返回值数据类型。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper
     3     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <mapper namespace="com.yulei.mybatis.model.mapper.userMapper">
     6 
     7     <select id="getUserById" parameterType="int" resultType="com.yulei.mybaits.model.User">
     8         select * from t_user where id = #{id}
     9     </select>
    10 
    11 </mapper>

        (2):在全局配置文件 config.xml 中注册userMapper.xml。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     3   "http://mybatis.org/dtd/mybatis-3-config.dtd">
     4 <configuration>
     5   <environments default="development">
     6     <environment id="development">
     7       <transactionManager type="JDBC"/>
     8       <dataSource type="POOLED">
     9         <property name="driver" value="com.mysql.jdbc.Driver"/>
    10         <property name="url" value="jdbc:mysql://219.235.1.148:3306/school?characterEncoding=utf-8"/>
    11         <property name="username" value="root"/>
    12         <property name="password" value="123456"/>
    13       </dataSource>
    14     </environment>
    15   </environments>
    16   
    17   <mappers>
    18       <mapper resource="com.yulei.mybatis.model.mapper.userMapper.xml" />
    19   </mappers>
    20 </configuration>  

      (3):测试类调用原生接口执行SQL语句获取结果。

     1 public class Test {
     2 
     3     @org.junit.Test
     4     public void TestMyBatis() {
     5         String resource = "config.xml";
     6         try {
     7             InputStream inputStream = Resources.getResourceAsStream(resource);
     8             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
     9             SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
    10             //获取sqlsession
    11             SqlSession session = sqlSessionFactory.openSession();
    12             //调用MyBatis原生接口执行sql
    13             //statemt为userMapper.xml多的 namespcae值 + “.” + select标签的id值
    14             String statemt = "com.yulei.mybatis.model.mapper.userMapper.getUserById";
    15             User user = session.selectOne(statemt, 1);
    16             System.out.println(user);
    17         } catch (IOException e) {
    18             e.printStackTrace();
    19         }
    20     }
    21 }

      执行结果为:

    User{id=1, username='yulei', password='123456'}
    • 在实际开发中,我们推荐使用第二种方式:自定义接口,但是不需要实现该接口,通过Mapper代理来实现。  

        (1):自定义接口

     1 public interface UserDao {
     2 
     3         /**
     4          * 新增用户
     5          * @param user
     6          * @return
     7          */
     8         public int addUser(User user);
     9 
    10         /**
    11          * 删除用户
    12          * @param id
    13          * @return
    14          */
    15         public int deleteUser(int id);
    16 
    17         /**
    18          * 修改用户
    19          * @param user
    20          * @return
    21          */
    22         public int updateUser(User user);
    23 
    24         /**
    25          * 根据id查找用户
    26          * @param id
    27          * @return
    28          */
    29         public User selectUserById(int id);
    30 
    31 }

      (2):创建userDao.xml,定义接口方法对应的SQL语句。

        MyBatis会根据规则自动创建UserDao接口实现类的代理对象,规则如下:

          1)userDao.xml 中 namespace为接口的全类名。

          2)userDao.xml 中 statement 的 id 为接口中对应的方法明。

          3)userDao.xml 中 statement 的 parameterType 和接口中对应方法的参数类型一致。

          4)userDao.xml 中 statement 的resultTypte 和接口中对应方法的返回值类型一致。

        

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 
     6 <mapper namespace="com.yulei.mybatis.dao.UserDao">
     7 
     8     <insert id="addUser" parameterType="com.yulei.mybatis.model.User">
     9         insert into t_user (username, password) values (#{username}, #{password})
    10     </insert>
    11 
    12     <delete id="deleteUser" parameterType="int">
    13         delete from t_user where id = #{id}
    14     </delete>
    15 
    16     <update id="updateUser" parameterType="com.yulei.mybatis.model.User">
    17         update t_user set username=#{username}, password=#{password} where id = #{id}
    18     </update>
    19 
    20     <select id="getUserById" parameterType="int" resultType="com.yulei.mybatis.model.User">
    21         select * from t_user where id = #{id}
    22     </select>
    23 
    24 </mapper>

      (3):在config.xml中注册userDao.xml。

       (4):测试:

     1 public class Test2 {
     2 
     3     @org.junit.Test
     4     public void TestMyBatis2() {
     5         String resource = "config.xml";
     6         try {
     7             InputStream inputStream = Resources.getResourceAsStream(resource);
     8             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
     9             SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
    10             //获取sqlsession
    11             SqlSession session = sqlSessionFactory.openSession();
    12             UserDao userDao = session.getMapper(UserDao.class);
    13 
    14             //新增
    15             User user = new User();
    16             user.setUsername("yudian");
    17             user.setPassword("111111");
    18             System.out.println(userDao.addUser(user));
    19             session.commit();
    20 
    21             //删除
    22             System.out.println(userDao.deleteUser(2));
    23             session.commit();
    24 
    25             //修改
    26             User user2 = userDao.selectUserById(1);
    27             user2.setUsername("yulei222");
    28             userDao.updateUser(user2);
    29             session.commit();
    30 
    31             //查询用户
    32             User user3 = userDao.selectUserById(1);
    33             System.out.println(user3);
    34 
    35         } catch (IOException e) {
    36             e.printStackTrace();
    37         }
    38     }
    39 
    40 }
  • 相关阅读:
    Linux修改密码后不能SSH远程登录了
    scala spark2.0 sparksql 连接mysql8.0 操作多表 使用 dataframe 及RDD进行数据处理
    spark2.0 连接mysql8.0数据库操作表数据
    spark2.0以上 RDD 转 dataframe 及数据处理 ERROR Executor:91
    Oracle 存储过程、存储函数
    mysql8.0 存储过程 、存储函数
    Ubuntu 12.04 使用root用户登录桌面
    python与conda 包管理工具 Miniconda 的安装 及 conda安装 python 3.6.5 from conda.cli import main ModuleNotFoundError
    mysql 月统计计算
    mysql数据库整体迁移:
  • 原文地址:https://www.cnblogs.com/yaokaizhi/p/9560230.html
Copyright © 2011-2022 走看看