zoukankan      html  css  js  c++  java
  • 优于jdbc的mybatis框架入门

    1.什么是mybatis?

    MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录.

      1)MyBATIS 目前提供了三种语言实现的版本,包括:Java、.NET以及Ruby。(我主要学习java,就讲java的使用)
      2)它提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
      3)mybatis与hibernate的对比?

       mybatis提供一种“半自动化”的ORM实现。
       这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。

        而mybatis的着力点,则在于POJO与SQL之间的映射关系

    2.结构目录详情:

    3.设置配置文件如下:

    <?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>
    
        <!-- 此处的alias是指的别名,对应实体类的别名;在“type”中最好加入全路径 -->
        <typeAliases> 
            <!-- 别名方式1,一个一个的配置 type中放置的是类的全路径,alias中放置的是类别名-->
            <typeAlias alias="City" type="mybatis.City"/> 
             
            <!-- 别名方式2,自动扫描,将JAVA类的类名作为类的类别名 
            <package name="com.wenyin.mybatis.beans"/>  
            -->
            
        </typeAliases> 
        
        <!-- 环境配置,连接数据库需要的ip、用户名、密码等 -->
        <environments default="development">
            <environment id="development">
            <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/City" />
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
                </dataSource>
            </environment>
        </environments>
        
        
        <mappers>
            <!-- 告知映射文件方式1,一个一个的配置,配置时使用全路径-->
            <mapper resource="mybatis/CityMapper.xml"/>
            <!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 
            <package name="com/wenyin/mybatis/mapper"/>
            -->
        </mappers>
    </configuration>

    4.建立对应的实体类:

    package mybatis;
    
    public class City {
    
        public int ID;
        public String Name;
        public String CountryCode;
        public String District;
        public int Population;
        
        public int getID() {
            return ID;
        }
        public void setID(int iD) {
            ID = iD;
        }
        public String getName() {
            return Name;
        }
        public void setName(String name) {
            Name = name;
        }
        public String getCountryCode() {
            return CountryCode;
        }
        public void setCountryCode(String countryCode) {
            CountryCode = countryCode;
        }
        public String getDistrict() {
            return District;
        }
        public void setDistrict(String district) {
            District = district;
        }
        public int getPopulation() {
            return Population;
        }
        public void setPopulation(int population) {
            Population = population;
        }
        
        @Override
        public String toString() {
            return "World [ID=" + ID + ", Name=" + Name + ", CountryCode="
                    + CountryCode + ", District=" + District + ", Population="
                    + Population + "]";
        }
    
        
    }

    5.配置CityMapper.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">
    
    <!-- namespace对应Cofiguration中的resource,但是后缀名不用加 -->
    <mapper namespace="mybatis.CityMapper">
        <!--  -->
        <select id="selectCityByCountryCode" parameterType="String" resultType="City">
            select * from city where CountryCode = #{CountryCode}
        </select>
    </mapper>

    6.测试类进行测试:

    package mybatis;
    
    import java.io.IOException;
    import java.io.Reader;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    public class MybatisDemo {
    
            public static void main(String[] args) throws IOException {
                //mybatis的配置文件
                String resource = "mybatis/Configuration.xml";
                //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
                Reader conf = Resources.getResourceAsReader(resource);
                //构建sqlSession的工厂
                SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(conf);
                //创建能执行映射文件中sql的sqlSession
                SqlSession session = sessionFactory.openSession();
                /**
                 * 映射sql的标识字符串,
                 * mybatis.CityMapper是CityMapper.xml文件中mapper标签的namespace属性的值,
                 * selectCityByCountryCode是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
                 */
                String statement = "mybatis.CityMapper.selectCityByCountryCode";//映射sql的标识字符串
                //执行查询返回一个唯一City对象的sql
                City wo = session.selectOne(statement, "ANT");
                System.out.println(wo);
            }
    }

    =====================================================================================================

    使用接口:

    新建一个接口类,CityInterface

    package inter;
    
    import mybatis.City;
    
    public interface CityInterface {
        public abstract City selectCityByCountryCode(String CountryCode);
    }

     此时需要修改CityMapper.xml中的namespace的值,namespace的值必须为对应的接口类的全路径

    <mapper namespace="inter.CityInterface">
        <!--  -->
        <select id="selectCityByCountryCode" parameterType="String" resultType="City">
            select * from city where CountryCode = #{CountryCode}
        </select>
    </mapper>

    修改测试类:

    package mybatis;
    
    import inter.CityInterface;
    import java.io.IOException;
    import java.io.Reader;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    public class MybatisDemo {
            public static void main(String[] args) throws IOException {
                //mybatis的配置文件
                String resource = "mybatis/Configuration.xml";
                //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
                Reader conf = Resources.getResourceAsReader(resource);
                //构建sqlSession的工厂
                SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(conf);
                //创建能执行映射文件中sql的sqlSession
                SqlSession session = sessionFactory.openSession();
                CityInterface cityInter  = session.getMapper(CityInterface.class);
                City city = cityInter.selectCityByCountryCode("ANT");
                System.out.println(city);
            }
    }

    ========================================================================================

    实现数据的增删改查:

    前面已经讲到用接口的方式编程。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:
    1. 用 mybatis 查询数据,包括列表
    2. 用 mybatis 增加数据
    3. 用 mybatis 更新数据.
    4. 用 mybatis 删除数据.

    查询数据,前面已经讲过简单的,主要看查询出列表,也就是返回list, 在我们这个例子中也就是 List<City> , 这种方式返回数据,需要在CityMapper.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的:

    <?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">
    
    <!-- namespace对应Cofiguration中的resource,但是后缀名不用加 -->
    <mapper namespace="inter.CityInterface">
        <!-- 制定返回值类型为map,其中jdbcType对应的是数据库中字段类型,从数据库中取出数据时,自动封装成相应的类型
        否则取出的都是String型 -->
        <resultMap type="City" id="resultListCity">
            <id column="ID" property="ID" jdbcType="INTEGER"/>
            <result column="Name" property="Name" jdbcType="CHAR"/>
            <result column="CountryCode" property="CountryCode" jdbcType="CHAR"/>
            <result column="District" property="District" jdbcType="CHAR"/>
            <result column="Population" property="Population" jdbcType="INTEGER"/>
        </resultMap>
        
        <select id="selectCityByCountryCode" parameterType="String" resultMap="resultListCity">
            select * from city where CountryCode = #{CountryCode}
        </select>
    </mapper>

    接口中增加方法返回类型是List<City>的方法:

    package inter;
    
    
    import java.util.List;
    
    import mybatis.City;
    
    public interface CityInterface {
        public abstract List<City> selectCityByCountryCode(String CountryCode);
    }

    修改测试类如下:

    package mybatis;
    
    import inter.CityInterface;
    import java.io.IOException;
    import java.io.Reader;
    import java.util.List;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    public class MybatisDemo {
            public static void main(String[] args) throws IOException {
                //mybatis的配置文件
                String resource = "mybatis/Configuration.xml";
                //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
                Reader conf = Resources.getResourceAsReader(resource);
                //构建sqlSession的工厂
                SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(conf);
                //创建能执行映射文件中sql的sqlSession
                SqlSession session = sessionFactory.openSession();
                CityInterface cityInter  = session.getMapper(CityInterface.class);
                List<City> city = cityInter.selectCityByCountryCode("AFG");
    //            System.out.println(city.get(0));
    //            System.out.println(city.get(1));
    //            System.out.println(city.get(2));
                for(City c : city){
                    System.out.println(c);
                }
            }
    }
  • 相关阅读:
    closure
    运算符优先级
    css妙用
    BFC (块级格式化上下文)
    display:table-cell 详解
    line-height深入理解
    margin collapse
    探究 CSS 解析原理
    python入门
    spring与线程安全
  • 原文地址:https://www.cnblogs.com/redick/p/6656253.html
Copyright © 2011-2022 走看看