• mybatis学习第一天,一些配置以及练习


    Mybatis(数据库框架 )

    1. MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射

    2. 接下来是用法截图,完整代码我会贴在最后面

      (1) 创建一个lib文件夹存放jar文件(jar包:https://files.cnblogs.com/files/x-long/mybatis.zip)

        

      (2) 创建一个 datasource.properties文件,放在src下面,把数据库相应的连接所用写在里面,当然前面的名字是可以改的,键值对应就成

       

      (3) 接下来创建SqlMapConfig.xml 配置文件,同样放在src下面

        基本上只有四步配置

        <1> 获取到datasource.properties配置文件

          

        <2> 配置类型别名

          

        <3>  配置运行环境

          

        <4> 映射mapper xml文件

          在映射这个文件的时候首先需要先去建立一个xml文件  下面我贴出映射方法截图   下面mapper  xml文件我会单独写

          

        <5>接下来是SqlMapConfig.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 
     6 <!-- 简单连接配置 -->
     7 <configuration>
     8     <!-- 获取到数据库配置文件  -->
     9     <properties resource="datasource.properties"></properties>
    10     
    11     <!-- 配置实体类的别名
    12         方法一:直接使用package下的所有类  这样的别名就是类名-->
    13     <typeAliases>
    14         <package name="com.lovo.bean" />
    15     </typeAliases>
    16     
    17     <!-- 方法二:挨个配置实体类别名  使用时就用alias里面的值-->
    18     <!-- <typeAliases>
    19         <typeAlias type="com.lovo.bean.User" alias="User"/>
    20     </typeAliases> -->
    21     
    22     <!--配置运行环境 
    23         default中的默认值development不用改变  获取到.properties文件中的数据库属性 -->
    24     <environments default="development">
    25         <!-- id对应上面的默认值 -->
    26         <environment id="development">
    27             <!-- 用JDBC的方式连接 -->
    28             <transactionManager type="JDBC"  />
    29             <!-- 把配置文件中的数据库连接所需获取出来   POOLED 连接池-->
    30             <dataSource type="POOLED">
    31                 <property name="driver" value="${jdbc.driver}" />
    32                 <property name="url" value="${jdbc.url}" />
    33                 <property name="username" value="${jdbc.username}" />
    34                 <property name="password" value="${jdbc.password}" />
    35             </dataSource>
    36         </environment>
    37     </environments>
    38     
    39     <!-- 把mapper中的xml映射出来 -->
    40     <mappers>
    41         <mapper resource="com/lovo/mapper/UserMapper.xml"></mapper>
    42     </mappers>
    43 
    44 </configuration>

      (4) mapper xml文件配置

        a. 在写mapper配置文件以及接口的时候建议写上一个mapper包

          

        b. UserMapper.java这是一个接口,相当于dao里面的接口,代码如下

     1 package com.lovo.mapper;
     2 
     3 import java.util.List;
     4 
     5 import org.apache.ibatis.annotations.Param;
     6 
     7 import com.lovo.bean.User;
     8 
     9 public interface UserMapper {
    10     //如果是对象属性需要@Param("user")给他设置一个别名然后在xml里面调值使用
    11     //基础数据类型就不需要
    12     public int addUser(@Param("user")User user);
    13     
    14     //删除用户
    15     public int delUserById(int id);
    16     
    17     //查找用户
    18     public User findUserById(int id);
    19     
    20     //查找有多少条用户信息
    21     public int findUserCount();
    22     
    23     //根据name模糊查询user的list
    24     //因为String不是基本数据类型所以需要加上别名
    25     public List<User> findUserLikeName(@Param("name")String name);
    26 }

        c. 注意事件就是在接口方法中的参数不是基础数据类型那么一定要用@param("别名")加上别名

        d. UserMapper.xml配置  源码如下

          

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    
    <!-- 命名空间 -->
    <mapper namespace="com.lovo.mapper.UserMapper">
    
        <!-- 把数据库中的字段映射到User实体类中
                property对应实体类中的属性
                column对应sql中的字段
                javaType对应数据类型
                数据库中的字段要和实体类中的相对应
                可以少写  也可以多写几个resultMap给返回不同的数据使用
                 -->
        <resultMap type="User" id="userMapper">
            <id property="userId" column="user_id" javaType="int" />
            <result property="userName" column="user_name" javaType="java.lang.String"/>
            <result property="userPwd" column="user_pwd" javaType="java.lang.String"/>
            <result property="userType" column="user_type" javaType="int"/>
        </resultMap>
    
        <!-- id要和UserMapper.java中的方法名对应        parameterType这是传入对象别名-->
        <insert id="addUser" parameterType="User">
            <!-- 写sql语句 -->
            <!-- 获取对象值就需要对象.属性名  user就是在 UserMapper.java中add方法下参数用@Param()起的别名-->
            insert into users values(null,#{user.userName},#{user.userPwd},#{user.userType})
        </insert>
        
        <!-- 这个id是从 UserMapper.java中delUserById中的参数列表中获取的 
            基本数据类型可以不用别名   否则就需要设置别名
            有别名就用别名
         -->
        <delete id="delUserById">
            delete from users where user_id=#{id}
        </delete>
        
        <!-- 在需要返回值但是不是user对象的时候 那么就可以设置返回类型 -->
        <select id="findUserCount" resultType="int">
            select count(*) from users
        </select>
        
        <!-- resultMap如果返回的是对象的话那么就要用这个  后面跟上上面自己写的resultMap的id-->
        <select id="findUserById" resultMap="userMapper">
            select * from users where user_id=#{id}
        </select>
    
        
        <!-- 在模糊查询的时候需要用concat进行拼接(其他方法也可以) 
                否则的话最后的sql语句会是: '%'name'%'
                如果返回的试一个user对象list集合   那么依然写上resultMap="userMapper"
                在biz层的方法返回值设置为list就可以了
         -->
        <select id="findUserLikeName" resultMap="userMapper">
            select * from users where user_name like concat('%',#{name},'%')
        </select>
    </mapper>

        e.注意事项都写在代码注释了

          (a) 这一块命名空间要和.java文件名相同

            

          (b) 返回类型,增删改的返回类型默认为int,其他需要自己设置

            

     1 <!-- 在需要返回值但是不是user对象的时候 那么就可以设置返回类型 -->
     2     <select id="findUserCount" resultType="int">
     3         select count(*) from users
     4     </select>
     5     
     6     <!-- resultMap如果返回的是对象的话那么就要用这个  后面跟上上面自己写的resultMap的id-->
     7     <select id="findUserById" resultMap="userMapper">
     8         select * from users where user_id=#{id}
     9     </select>
    10 
    11     
    12     <!-- 在模糊查询的时候需要用concat进行拼接(其他方法也可以) 
    13             否则的话最后的sql语句会是: '%'name'%'
    14             如果返回的试一个user对象list集合   那么依然写上resultMap="userMapper"
    15             在biz层的方法返回值设置为list就可以了
    16      -->
    17     <select id="findUserLikeName" resultMap="userMapper">
    18         select * from users where user_name like concat('%',#{name},'%')
    19     </select>

        (c)  自己定义的对象返回类型,通过字段名的映射到相应的实体类中

          

    <!-- 把数据库中的字段映射到User实体类中
                property对应实体类中的属性
                column对应sql中的字段
                javaType对应数据类型
                数据库中的字段要和实体类中的相对应
                可以少写  也可以多写几个resultMap给返回不同的数据使用
                 -->
        <resultMap type="User" id="userMapper">
            <id property="userId" column="user_id" javaType="int" />
            <result property="userName" column="user_name" javaType="java.lang.String"/>
            <result property="userPwd" column="user_pwd" javaType="java.lang.String"/>
            <result property="userType" column="user_type" javaType="int"/>
        </resultMap>

         (d) 还有就是sql语句的id要和接口类的方法名相同  比如以下代码

    接口

    1 public int addUser(@Param("user")User user);
    2     
    3     //删除用户
    4     public int delUserById(int id);

    xml

    <insert id="addUser" parameterType="User">
            insert into users values(null,#{user.userName},#{user.userPwd},#{user.userType})
        </insert>
        
        <delete id="delUserById">
            delete from users where user_id=#{id}
        </delete>

        (5) 最后就是建立一个获取SqlSessionFactory的DBUtil类,用于在service层进行调用,下面是DBUtil源码

     1 package com.lovo.util;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 
     6 import org.apache.ibatis.io.Resources;
     7 import org.apache.ibatis.session.SqlSession;
     8 import org.apache.ibatis.session.SqlSessionFactory;
     9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    10 
    11 public class DBUtil {
    12     
    13     //所有的程序都要在到达数据库的时候访问SqlSessionFactory然后创建一个session(会话)
    14     private static SqlSessionFactory sessionFactory;
    15     //静态加载  只加载一次
    16     static {
    17         InputStream in = null;
    18         try {
    19             //通过输入流获取到SqlMapConfig.xml配置信息
    20             in = Resources.getResourceAsStream("SqlMapConfig.xml");
    21             
    22             //通过SqlSessionFactoryBuilder把SqlMapConfig.xml配置信息放在sessionFactory里面去
    23             sessionFactory = new SqlSessionFactoryBuilder().build(in);
    24             
    25         } catch (IOException e) {
    26             // TODO Auto-generated catch block
    27             e.printStackTrace();
    28         } finally {
    29             //记得关闭
    30             try {
    31                 if (in != null) in.close();
    32             } catch (IOException e) {
    33                 // TODO Auto-generated catch block
    34                 e.printStackTrace();
    35             }
    36         }
    37     }
    38     
    39     //返回一个数据库连接好了的sessionFactory会话
    40     public static SqlSession getSession(){
    41         return sessionFactory.openSession();
    42     }
    43 
    44 }

        这个没什么难度,就是获取inputstream流然后把SqlMapConfig.xml文件读取出来。

    最后贴上在service中的代码,个人使用的是biz命名,为了快速,所以没有写上接口

     1 package com.lovo.biz;
     2 
     3 import java.util.List;
     4 
     5 import org.apache.ibatis.annotations.Param;
     6 import org.apache.ibatis.session.SqlSession;
     7 
     8 import com.lovo.bean.User;
     9 import com.lovo.mapper.UserMapper;
    10 import com.lovo.util.DBUtil;
    11 
    12 public class UserBiz {
    13     //私有化获取到一个会话连接
    14     private SqlSession session = DBUtil.getSession();
    15     //因为UserMapper是一个接口   没有实现类   所以只能通过SqlSession下的getMapper来获取到他的对象
    16     UserMapper mapper = session.getMapper(UserMapper.class);
    17     
    18     public int regist(User user){
    19         int result = mapper.addUser(user);
    20         //要记得提交数据  不然是不会成功的
    21         session.commit();
    22         return result;
    23     }
    24     
    25     /**
    26      * 删除用户
    27      * @param id
    28      * @return
    29      */
    30     public int delUserById(int id){
    31         int result = mapper.delUserById(id);
    32         //要记得提交数据  不然是不会成功的
    33         session.commit();
    34         return result;
    35     }
    36     
    37     
    38     /**
    39      * 根据id查找用户用户
    40      * @param id
    41      * @return
    42      */
    43     public User findUserById(int id){
    44         User u = mapper.findUserById(id);
    45         session.commit();
    46         return u;
    47     }
    48 
    49     
    50     //查找有多少条用户信息
    51     public int findUserCount(){
    52         int count = mapper.findUserCount();
    53         session.commit();
    54         return count;
    55         
    56     }
    57     
    58     //根据name模糊查询user的list
    59     //因为String不是基本数据类型所以需要加上别名
    60     public List<User> findUserLikeName(@Param("name")String name){
    61         List<User> list = mapper.findUserLikeName(name);
    62         session.commit();
    63         return list;
    64     }
    65 }

           注意需要commit方法提交的时候是在对数据库进行操作的时候,列如增删改的时候

  • 相关阅读:
    【转】浅谈 C++ 中的 new/delete 和 new[]/delete[]
    指针与const
    【面经】【转】C程序的内存布局
    【面经】二叉树层次遍历
    【面经】【转】C++类型转换
    【转】fastdb中的数据字典
    AtCoder AGC043D Merge Triplets (DP、组合计数)
    AtCoder AGC024F Simple Subsequence Problem (字符串、DP)
    Codeforces 1110G Tree-Tac-Toe (博弈论)
    Luogu P5244 [USACO2019Feb Platinum] Mowing Mischief (动态规划、决策单调性)
  • 原文地址:https://www.cnblogs.com/x-long/p/7717195.html
Copyright © 2020-2023  润新知