zoukankan      html  css  js  c++  java
  • MyBatis入门程序(1)

    一、入门程序:

    1、mybatis的配置文件SqlMapConfig.xml

    配置mybatis的运行环境,数据源、事务等。
     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     <!-- 和spring整合后 environments配置将废除-->
     7     <environments default="development">
     8         <environment id="development">
     9         <!-- 使用jdbc事务管理-->
    10             <transactionManager type="JDBC" />
    11         <!-- 数据库连接池-->
    12             <dataSource type="POOLED">
    13                 <property name="driver" value="com.mysql.jdbc.Driver" />
    14                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
    15                 <property name="username" value="root" />
    16                 <property name="password" value="123" />
    17             </dataSource>
    18         </environment>
    19     </environments>
    20     
    21     <mappers>
    22         <mapper resource="sqlmap/User.xml"/>
    23     </mappers>
    24 </configuration>
    View Code

    2、创建对应的映射文件User.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命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用-->
     7 <mapper namespace="test">
     8     <!-- 
     9     parameterType:指定输入 参数的类型
    10     #{}表示一个占位符号
    11     #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
    12     resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
    13      -->
    14     <select id="findUserById" parameterType="int" resultType="com.zhang.domain.User">
    15         SELECT * FROM USER WHERE id=#{value}
    16     </select>
    17     
    18     <!-- 根据用户名称模糊查询用户信息,可能返回多条
    19     resultType:指定就是单条记录所映射的java对象类型
    20     ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
    21     使用${}拼接sql,引起 sql注入
    22     ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
    23      -->
    24     <select id="findUserByName" parameterType="java.lang.String" resultType="com.zhang.domain.User">
    25         SELECT * FROM USER WHERE username LIKE '%${value}%'
    26     </select>
    27     
    28     <!-- 添加用户 -->
    29     <insert id="insertUser" parameterType="com.zhang.domain.User">
    30         <!-- 
    31         将插入数据的主键返回,返回到user对象中
    32         SELECT LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用与自增主键
    33         keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
    34         order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
    35         resultType:指定SELECT LAST_INSERT_ID()的结果类型
    36          -->
    37         <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
    38             SELECT LAST_INSERT_ID()
    39         </selectKey>
    40         insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
    41         
    42         <!-- 
    43         使用mysql的uuid()生成主键,首先通过uuid()得到主键,将主键设置到user对象的id属性中。其次在insert执行时,从user对象中取出id属性值
    44          -->
    45         <!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
    46             SELECT uuid()
    47         </selectKey>
    48         insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) -->
    49     </insert>
    50     
    51     <!-- 删除 用户-->
    52     <delete id="deleteUser" parameterType="java.lang.Integer">
    53         delete from user where id=#{id}
    54     </delete>
    55     
    56     <!-- 根据id更新用户-->
    57     <update id="updateUser" parameterType="com.zhang.domain.User">
    58         update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} 
    59         where id=#{id}
    60     </update>
    61     
    62 </mapper>
    View Code

    3、创建User类

     1 package com.zhang.domain;
     2 
     3 import java.util.Date;
     4 public class User {
     5     
     6     //属性名和数据库表的字段对应
     7     private int id;
     8     private String username;// 用户姓名
     9     private String sex;// 性别
    10     private Date birthday;// 生日
    11     private String address;// 地址
    12     public int getId() {
    13         return id;
    14     }
    15     public void setId(int id) {
    16         this.id = id;
    17     }
    18     public String getUsername() {
    19         return username;
    20     }
    21     public void setUsername(String username) {
    22         this.username = username;
    23     }
    24     public String getSex() {
    25         return sex;
    26     }
    27     public void setSex(String sex) {
    28         this.sex = sex;
    29     }
    30     public Date getBirthday() {
    31         return birthday;
    32     }
    33     public void setBirthday(Date birthday) {
    34         this.birthday = birthday;
    35     }
    36     public String getAddress() {
    37         return address;
    38     }
    39     public void setAddress(String address) {
    40         this.address = address;
    41     }
    42     @Override
    43     public String toString() {
    44         return "User [id=" + id + ", username=" + username + ", sex=" + sex
    45                 + ", birthday=" + birthday + ", address=" + address + "]";
    46     }
    47 
    48 
    49 }
    View Code

    4创建测试类

      1 package com.zhang.test;
      2 
      3 import java.io.IOException;
      4 import java.io.InputStream;
      5 import java.util.Date;
      6 import java.util.List;
      7 
      8 import org.apache.ibatis.io.Resources;
      9 import org.apache.ibatis.session.SqlSession;
     10 import org.apache.ibatis.session.SqlSessionFactory;
     11 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     12 import org.junit.Before;
     13 import org.junit.Test;
     14 
     15 import com.zhang.domain.User;
     16 
     17 public class TestMy {
     18 
     19     //会话工厂
     20     private SqlSessionFactory sqlSessionFactory;
     21     @Before
     22     public void createSqlSessionFactory() throws IOException  {
     23         // 配置文件
     24         String resource = "SqlMapConfig.xml";
     25         InputStream inputStream = Resources.getResourceAsStream(resource);
     26         // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
     27         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     28     }
     29 
     30     // 根据 id查询用户信息
     31     @Test
     32     public void testFindUserById() {
     33         // 数据库会话实例
     34         SqlSession sqlSession = null;
     35         try {
     36             // 创建数据库会话实例sqlSession
     37             sqlSession = sqlSessionFactory.openSession();
     38             // 查询单个记录,根据用户id查询用户信息
     39             User user = sqlSession.selectOne("test.findUserById", 10);
     40             // 输出用户信息
     41             System.out.println(user);
     42         } catch (Exception e) {
     43             e.printStackTrace();
     44         } finally {
     45             if (sqlSession != null) {
     46                 sqlSession.close();
     47             }
     48         }
     49 
     50     }
     51 
     52     // 根据用户名称模糊查询用户信息
     53     @Test
     54     public void testFindUserByUsername() {
     55         // 数据库会话实例
     56         SqlSession sqlSession = null;
     57         try {
     58             // 创建数据库会话实例sqlSession
     59             sqlSession = sqlSessionFactory.openSession();
     60             // 查询单个记录,根据用户id查询用户信息
     61             List<User> list = sqlSession.selectList("test.findUserByName", "");
     62             System.out.println(list.size());
     63         } catch (Exception e) {
     64             e.printStackTrace();
     65         } finally {
     66             if (sqlSession != null) {
     67                 sqlSession.close();
     68             }
     69         }
     70 
     71     }
     72 
     73     // 添加用户信息
     74     @Test
     75     public void testInsert() {
     76         // 数据库会话实例
     77         SqlSession sqlSession = null;
     78         try {
     79             // 创建数据库会话实例sqlSession
     80             sqlSession = sqlSessionFactory.openSession();
     81             // 添加用户信息
     82             User user = new User();
     83             user.setUsername("张小明");
     84             user.setAddress("河南郑州");
     85             user.setSex("1");
     86             user.setBirthday(new Date());
     87             sqlSession.insert("test.insertUser", user);
     88             //提交事务
     89             sqlSession.commit();
     90         } catch (Exception e) {
     91             e.printStackTrace();
     92         } finally {
     93             if (sqlSession != null) {
     94                 sqlSession.close();
     95             }
     96         }
     97     }
     98 
     99     // 根据id删除用户
    100     @Test
    101     public void testDelete() {
    102         // 数据库会话实例
    103         SqlSession sqlSession = null;
    104         try {
    105             // 创建数据库会话实例sqlSession
    106             sqlSession = sqlSessionFactory.openSession();
    107             // 删除用户
    108             sqlSession.delete("test.deleteUser",26);
    109             // 提交事务
    110             sqlSession.commit();
    111         } catch (Exception e) {
    112             e.printStackTrace();
    113         } finally {
    114             if (sqlSession != null) {
    115                 sqlSession.close();
    116             }
    117         }
    118     }
    119 
    120     // 更新用户信息
    121     @Test
    122     public void testUpdate() {
    123         // 数据库会话实例
    124         SqlSession sqlSession = null;
    125         try {
    126             // 创建数据库会话实例sqlSession
    127             sqlSession = sqlSessionFactory.openSession();
    128             // 添加用户信息
    129             User user = new User();
    130             user.setId(16);
    131             user.setUsername("小明");
    132             user.setAddress("河南郑州");
    133             user.setSex("1");
    134             user.setBirthday(new Date());
    135             sqlSession.update("test.updateUser", user);
    136             // 提交事务
    137             sqlSession.commit();
    138         } catch (Exception e) {
    139             e.printStackTrace();
    140         } finally {
    141             if (sqlSession != null) {
    142                 sqlSession.close();
    143             }
    144         }
    145     }
    146 }
    View Code

    5、整个工程目录结构

    二、相关知识点:

    1、#{}和${}
    #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
    ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,${}中只能写成value。接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值
     
    2、parameterType和resultType
    parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
    resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
     
    3、selectOne和selectList
    selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
     selectList可以查询一条或多条记录。
     
    4、Mybatis解决jdbc编程的问题

    数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

    Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。解决:将Sql语句配置在XXXX.xml文件中与java代码分离。

    向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

    对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

    5、与hibernate不同

    hibernate是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。
    应用场景: 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。
    mybatis专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
    应用场景:适用与需求变化较多的项目,比如:互联网项目。

     资源下载链接:http://download.csdn.net/detail/u013865056/9906989

  • 相关阅读:
    题解:2018级算法第五次上机 C5-图2
    题解:2018级算法第四次上机 C4-最小乘法
    题解:2018级算法第四次上机 C4-商人卖鱼
    题解:2018级算法第三次上机 C3-Zexal的浩瀚星辰
    C语言算法动态规划板子题汇总
    QT样式表
    3.PCB-禁止布线层
    2.PCB-板切割槽
    1.PCB-板形设置
    变压器
  • 原文地址:https://www.cnblogs.com/zhangjinru123/p/7219985.html
Copyright © 2011-2022 走看看