欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis 学习笔记(一)

程序员文章站 2022-07-12 22:36:53
...

mybatis

标签:


为什么要使用 mybatis

  • MyBatis是一个半自动化的持久化层框架。
  • JDBC:
    1. SQL夹在Java代码块里,耦合度高导致硬编码内伤
    2. 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
  • Hibernate和JPA
    1. 长难复杂SQL,对于Hibernate而言处理也不容易
    2. 内部自动生产的SQL,不容易做特殊优化。
    3. 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
  • 对开发人员而言,核心sql还是需要自己优化
  • sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。

哪里下载

mybatis Github 下载地址

Mybatis-HelloWorld

大纲:

  • 创建测试表
  • 创建对应实体 java bean
  • 创建配置mybatis配置文件,sql映射文件。

mybatis 操作数据库:

  1. 创建 mybatis全局配置文件
    影响 MyBatis 行为甚深 的设置(settings)和属性(properties)信息、如数据 库连接池信息等。可参考官方说明文档。

2.创建 sql 映射文件
映射类的工作相当于定义Dao接口的实现类。

3.测试

  1. 根据全局配置文件SqlSessionFactoryBuilder创建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resource.getResourceAsSream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
  1. 使用 SqlSessionFactory 获取sqlSession对象。
    一个 sqlSession 代表一次数据库会话
SqlSession openSession = factory.openSession()

try{
Object object = openSession.selectOne("com.sumulige.java.dao.EmployeeManager.getEmployed",1);

System.out.println(object);
}finally{
  openSession.close();
}
  1. 详细操作:
  • 1、新建文件夹 lib 并将如下三个 jar 粘贴进来,右键
    mybatis 学习笔记(一)
    mybatis 学习笔记(一)
  • 2、项目跟路径下新建 conf 配置文件,并分别添加 log4j.xml;mybatis-config.xml;EmployeeMapper.xml
    mybatis 学习笔记(一)
  • 3、三个配置文件的详细配置
  • 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.mybatis.dao.EmployeeMapper">
        <!--
        namespace:名称空间;指定为接口的全类名
        id:唯一标识
        resultType:返回值类型
        #{id}:从传递过来的参数中取出id值
    
        public Employee getEmpById(Integer id);
         -->
        <!--getEmployeeById-->
        <select id="getEmployeeById" resultType="com.mybatis.entity.Employee">
    		select id,last_name lastName,email,gender from employee where id = #{id}
    	</select>
    </mapper>
    
  • log4j.xml
        <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration>
    
        <!-- 将日志信息输出到控制台 -->
        <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
            <!-- 设置日志输出的样式 -->
            <layout class="org.apache.log4j.PatternLayout">
                <!-- 设置日志输出的格式 -->
                <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
            </layout>
            <!--过滤器设置输出的级别-->
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <!-- 设置日志输出的最小级别 -->
                <param name="levelMin" value="WARN" />
                <!-- 设置日志输出的最大级别 -->
                <param name="levelMax" value="ERROR" />
                <!-- 设置日志输出的xxx,默认是false -->
                <param name="AcceptOnMatch" value="true" />
            </filter>
        </appender>
    
        <!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
        <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
            <!-- 设置日志信息输出文件全路径名 -->
            <param name="File" value="D:/log4j/RollingFileAppender.log" />
            <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
            <param name="Append" value="true" />
            <!-- 设置保存备份回滚日志的最大个数 -->
            <param name="MaxBackupIndex" value="10" />
            <!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
            <param name="MaxFileSize" value="10KB" />
            <!-- 设置日志输出的样式 -->
            <layout class="org.apache.log4j.PatternLayout">
                <!-- 设置日志输出的格式 -->
                <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
            </layout>
        </appender>
    
        <!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
        <appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
            <!-- 设置日志信息输出文件全路径名 -->
            <param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
            <!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
            <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
            <!-- 设置日志输出的样式 -->
            <layout class="org.apache.log4j.PatternLayout">
                <!-- 设置日志输出的格式 -->
                <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
            </layout>
        </appender>
    
    
        <!--
         注意:
         1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
         2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
            2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
            2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则2-1的情况是一样的
            2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
         3:logger中定义的level和appender中的filter定义的level的区间取交集
         4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
         -->
    
        <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
        <logger name="test.log4j.test8.UseLog4j" additivity="false">
            <level value ="WARN"/>
            <appender-ref ref="DailyRollingFileAppender"/>
        </logger>
    
        <!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
        <logger name="test.log4j.test8.UseLog4j_" additivity="false">
            <level value ="ERROR"/>
            <appender-ref ref="RollingFileAppender"/>
        </logger>
    
        <!-- 根logger的设置-->
        <root>
            <level value ="INFO"/>
            <appender-ref ref="ConsoleAppender"/>
            <appender-ref ref="DailyRollingFileAppender"/>
        </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="root" />
    			</dataSource>
    		</environment>
    	</environments>
    	<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
    	<mappers>
    		<mapper resource="EmployeeMapper.xml" />
    	</mappers>
    </configuration>
    
  • 4、代码编写
  • EmployeeMapper.java
      public interface EmployeeMapper {
    
        public Employee getEmployeeById(Integer id);
    }
    
  • Employee.java
      public class Employee {
    
        private Integer id;
        private String lastName;
        private String email;
        private String gender;
    
        public Employee() {
        }
    
        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 boolean equals(Object o) {
            if (this == o){ return true;}
            if (!(o instanceof Employee)) {return false;}
            Employee employee = (Employee) o;
            return Objects.equals(id, employee.id) &&
                    Objects.equals(lastName, employee.lastName) &&
                    Objects.equals(email, employee.email) &&
                    Objects.equals(gender, employee.gender);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(id, lastName, email, gender);
        }
    
        @Override
        public String toString() {
            return "Employee{" +
                    "id=" + id +
                    ", lastName='" + lastName + '\'' +
                    ", email='" + email + '\'' +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    }
    
  • MybatisTest.java
      /**
     * 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);
        }
    
        /**
         * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
         * 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
         * 3、将sql映射文件注册在全局配置文件中
         * 4、写代码:
         * 		1)、根据全局配置文件得到SqlSessionFactory;
         * 		2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
         * 			一个sqlSession就是代表和数据库的一次会话,用完关闭
         * 		3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
         *
         * @throws IOException
         */
        @Test
        public void test() throws IOException {
    
            // 2、获取sqlSession实例,能直接执行已经映射的sql语句
            // sql的唯一标识:statement Unique identifier matching the statement to use.
            // 执行sql要用的参数:parameter A parameter object to pass to the statement.
            SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    
            SqlSession openSession = sqlSessionFactory.openSession();
            try {
                Employee employee = openSession.selectOne(
                        "com.mybatis.dao.EmployeeMapper.getEmployeeById", 1);
                System.out.println(employee);
            } finally {
                openSession.close();
            }
    
        }
    
        @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.getEmployeeById(1);
                System.out.println(mapper.getClass());
                System.out.println(employee);
            } finally {
                openSession.close();
            }
    
        }
    
    }
    
  • 5、项目览图
    mybatis 学习笔记(一)
相关标签: Mybatis HelloWorld