zoukankan      html  css  js  c++  java
  • 01_mybatis第一个应用程序

    1、mybatis简介

      a):MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

    iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
      b):MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
      c):每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
    用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
    2、搭建我们的第一个mybatis小demo
      这里说明下这个搭建步骤根据mybatis官方提供的文档示例进行搭建的、下面我贴出这个文档(此文档打包至下面mybatis相关jar包里面下载即可)截图:
      
      a):导入mybatis相关jar包及数据库驱动包
       demo结构图如下:
           b):Building SqlSessionFactory from XML(从XML配置文件中构建SqlSessionFactory)
        既然构建SqlsessionFactory的前提是从xml文件中那么接下来我们先编写这个mybatis的核心配置文件(mybatis.xml)及实体类映射文件(User.mapper.xml)
        
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <environments default="development">
    <environment id="development">
    <!-- 采用jdbc事务管理其 -->
    <transactionManager type="JDBC"/>
    <!-- 配置数据源 -->
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="111"/>
    </dataSource>
    </environment>
    </environments>
    <mappers>
    <!-- 引入实体类的映射文件 -->
    <mapper resource="edu/aeon/mybatis/entity/User.mapper.xml"/>
    </mappers>
    </configuration>
    实体类映射文件:User.mapper.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="edu.aeon.mybatis.entity">
    <select id="selectAllUsers" resultType="edu.aeon.mybatis.entity.User">
    select * from user
    </select>
    </mapper>

      c):编写User实体类:

    package edu.aeon.mybatis.entity;
    /**
     * user实体类
     * @author QQ1584875179
     */
    public class User {
        //用户id
        private int uid;
        //用户名
        private String uname;
        //用户密码
        private String upw;
        //↓setter/getter
        public int getUid() {
            return uid;
        }
        public void setUid(int uid) {
            this.uid = uid;
        }
        public String getUname() {
            return uname;
        }
        public void setUname(String uname) {
            this.uname = uname;
        }
        public String getUpw() {
            return upw;
        }
        public void setUpw(String upw) {
            this.upw = upw;
        }
        @Override
        public String toString() {
            return uid+"	"+uname+"	"+upw;
        }
    }

      因为我们每次操作数据库都要获得session(和数据库进行会话/通信)、所以便于代码的复用我们写一个获得session的工具类(MyBatisUtils.java): 

    package edu.aeon.mybatis.utils;
    
    import java.io.IOException;
    import java.io.InputStream;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    /**
     * mybatis工具类
     * @author QQ1584875179
     */
    public class MyBatisUtils {
        /**
         * @param resource 构建资源来自resource
         * @return 通过构建资源构建的SqlSessionFactory实例
         * @throws IOException 此处采取抛出异常到顶层、然后我们统一去处理
         */
        public static SqlSessionFactory getSqlSessionFactory(String resource) throws IOException{
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
        /**
         * @param resource 构建资源来自resource
         * @return 通过构建资源构建的SqlSessionFactory实例的openSession()方法获得SqlSession实例
         * @throws IOException 此处采取抛出异常到顶层、然后我们统一去处理
         */
        public static SqlSession getSqlSession(String resource) throws IOException{
            return getSqlSessionFactory(resource).openSession();
        }
    }

    接下来我们写个测试类(便于测试我们前面的各种配置是否正确):

    package edu.aeon.mybatis.test;
    
    import java.io.IOException;
    import java.util.List;
    import org.apache.ibatis.session.SqlSession;
    import edu.aeon.mybatis.entity.User;
    import edu.aeon.mybatis.utils.MyBatisUtils;
    
    public class Demo01Test {
        public static void main(String[] args) {
            try {
                SqlSession sqlSession = MyBatisUtils.getSqlSession("mybatis/mybatis.xml");
                List<User> userList=sqlSession.selectList("edu.aeon.mybatis.entity.selectAllUsers");
                System.out.println("用户id	用户名	用户密码");
                for(User user:userList){
                    System.out.println(user);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
    }

      数据库截图:

      

      测试结果(控制台)截图:

      

      可见前面我们所有的配置都是正确的!

      接下来为了节省你们搭建环境以及插入测试数据、我附上本次我数据库的创建表、以及测试数据

    ##创建一个mybatis的数据库
    create database mybatis;
    ##切换我们刚才创建的mybatis数据库为当前数据库
    use mybatis;
    ##创建(user)表
    create table user(uid int(3) primary key auto_increment,uname varchar(16),upw varchar(16));
    ##想user表中插入5条测试数据
    insert into user(uname,upw) values('lzj1','aeon1');
    insert into user(uname,upw) values('lzj2','aeon2');
    insert into user(uname,upw) values('lzj3','aeon3');
    insert into user(uname,upw) values('lzj4','aeon4');
    insert into user(uname,upw) values('lzj5','aeon5');

    最后我们对配置文件进行一次简化操作:

      a):简化mybatis的核心配置文件  

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <properties resource="database/database_mysql.properties"/>
    <typeAliases>
        <!-- 
        目的:简化配置文件的繁琐性、以前由包名+类名的形式均可变成所指定的别名类型、或者通过包名所配置后的类类型
        -->
        <!-- 第一种方式:为type属性中的内容指定引用别名为alias中的内容、指定之后所有关于type中的类型均可由alias内容代替 -->
        <!-- <typeAlias type="edu.aeon.mybatis.entity.User" alias="User"/> -->
        <!-- 第二种方式:通过包名配置、配置后所有该包下的类型均可有类名代替、不需要由以前的包名+类名的形式 -->
        <package name="edu.aeon.mybatis.entity"/>
    </typeAliases>
     <environments default="development">
     <environment id="development">
     <transactionManager type="JDBC"/>
     <dataSource type="POOLED">
     <property name="driver" value="${driver}"/>
     <property name="url" value="${url}"/>
     <property name="username" value="${username}"/>
     <property name="password" value="${password}"/>
     </dataSource>
     </environment>
     </environments>
     <mappers>
     <!-- 引入实体类到数据库的sql映射文件 -->
     <mapper resource="edu/aeon/mybatis/entity/User.Mapper.xml"/>
     </mappers>
    </configuration>

      b):简化实体类到数据库的sql映射文件

      

    <?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="edu.aeon.mybatis.entity.UserMapper">
     <insert id="insertUser" useGeneratedKeys="true" parameterType="User">
         insert into user(uname,upw) values(#{uname},#{upw})
     </insert>
     <delete id="deleteUser" parameterType="int">
         delete from user where uid = #{uid}
     </delete>
     <update id="updateUser" parameterType="User">
         update user set uname=#{uname},upw=#{upw} where uid=#{uid}
     </update>
     <select id="selectAllUsers" resultType="User">
         select uid,uname,upw from user
     </select>
     <select id="selectUser" resultType="User">
         select * from user where uid = #{uid}
     </select>
    </mapper>

      c):附上database_mysql.properties配置信息

    driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost:3306/mybatis
    username = root
    password = 111 

    解决实体类属性名和数据库表字段映射不一致获取不到值的情况:

      a):给数据库表字段起别名,别名对应类属性即可

      b):类属性和数据库表字段重新映射

      

    <select id="selectAllUsers" resultMap="UserMap">
         select uid,uname,upw from user
     </select>
     <!-- 此处重新映射了实体类属性名和数据库字段 、当然只针对需要重新映射的sql语句 (resultMap="UserMap"__id="UserMap") -->
     <resultMap type="User" id="UserMap">
         <id property="uid" column="uid"/>
         <result property="uname" column="uname"/>
         <result property="upw" column="upw"/>
     </resultMap>

    资源整理: 

      mybatis相关jar包下载链接:https://pan.baidu.com/s/1-GRtDOMYQFx0vvjs_QnJZw  提取码:3gal
      mysql数据库驱动包下载链接:https://pan.baidu.com/s/1L9nFhVmr5ns1Tez2kzmIoA  提取码:gzgw
      oracle数据库驱动包下载链接:https://pan.baidu.com/s/1XTogghptNxNNwM1pP_XY0A&nbsp  提取码:2y5m
      demo下载

    链接:https://pan.baidu.com/s/1x2Exj8l2ZGA0ChY6wUgE2w  

    提取码:d9mh

     

     

     

      mybatis增删改查:

    链接:https://pan.baidu.com/s/1jTB3aiUfyIhhRLvRTra7Vg  提取码:bve0

     

     

      
        

    如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

  • 相关阅读:
    Java equals compareTo()的区别
    Java getClass() VS instanceof VS ==
    HashMap与LinkedHashMap
    位运算的一些用例
    常见字符集和编码方式
    spring 打印所有创建的beans
    ApplicationContext之getBean方法详解
    多线程时Autowired自动注入问题
    使用Nexus创建Maven私服
    MYSQL timestamp用法
  • 原文地址:https://www.cnblogs.com/aeon/p/9749221.html
Copyright © 2011-2022 走看看