zoukankan      html  css  js  c++  java
  • 一 mybatis快速入门

    什么是MyBatis

     MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。

    MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索。

    MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

     ibatis=mybatis

    和Hibernate对比

    搭建MyBatis开发环境的步骤

    搭建MyBatis环境时,我们一般需要做以下几个步骤的工作:

    1》创建java工程

    2》找到开发MyBatis应用需要使用到的jar文件.

    3》创建数据库表.

    4》创建pojo文件.

    5》创建针对表操作的xml文件

    6》创建MyBatis的xml配置文件

    7》编写测试类

    1、创建java工程

    2、导入java包

    核心包

    mybatis-3.1.1.jar

    依赖包

    asm-3.3.1.jar

    cglib-2.2.2.jar

    commons-logging-1.1.1.jar

    log4j-1.2.16.jar

    slf4j-api-1.6.2.jar

    slf4j-log4j12-1.6.2.jar

    数据库驱动包

    mysql-connector-java-5.0.6-bin.jar

    测试包

    junit-4.4.jar

    3、创建数据库表

    创建数据库:

    1 create database mybatis;
    2 
    3 use mybatis;

    创建表:

    1 create table user(id int primary key not  null  auto_increment,name  varchar(50),age  int,address varchar(150));
    2 
    3 desc user;

    插入一条记录:

    1  insert user values(‘1001’,’zhangsan’,25,’beijing’)

    4.创建pojo

     1 public class User {
     2     private Integer id;
     3     private String name;
     4     private Integer age;
     5     private String address;
     6     public Integer getId() {
     7         return id;
     8     }
     9     public void setId(Integer id) {
    10         this.id = id;
    11     }
    12     public String getName() {
    13         return name;
    14     }
    15     public void setName(String name) {
    16         this.name = name;
    17     }
    18     public Integer getAge() {
    19         return age;
    20     }
    21     public void setAge(Integer age) {
    22         this.age = age;
    23     }
    24     public String getAddress() {
    25         return address;
    26     }
    27     public void setAddress(String address) {
    28         this.address = address;
    29     }
    30     @Override
    31     public String toString() {
    32         return "User [id=" + id + ", name=" + name + ", age=" + age
    33                 + ", address=" + address + "]";
    34     }
    35 }

    5.创建针对表操作的xml文件UserMapper.xml

     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 <!-- namespace:必需保证唯一,一般是当前文件的全名 -->
     7 <mapper namespace="cn.itcast.dao.UserMapper">
     8  
     9  <!--     <select>:查询时使用
    10     id:相当 于方法名,在同一文件中不能有相同的id名
    11     parameterType:指定方法传入的参数类型,integer=java.lang.Integer
    12     resultType:指定方法的返回类型 
    13  -->
    14     <select id="loadUserById" parameterType="integer" resultType="cn.itcast.pojo.User">
    15         select * from user where id=#{id}
    16     </select>
    17     
    18     <!-- <insert>:插入记录
    19         #{id}:=getId()
    20      -->
    21     <insert id="insertUser" parameterType="cn.itcast.pojo.User" >
    22         insert into user values(#{id},#{name},#{age},#{address})
    23     </insert>
    24     
    25     <!-- <update>:更新记录-->
    26     <update id="updataUser" parameterType="cn.itcast.pojo.User">
    27         update user set name=#{name},age=#{age},address=#{address} where id=#{id}
    28     </update>
    29 
    30     <delete id="deleteUser" parameterType="integer">
    31         delete from user where id=#{id}
    32     </delete>
    33 <!-- ==================================================================== -->    
    34     <!-- 动态SQL 查询 -->
    35     <select id="findUser" parameterType="cn.itcast.pojo.User" resultType="cn.itcast.pojo.User">
    36         select * from user
    37         <where>
    38             <if test="name != null">
    39                 name like '%${name}%'
    40             </if>
    41             <if test="age !=null">
    42                 and age=#{age}
    43             </if>
    44             <if test="address != null">
    45                 and address like '%${address}%'
    46             </if>
    47         </where>
    48         
    49     </select>
    50     
    51     <!-- 公共查询条件 -->
    52     <sql id="query_where">
    53          <where>
    54             <if test="name != null">
    55                 name like '%${name}%'
    56             </if>
    57             <if test="age !=null">
    58                 and age=#{age}
    59             </if>
    60             <if test="address != null">
    61                 and address like '%${address}%'
    62             </if>
    63           </where>  
    64     </sql>
    65     
    66     <select id="countUser" parameterType="cn.itcast.pojo.User" resultType="int">
    67         select count(*) from user
    68         <include refid="query_where"></include>
    69         
    70     </select>
    71     
    72     <!-- 动态更新 -->
    73     <update id="updateUser2" parameterType="cn.itcast.pojo.User">
    74         update user 
    75         <set>
    76             <if test="name != null">name=#{name},</if>
    77             <if test="age != null">age=#{age},</if>
    78             <if test="address != null">address=#{address}</if>
    79         </set>  where id=#{id}
    80     </update>
    81     
    82     <sql id="update_set">
    83         <set>
    84             <if test="name != null">name=#{name},</if>
    85             <if test="age != null">age=#{age},</if>
    86             <if test="address != null">address=#{address}</if>
    87         </set> 
    88     </sql>
    89     
    90     <!-- 动态更新 .公共条件-->
    91     <update id="updateUser3" parameterType="cn.itcast.pojo.User">
    92         update user 
    93         <include refid="update_set"/> where id=#{id}
    94     </update>
    95 
    96 </mapper>

    6.创建MyBatis配置文件mybatis-config.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2  <!DOCTYPE configuration  
     3      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
     4      "http://mybatis.org/dtd/mybatis-3-config.dtd">
     5 <configuration>
     6     
     7     <!-- <environments>:它里边能指定多个数据库配置 default:默认加载的数据库配置 -->
     8     <environments default="dev">
     9         <!-- 
    10             <environment>:相应数据库配置
    11             id:在当前配置文件中必需保证唯一
    12          -->
    13         <environment id="dev">
    14             <!-- <transactionManager>:指定数据库事务的管理,一般由jdbc管理  -->
    15             <transactionManager type="jdbc"></transactionManager>
    16             <!-- <dataSource>:指定数据库相关连接-->
    17             <dataSource type="pooled">
    18                 <property name="driver" value="com.mysql.jdbc.Driver" />
    19                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis1023" />
    20                 <property name="username" value="root" />
    21                 <property name="password" value="root" />
    22             </dataSource>
    23         </environment>
    24     </environments>
    25     
    26     
    27     <!-- <mappers>:配置所有的表的配置文件 -->
    28     <mappers>
    29         <!-- 
    30         <mapper>:引入相关表的配置文件
    31         resource:指定表配置文件的所在位置
    32          -->
    33         <mapper resource="cn/itcast/dao/UserMapper.xml"/>
    34     </mappers>
    35 </configuration>    

    7.编写测试类TestUser.java

      1 public class TestUser {
      2     
      3     private SqlSession sqlSession = null;
      4     @Before
      5     public void init(){
      6         try {
      7             // 读取mybatis配置文件
      8             Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
      9             // 获取SqlSessionFactory
     10             SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
     11                     .build(reader);
     12             
     13             //获取SqlSession
     14             sqlSession = sessionFactory.openSession();
     15             
     16         } catch (IOException e) {
     17             e.printStackTrace();
     18         }
     19 
     20     }
     21     
     22     
     23     @Test
     24     /**
     25      * 更新一条数据
     26      */
     27     public void testUpdataUser(){
     28         User user = new User();
     29         user.setId(1);
     30         user.setName("wang");
     31         user.setAge(23);
     32         user.setAddress("shanghai");
     33         int i = sqlSession.update("cn.itcast.dao.UserMapper.updataUser",user);
     34         System.out.println(i);
     35         sqlSession.commit();
     36 
     37     }
     38     
     39     @Test
     40     /**
     41      * 插入一条数据
     42      */
     43     public void testInserUser(){
     44         User user = new User();
     45         user.setId(1);
     46         user.setName("wangwu");
     47         user.setAge(23);
     48         user.setAddress("tianjin");
     49         int i = sqlSession.insert("cn.itcast.dao.UserMapper.insertUser",user);
     50         System.out.println(i);
     51         sqlSession.commit();
     52 
     53     }
     54     @Test
     55     /**
     56      * 根据ID查询 
     57      */
     58     public void testLoadUserById() {
     59         // 通过id查询user
     60         User user = sqlSession.selectOne(
     61                 "cn.itcast.dao.UserMapper.loadUserById", 1);
     62         System.out.println(user.toString());
     63 
     64     }
     65     
     66     @Test
     67     /**
     68      * 根据ID删除一条数据
     69      */
     70     public void testDeleteUserById() {
     71         // 通过id查询user
     72         int i = sqlSession.delete(
     73                 "cn.itcast.dao.UserMapper.deleteUser", 1);
     74         System.out.println(i);
     75         sqlSession.commit();
     76 
     77     }
     78     
     79     @Test
     80     /**
     81      * 动态查询
     82      */
     83     public void findUser(){
     84         
     85         User u = new User();
     86         //u.setName("zhao");
     87         u.setName("wang");
     88         List<User> list = sqlSession.selectList("cn.itcast.dao.UserMapper.findUser", u);
     89         for (User user : list) {
     90             System.out.println(user.toString());
     91         }
     92     }
     93     
     94     @Test
     95     /**
     96      * 动态查询.公共条件查询
     97      */
     98     public void countUser(){
     99         
    100         User u = new User();
    101         //u.setName("zhao");
    102         u.setAge(23);
    103         int i = sqlSession.selectOne("cn.itcast.dao.UserMapper.countUser", u);
    104         System.out.println(i);
    105     }
    106     
    107     /**
    108      * 动态更新
    109      */
    110     @Test
    111     public void updateUser2(){
    112         User user = new User();
    113         user.setId(1);
    114         //user.setName("zhaowu2");
    115         user.setAge(26);
    116         //user.setAddress("henan");
    117         int i =  sqlSession.update("cn.itcast.dao.UserMapper.updateUser2", user);
    118         System.out.println(i);
    119         sqlSession.commit();
    120     }
    121     
    122     /**
    123      * 动态更新
    124      */
    125     @Test
    126     public void updateUser3(){
    127         User user = new User();
    128         user.setId(1);
    129         //user.setName("zhaowu2");
    130         user.setAge(18);
    131         //user.setAddress("henan");
    132         int i =  sqlSession.update("cn.itcast.dao.UserMapper.updateUser3", user);
    133         System.out.println(i);
    134         sqlSession.commit();
    135     }
    136 
    137 }

     

    总结:

    1   parameterType

    在映射文件中通过parameterType指定输入 参数的类型。

    2     resultType

    在映射文件中通过resultType指定输出结果的类型。

    3     #{}和${}

    #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

    如果接收简单类型,#{}中可以写成value或其它名称。

    #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

    ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。

    ${}接收输入参数,类型可以是简单类型,pojo、hashmap。

    如果接收简单类型,${}中只能写成value。

    ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

    4     selectOne和selectList

    selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

    selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。

    如果使用selectOne报错:

    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4

    2     mybatis和hibernate本质区别和应用场景

    hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。

    对sql语句进行优化、修改比较困难的。

    应用场景:

             适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

    mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

    应用场景:

             适用与需求变化较多的项目,比如:互联网项目。

    企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

  • 相关阅读:
    一个强迫症用户的锤子手机使用体验
    起点——2015年终总结
    用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库
    用“MEAN”技术栈开发web应用(二)express搭建服务端框架
    SpringBoot/Spring使用@Value进行属性绑定(尚硅谷)
    springboot/spring使用ConfigurationProperties注解读取自定义属性(尚硅谷)
    Spring Boot项目中@SpringBootTest测试的时候卡住,一直Resolving Maven dependencies...
    ASP.NET项目:请使用语言版本6或者更高版本
    安装CUDA坑:CUDA driver version is insufficient for CUDA runtime version
    Failed to load the native TensorFlow runtime. ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
  • 原文地址:https://www.cnblogs.com/kingxiaozi/p/5990944.html
Copyright © 2011-2022 走看看