• mybatis入门


    01.Mybatis_HelloWorld

    CREATE TABLE `tbl_employee` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `last_name` varchar(255) DEFAULT NULL,
      `gender` varchar(1) DEFAULT NULL,
      `email` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    建立与之对应的bean文件

    package com.atguigu.mybatis.bean;
    
    public class Employee {
        
        private Integer id;
        private String lastName;
        private String email;
        private String gender;
        
        
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        @Override
        public String toString() {
            return "Employee [id=" + id + ", lastName=" + lastName + ", email="
                    + email + ", gender=" + gender + "]";
        }
        
        
    
    }

    编写的时候最好保证bean对象的属性值和表名的字段一一对应,这里 private String lastName;和表字段last_name不对应我们看后面如何处理了这是一个关键点

    导入所需的jar包

    mybatis用到了log4j我们需要在src目录下建立一个log4j.xml

    我们创建一个source folder文件夹,必须是这个类型的文件夹,该类型下的文件夹和src在同一目录。source folder文件夹是一种特别的文件夹,如果你用面向对象的思想去看待这个source folder,那么他是folder的一个子集,作为子集,肯定是有folder的所有功能,而且还有自己特别的功能,他的特别之处,就是在source folder下面的java文件都会被编译,编译后的文件会被放在我们设置的某个文件夹下面(一般我们设置成WEB-INF/classes)

    conf目录如下

    log4m.xml文件夹的内容如下

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
     
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
     
     <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
       <param name="Encoding" value="UTF-8" />
       <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) 
    " />
       </layout>
     </appender>
     <logger name="java.sql">
       <level value="debug" />
     </logger>
     <logger name="org.apache.ibatis">
       <level value="info" />
     </logger>
     <root>
       <level value="debug" />
       <appender-ref ref="STDOUT" />
     </root>
    </log4j:configuration>

    mybatis-config.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">
                <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="123456" />
                </dataSource>
            </environment>
        </environments>
        <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
        <mappers>
            <mapper resource="EmployeeMapper.xml" />
        </mappers>
    </configuration>

    EmployeeMapper.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.atguigu.mybatis.dao.EmployeeMapper">
    <!-- 
    namespace:名称空间
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值
    
    public Employee getEmpById(Integer id);
     -->
        <select id="selectEmp" resultType="com.atguigu.mybatis.bean.Employee">
            select id,last_name lastName,email,gender from tbl_employee where id = #{id}
        </select>
    </mapper>

    上面因为bean的属性和数据库表名不一样,如何解决了在编写mysql的时候可以使用别名的方式来解决select id,last_name lastName,email,gender from tbl_employee where id = #{id},否则会出现问题

    EmployeeMapper.java

    package com.atguigu.mybatis.dao;
    
    import com.atguigu.mybatis.bean.Employee;
    
    public interface EmployeeMapper {
        
        public Employee getEmpById(Integer id);
    
    }

    MyBatisTest.java

    package com.atguigu.mybatis.test;
    
    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;
    import org.junit.Test;
    
    import com.atguigu.mybatis.bean.Employee;
    import com.atguigu.mybatis.dao.EmployeeMapper;
    
    public class MyBatisTest {
        /**
         * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
         * 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。 
         * 3、将sql映射文件注册在全局配置文件中
         * 4、写代码:
         *         1)、根据全局配置文件得到SqlSessionFactory;
         *         2)、使用sqlSessionFactory,获取到sqlSession对象使用他来执行增删改查
         *             一个sqlSession就是代表和数据库的一次会话,用完关闭
         *         3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
         */
    public SqlSessionFactory getSqlSessionFactory() throws IOException { 
         String resource
    = "mybatis-config.xml";
         InputStream inputStream
    = Resources.getResourceAsStream(resource);
        
    return new SqlSessionFactoryBuilder().build(inputStream);
    }

        @Test
    public void test() throws IOException {
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession();
    try { Employee employee = openSession.selectOne( "com.atguigu.mybatis.dao.EmployeeMapper.getEmpById", 1); System.out.println(employee); } finally { openSession.close(); } } }

     02.MyBatis_接口式编程

    注意openSession.getMapper()方法中的第二个参数类型为Object,传入的参数类型不够严格!!

    使用接口式编程:

    EmployeeMapper.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.atguigu.mybatis.dao.EmployeeMapper">
    <!-- 
    namespace:名称空间;指定为接口的全类名
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值
    
    public Employee getEmpById(Integer id);
     -->
        <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
            select id,last_name lastName,email,gender from tbl_employee where id = #{id}
        </select>
    </mapper>

    第一点:namespace="com.atguigu.mybatis.dao.EmployeeMapper">对应的是需要访问的接口的全类名
    第二点:<select id="getEmpById">中id的值和接口下的 public Employee getEmpById(Integer id);名字一一对应
    在程序中我们就可以采用接口编程了

    MyBatisTest.java

    package com.atguigu.mybatis.test;
    
    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;
    import org.junit.Test;
    
    import com.atguigu.mybatis.bean.Employee;
    import com.atguigu.mybatis.dao.EmployeeMapper;
    
    /**
     * 1、接口式编程
     *     原生:        Dao        ====>  DaoImpl
     *     mybatis:    Mapper    ====>  xxMapper.xml
     * 
     * 2、SqlSession代表和数据库的一次会话;用完必须关闭;
     * 3、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。
     * 4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
     *         (将接口和xml进行绑定)
     *         EmployeeMapper empMapper =    sqlSession.getMapper(EmployeeMapper.class);
     * 5、两个重要的配置文件:
     *         mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
     *         sql映射文件:保存了每一个sql语句的映射信息:
     *                     将sql抽取出来。    
     *
     * @author lfy
     *
     */
    public class MyBatisTest {
        
    
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        @Test
        public void test01() throws IOException {
            // 1、获取sqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
            // 2、获取sqlSession对象
            SqlSession openSession = sqlSessionFactory.openSession();
            try {
                // 3、获取接口的实现类对象
                //会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
                EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
                Employee employee = mapper.getEmpById(1);
                System.out.println(mapper.getClass());
                System.out.println(employee);
            } finally {
                openSession.close();
            }
    
        }
    
    }

      上面不在使用session的方法去增删改查,而使用getMapper将sql与接口对象进行绑定,获得接口操作的实现类,这样就可以使用接口的实现对象进行增删改查的操作了,接口的实现类是mybatis自己创建出来的,该对象是一个代理对象去实现增删改查操作。

    03.MyBatis_全局配置文件的属性

    _properties_引入外部配置文件

    添加配置文件dbconfig.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=123456
    
    orcl.driver=oracle.jdbc.OracleDriver
    orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
    orcl.username=scott
    orcl.password=123456

    mybatis-config.xml中加上<properties resource="dbconfig.properties"></properties>就可以这样引用数据源

    <dataSource type="POOLED">
         <property name="driver" value="${jdbc.driver}" />
         <property name="url" value="${jdbc.url}" />
         <property name="username" value="${jdbc.username}" />
         <property name="password" value="${jdbc.password}" />
     </dataSource>

    <setting name="mapUnderscoreToCamelCase" value="true"/>设置映射改成驼峰命名(驼峰命名就是表的字段名采用下划线间隔单词,例如last_name;而成员变量是第一个单词以小写字母开始,第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如lastName,注意没有下划线)的格式,在mybatis执行查询

    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
    select * from tbl_employee where id = #{id}
    </select>

    会把数据库的last_name的字段转化成lastName达到一一对应,但是在写代码的时候最好数据库的字段和实体类属性一一对应。

    _typeAliases_起别名

    resultType="com.atguigu.mybatis.bean.Employee"

    我们经常使用到com.atguigu.mybatis.bean.Employee,我们可以为它起一个简单的别名

    <!-- 3、typeAliases:别名处理器:可以为我们的java类型起别名
    别名不区分大小写
    -->
    <typeAliases>
    <!-- 1、typeAlias:为某个java类型起别名
    type:指定要起别名的类型全类名;默认别名就是类名小写;employee
    alias:指定新的别名
    -->
    <!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/> -->

    <!-- 2、package:为某个包下的所有类批量起别名
    name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
    -->
    <package name="com.atguigu.mybatis.bean"/>

    <!-- 3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名 -->
    </typeAliases>

    package com.atguigu.mybatis.bean;
    
    import org.apache.ibatis.type.Alias;
    
    @Alias("emp")
    public class Employee {
        
        private Integer id;
        private String lastName;
        private String email;
        private String gender;
        
        
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        @Override
        public String toString() {
            return "Employee [id=" + id + ", lastName=" + lastName + ", email="
                    + email + ", gender=" + gender + "]";
        }
         
    
    }

    mybatis为java类型起了下面的别名,注意不要与下面冲突!!

  • 相关阅读:
    Python paramiko模块
    前端基础:JavaScript介绍
    前端基础:CSS属性操作
    前端基础:CSS样式选择器
    前端基础:HTML标签(下)
    20181120-10 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 7
    beta阶段贡献分配实施
    Beta发布—美工+文案
    20181120-8 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 06
    20181120-8 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 05
  • 原文地址:https://www.cnblogs.com/skyblue123/p/12715150.html
Copyright © 2020-2023  润新知