zoukankan      html  css  js  c++  java
  • MyBatis之Hello world(Mybatis入门)

    MyBatis中文网,超详细的:http://www.mybatis.org/mybatis-3/zh/index.html

    MyBatis英文网http://www.mybatis.org/mybatis-3/

    MyBatis的Github:https://github.com/mybatis/mybatis-3

    1:创建一个动态web工程
    2:导入MyBatils必须的包
        MyBatis的使用说明:
        asm-3.3.1.jar 【字节码的包】
        cglib-2.2.2.jar  【代理包】
        commons-logging-1.1.1.jar  【日志包】
        log4j-1.2.16.jar
        mybatis-3.1.1.jar   【mybatis的核心包】
        mysql-connector-java-5.1.40-bin.jar  【mysql的驱动包】
    3:创建数据库和数据表,省略,创建实体类

     1 package com.bie.mybatis01;
     2 /** 
     3 * @author BieHongLi 
     4 * @version 创建时间:2017年4月11日 下午2:47:03 
     5 * 
     6 */
     7 public class User {
     8 
     9     private Integer id;//用户编号
    10     private String name;//用户姓名
    11     private int sal;//用户薪资
    12     
    13     public Integer getId() {
    14         System.out.println("测试配置文件,确实是调用了user.getId");
    15         return id;
    16     }
    17     public void setId(Integer id) {
    18         this.id = id;
    19     }
    20     public String getName() {
    21         System.out.println("测试配置文件,确实是调用了user.getName");
    22         return name;
    23     }
    24     public void setName(String name) {
    25         this.name = name;
    26     }
    27     public int getSal() {
    28         System.out.println("测试配置文件,确实是调用了user.getSal");
    29         return sal;
    30     }
    31     public void setSal(int sal) {
    32         this.sal = sal;
    33     }
    34     public User(Integer id, String name, int sal) {
    35         super();
    36         this.id = id;
    37         this.name = name;
    38         this.sal = sal;
    39     }
    40     
    41     
    42     
    43     
    44 }

    4:创建MyBatis的工具类:

     1 package com.bie.utils;
     2 
     3 import java.io.IOException;
     4 import java.io.Reader;
     5 import java.sql.Connection;
     6 
     7 import org.apache.ibatis.io.Resources;
     8 import org.apache.ibatis.session.SqlSession;
     9 import org.apache.ibatis.session.SqlSessionFactory;
    10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    11 
    12 /** 
    13 * @author BieHongLi 
    14 * @version 创建时间:2017年4月11日 下午3:01:22 
    15 * 工具类
    16 */
    17 public class MyBatisUtils {
    18 
    19     //定义私有静态当前线程泛型(SqlSession)对象
    20     private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    21     //定义私有静态sqlSessionFactory
    22     private static SqlSessionFactory sqlSessionFactory;
    23     
    24     //静态块,使用该类时,自动加载该静态块
    25     //加载位于src目录下面的mybatis.cfg.xml配置文件
    26     static{
    27         try {
    28             //读取配置文件mybatis.cfg.xml
    29             Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
    30             sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 
    31         } catch (IOException e) {
    32             e.printStackTrace();
    33             throw new RuntimeException(e);
    34         }
    35     }
    36     
    37     //禁止外界通过new方法创建
    38     private MyBatisUtils(){}
    39     
    40     //获取SqlSession
    41     public static SqlSession getSqlSession(){
    42         //从当前线程中获取SqlSession对象
    43         SqlSession sqlSession = threadLocal.get();
    44         //如果SqlSession对象为空
    45         if(sqlSession == null){
    46             //在SqlSessionFactory非空的情况下,获取SqlSession对象
    47             sqlSession = sqlSessionFactory.openSession();
    48             //将sqlSession对象与当前线程绑定在一起
    49             threadLocal.set(sqlSession);
    50         }
    51         //返回sqlSession对象
    52         return sqlSession;
    53     }
    54     
    55     //关闭SqlSession与当前线程分开
    56     public static void closeSqlSession(){
    57         //从当前线程中获取SqlSession对象
    58         SqlSession sqlSession = threadLocal.get();
    59         //如果SqlSession对象非空
    60         if(sqlSession != null){
    61             //关闭SqlSession对象
    62             sqlSession.close();
    63             //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收
    64             threadLocal.remove();
    65         }
    66     }
    67     
    68     
    69     /*public static void main(String[] args) {
    70         SqlSession sqlSession = MyBatisUtils.getSqlSession();
    71         Connection con = sqlSession.getConnection();
    72         if(con!=null){
    73             System.out.println("连接成功");
    74         }else{
    75             System.out.println("连接失败");
    76         }
    77         
    78         System.out.println(con!=null?"connection is ok":"connection is fail");
    79     }*/
    80     
    81 }

     5:创建映射文件,放到其包中即可,如UserMapper.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 
     5 <!-- MyBatis的映射配置文件 
     6     namespace:名称空间,必须唯一
     7 -->
     8 <!-- <mapper namespace="userNamespace"> -->
     9 <mapper namespace="com.bie.mybatis01.User">
    10 
    11     <!-- 
    12         resultMap标签:映射实体与表
    13             type属性:表示实体全路径名
    14             id属性:为实体与表的映射取一个任意名称且唯一的名字
    15      -->
    16     <resultMap type="com.bie.mybatis01.User" id="userMap">
    17         <!-- id标签映射主键 
    18             property属性:实体的属性名
    19             column属性:表的字段名
    20         -->
    21         <id column="id" property="id"/>
    22         
    23         <!-- result标签非主键属性 -->
    24         <result column="name" property="name"/>
    25         <result column="sal" property="sal"/>
    26         
    27     </resultMap>
    28     
    29     <!-- 
    30         insert标签:要书写insert这么一个sql语句
    31             id属性:为insert这么一个sql语句取一个任意唯一的名字
    32      -->
    33     <insert id="insertId" parameterType="com.bie.mybatis01.User">
    34         insert into user values(2,"张三",1234)
    35     </insert>
    36     
    37     <insert id="insertId2" parameterType="com.bie.mybatis01.User">
    38         <!-- 
    39             可以这样理解,参数的设置,其实#{id} 就等价于#{user.getId()}
    40             insert into user values(#{user.getId()},#{user.getName()},#{user.getSal()});
    41         
    42          -->
    43          insert into user values(#{id},#{name},#{sal})
    44     </insert>
    45     
    46 </mapper>

    6:创建配置文件,放到src目录下面,如mybatils.cfg.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 
     5 <!-- 1:连接数据库的配置 -->
     6 <configuration>
     7     
     8     <!-- 设置一个默认的连接环境信息 -->
     9     <environments default="jdbc_developer">
    10         
    11         <!-- 连接环境信息,取一个任意唯一的名字 -->
    12         <environment id="jdbc_developer">
    13         
    14             <!-- 2:MyBatis使用jdbc事务事务管理方式 -->
    15             <transactionManager type="jdbc"></transactionManager>
    16             
    17             <!-- 3:MyBatis使用连接池方式来获取连接 -->
    18             <dataSource type="pooled">
    19             
    20                 <!-- 4:配置与数据库交互的4哥必要属性 -->
    21                 <property name="driver" value="com.mysql.jdbc.Driver"/>
    22                 <property name="url" value="jdbc:mysql:///test"/>
    23                 <property name="username" value="root"/>
    24                 <property name="password" value="123456"/>
    25                 
    26             </dataSource>
    27             
    28         </environment>
    29     
    30     </environments>
    31 
    32     
    33     <!-- 加载映射文件 -->
    34     <mappers>
    35         <mapper resource="com/bie/mybatis01/UserMapper.xml"/>
    36     </mappers>
    37     
    38 </configuration>

    7:开始写测试类UserDao进行测试

      1 package com.bie.mybatis01;
      2 
      3 import org.apache.ibatis.session.SqlSession;
      4 
      5 import com.bie.utils.MyBatisUtil;
      6 import com.bie.utils.MyBatisUtils;
      7 
      8 /** 
      9 * @author BieHongLi 
     10 * @version 创建时间:2017年4月11日 下午3:03:54 
     11 * dao层持久层:数据交互层
     12 */
     13 public class UserDao {
     14 
     15     /***
     16      * 用户添加的方法
     17      * @param user
     18      */
     19     public void insert(){
     20         SqlSession sqlSession = null;
     21         try {
     22             //sqlSession = MyBatisUtils.getSqlSession();
     23             sqlSession = MyBatisUtil.getSqlSession();
     24             //事务开始(默认)
     25             //读取UserMapper.xml映射文件中的SQL语句
     26             int i = sqlSession.insert("userNamespace.insertId");
     27             System.out.println("本次操作影响了" + i + "行");
     28             
     29             //事务提交
     30             sqlSession.commit();
     31         } catch (Exception e) {
     32             e.printStackTrace();
     33             //事务回滚
     34             sqlSession.rollback();
     35         }finally {
     36             MyBatisUtils.closeSqlSession();
     37         }
     38         
     39     }
     40     
     41     /***
     42      * 插入带参的方法
     43      * @param user
     44      */
     45     public void insert2(User user){
     46         SqlSession sqlSession = null;
     47         try {
     48             //第一首先链接数据库
     49             sqlSession = MyBatisUtils.getSqlSession();
     50             //默认打开事务
     51             //读取UserMapper.xml映射文件的SQL语句
     52             //第一个参数,命名空间.sql的id,d第二个参数是方法的参数user
     53             sqlSession.insert("userNamespace.insertId2", user);
     54             
     55             //提交事务
     56             sqlSession.commit();
     57         } catch (Exception e) {
     58             e.printStackTrace();
     59             //回滚事务
     60             sqlSession.rollback();
     61         }finally {
     62             //关闭SqlSession
     63             MyBatisUtils.closeSqlSession();
     64         }
     65         
     66     }
     67     
     68     public void insert3(User user){
     69         SqlSession sqlSession = null;
     70         try {
     71             //第一首先链接数据库
     72             sqlSession = MyBatisUtils.getSqlSession();
     73             //默认打开事务
     74             //读取UserMapper.xml映射文件的SQL语句
     75             //第一个参数,命名空间.sql的id,d第二个参数是方法的参数user
     76             sqlSession.insert("com.bie.mybatis01.User.insertId2", user);
     77             
     78             //提交事务
     79             sqlSession.commit();
     80         } catch (Exception e) {
     81             e.printStackTrace();
     82             //回滚事务
     83             sqlSession.rollback();
     84         }finally {
     85             //关闭SqlSession
     86             MyBatisUtils.closeSqlSession();
     87         }
     88         
     89     }
     90     
     91     public static void main(String[] args) {
     92         UserDao dao = new UserDao();
     93         //dao.insert();
     94         //dao.insert2(new User(3,"张三",1234));
     95         dao.insert3(new User(4,"张三",1234));
     96         
     97     
     98     }
     99 
    100 
    101     
    102 }

    8:MyBatis的工作流
        (a)通过Reader对象读取src目录下面的mybatis.xml配置文件(该配置文件的名称和未知可以任意)
            Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
        (b)通过SqlSessionFactoryBuilder对象创建 SqlSessionFactory对象
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        (c)从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
        (d)事务开始,在mybatis中默认
        (e)通过SqlSession对象读取UserMapper.xml映射文件中的操作编号,从而读取sql语句
            int i = sqlSession.insert("userNamespace.insertId");
        (f)事务提交,必写
            sqlSession.commit();
            【注意:不要忘记事务回滚】
        (g)关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收
            MyBatisUtils.closeSqlSession();   

    时间一分一秒的溜走,让自己做更有意义的事情,奋斗吧,小怪兽~~~

    Time passes by, let yourself do more meaningful things, fight it, little monster ~ ~ ~ ~ ~ ~ ~ ~ ~!

  • 相关阅读:
    【DP】解析 SOSdp(子集和 dp)
    【图论】AcWing 342. 道路与航线 题目解答 (拓扑序+dijkstra)
    【DP】斜率优化初步
    Educational Codeforces Round 95 (Rated for Div. 2) 题解(待更)
    2020-2021 ACM-ICPC, Asia Seoul Regional Contest 部分题目解答
    Codeforces Round #704 (Div. 2) 题解(待更)
    Samara Farewell Contest 2020 (XXI Open Cup, GP of Samara) 部分题目解答
    AtCoder Regular Contest 113 题解(待补)
    docker中php-fpm无法更改时区问题
    pod时区更改
  • 原文地址:https://www.cnblogs.com/biehongli/p/6708010.html
Copyright © 2011-2022 走看看