MyBatis学习(1)HelloWorld、mybatis-config

    技术2022-07-13  69

    1. 概述

    MyBatis将重要的步骤抽取出来可以人工定制,其他步骤自动化;重要步骤都是写在配置文件中(好维护);完全解决数据库的优化问题;MyBatis底层就是对原生JDBC的一个简单封装;sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据,且不失自动化功能;是一个半自动的持久化层框架;是一个轻量级的框架;

    HelloWorld

    (1) 导包

    mysql-connector-java-5.1.37-bin.jar mybatis-3.4.1.jar log4j-1.2.17.jar

    日志包log4j-1.2.17.jar在mybatis关键的环节会日志打印——依赖类路径下一个log4j.xml配置文件;

    (2) 写配置

    配置文件①:mybatis的全局配置文件,指导mybatis如何正确运行,如连接哪个数据库配置文件②:每一个方法都如何向数据库发送sql语句、如何执行(相当于Dao接口的实现类) 步骤: 将mapper的namespace属性改为接口的全类名配置细节我们写的dao接口的实现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_0325"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- mappers中注册我们所有的dao接口的实现文件--> <mappers> <!--resource:表示从类路径下找资源 --> <mapper resource="mybatis/EmployeeDao.xml"/> </mappers> </configuration> <?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:名称空间;写接口的全类名,相当于告诉MyBatis这个配置文件是实现哪个接口的; --> <mapper namespace="com.atguigu.dao.EmployeeDao"> <!-- Employee getEmployeeById(Integer id); int updateEmployee(Employee employee); boolean deleteEmployee(Integer id); int insertEmployee(Employee employee); --> <!-- select:用来定义一个查询操作 id:方法名,相当于是对于某个方法的实现 resultType:指定方法运行后的返回值类型(查询操作必须指定的) #{属性名}:从传入的参数中取值 --> <select id="getEmpById" resultType="com.atguigu.bean.Employee"> <!--sql语句不要写分号--> select * from t_employee where id=#{id} </select> <!--增删改操作不写返回值类型,其返回的是影响多少行mybatis自动处理--> <update id="updateEmployee"> update t_employee set empname=#{empName},email=#{email},gender=#{gender} where id=#{id} </update> <delete id="deleteEmployee" > delete from t_employee where id=#{id} </delete> <insert id="insertEmployee"> insert into t_employee(empname,gender,email) values(#{empName},#{gender},#{email}) </insert> </mapper>

    (3) 测试

    sqlSession.getMapper()获取到的是mybatis自动创建的接口的代理对象SqlSessionFactory创建SqlSession对象(工厂对象只创建一次实例)SqlSession相当于connection,与数据库进行交互(与数据库的一次会话,就应该创建一个新的SqlSession) public class MybatisCRUDTest { private SqlSessionFactory sqlSessionFactory; @Before public void InitSqlSessionFactory() throws IOException{ String resource = "mybatis-config.xml"; InputStream resourceAsStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); } @Test public void test01() throws IOException { SqlSession sqlSession = sqlSessionFactory.openSession(); EmplyeeDao emplyeeDao = sqlSession.getMapper(EmplyeeDao.class); try { //获取到的是mybatis自动创建的接口的代理对象 Employee employee = emplyeeDao.getEmployeeById(1); System.out.println(employee); } finally { sqlSession.close(); } } }

    2. mybatis-config的标签

    ① <properties>(了解)

    resouse:从类路径下引用资源url:引用磁盘路径或网络路径的资源 <configuration> <properties resource="dbconfig.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driverClass}"/> <property name="url" value="${jdbcUrl}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="EmployeeDao.xml"/> </mappers> </configuration>

    ②<settings> <settings>是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为:

    mapUnderscoreToCamelCase:是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射 <settings> <!-- name——配置项的key value——配置项的value--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>

    ③类型别名typeAliases(了解)

    别名默认是类名(不区分大小写),alias指定一个别名

    <typeAliases> <typeAlias alias="Employee" type="com.guigu.bean.Employee"/> </typeAliases>

    也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,默认别名也是类名:

    <typeAliases> <package name="com.guigu.bean"/> </typeAliases>

    指定package 的情况下可使用注解为某个 Java Bean 起别名:、

    @Alias("emp") public class Employee{ ... }

    MyBatis 为常见的 Java 类型内建的类型别名,它们都是不区分大小写的: ④类型处理器typeHandlers(了解) 原生JDBC会使用类型处理器 传入参数,也可以重写已有的类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。 具体做法为实现TypeHandler 接口, 或继承类 BaseTypeHandler, 并且可以(可选地)将它映射到一个 JDBC 类型。

    <typeHandlers> <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers>

    ⑤插件plugins(了解) 插件是 MyBatis 提供的一个非常强大的机制,我们可以通过插件来修改 MyBatis 的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。

    四大对象:

    Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, handleOutputParameters)StatementHandler (prepare, parameterize, batch, update, query)

    ⑥环境配置environments(了解) MyBatis 可以配置多个环境。每个environment 配置一个具体的环境,包含一个事务管理器transactionManager 和一个数据源dataSource (数据源和事务都用Spring的)

    <!--default="":默认使用哪个环境--> <environments default="development"> <!--id是当前环境的唯一标识--> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type=""> </dataSource> </environment> <environment id="test"> <transactionManager type="JDBC"></transactionManager> <dataSource type=""> </dataSource> </environment> </environments>

    ⑦数据库移植databaseIdProvider(了解) MyBatis 可以根据不同的数据库厂商执行不同的语句:

    <databaseIdProvider type="DB_VENDOR"> <!--name="":数据库厂商标识 value="":给标识起名字--> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider> <select id="getEmployeeById" resultType="Employee" databaseId="sqlserver"> select * from t_employee where id=#{id} </select> <select id="getEmployeeById" resultType="Employee" databaseId="db2"> select * from t_employee where id=#{id} </select> <select id="getEmployeeById" resultType="Employee" databaseId="mysql"> select * from t_employee where id=#{id} </select>

    ⑧映射器mappers SQL 映射文件需要使用mappers注册进来

    <!-- resource:使用相对于类路径的资源引用 --> <!-- url:引用磁盘路径或网络路径的资源 --> <!--class:使用dao接口全类名,须将dao.xml文件放在同一包下,且名字一致--> <!--class:使用带注释的dao接口全类名--> <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper class="org.mybatis.builder.AuthorMapper"/> <!--配合使用,重要的用配置文件--> </mappers> //使用注解 public interface EmployeeDaoAnnotation { @Select("select * from t_employee where id=#{id}") Employee getEmployeeById(Integer id); @Update("update t_employee set empname=#{empName},email=#{email},gender=#{gender} where id=#{id}") int updateEmployee(Employee employee); @Delete("delete from t_employee where id=#{id}") boolean deleteEmployee(Integer id); @Insert("insert into t_employee(empname,gender,email) values(#{empName},#{gender},#{email})") int insertEmployee(Employee employee); }

    批量注册:

    <!--批量注册name="":dao所在包名 仍然跟要求dao.xml文件同一包下--> <mappers> <package name="org.mybatis.builder"/> </mappers>
    Processed: 0.009, SQL: 9