早期ssh框架:spring struts2 hibernate. 目前使用ssm:spring(service) springMVC(servlet) mybatis(jdbc DbUtil)
1 准备数据库tb_user
@Test public void test() throws Exception{ // 1 加载驱动 Connection connection =null; PreparedStatement Statement = null; ResultSet resultSet = null; try { Class.forName("com.mysql.jdbc.Driver"); // 2 获取连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis","root","1234"); // 3 获取preparestatement String sql = "select * from tb_user where id = ?"; Statement = connection.prepareStatement(sql); // 4 设置参数 Statement.setLong(1,1L); // 5 执行查询,获取结果集 resultSet = Statement.executeQuery(); // 6 解析结果集 while (resultSet.next()){ System.out.println(resultSet.getString("user_name")); System.out.println(resultSet.getString("password")); System.out.println(resultSet.getInt("age")); } } finally { resultSet.close(); Statement.close(); connection.close(); } }原是apache的一个开源项目iBatis,后迁移到google code,ibatis3.x正式更名为Mybatis,ibatis 是一种“半自动化”的ORM实现。
Mybatis中文帮助文档
mybatis特点总结
支持自定义sql、存储过程、高级映射实现自动对SQL的参数设置实现自动对结果集进行解析和封装通过xml或者注解进行配置和映射,大大减少代码量数据源连接信息通过文件进行配置 mybatis是对jdbc进行了简单的封装,帮助用户进行sql参数的自动设置,已经结果集和java对象的自动映射。与Hibernate相比,配置更加简单、灵活、执行效率高。但是正因为此,所以没有实现完全自动化,需要手写SQL,这是优点也是缺点。图解:
配置文件 全局配置文件:mybatis-config.xml ->hibernate.cfg.xml,作用:配置数据源,引入映射文件 映射文件:XxMapper.xml -> xx.hbm.xml,作用:配置sql语句、参数、结果集封装等SqlSessionFactory 相当于Hibernate的SessionFactory,作用:获取SqlSession 通过new SqlSessionFactoryBuilder().build(inputStream)来构建, inputStream:读取配置文件的IO流sqlSession 相当于Hibernate的Session ,作用:执行CRUD操作Executor 执行器,SqlSession通过调用它来完成具体的CRUD 它是一个接口,提供了两种实现:缓存的实现、数据库的实现Mapped Statement 在映射文件里面配置,包含3部分内容: 具体的sql,sql执行所需的参数类型,sql执行结果的封装类型 参数类型和结果集封装类型包括3种: HashMap,基本数据类型,pojo需求:对tb_user表进行CRUD操作
ps:全局配置文件详解
properties属性读取外部资源 建立jdbc.properties如下 driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/mybatis username=root password=root可以在mybatis-config.xml中修改:
<!-- 引入外部资源文件,resource:相对路径,url:绝对路径 --> <properties resource="jdbc.properties" /> <property name="driver" value="${driver}" /> settings设置 cacheEnabled:该配置影响的所有映射器中配置的缓存的全局开关。默认为truelazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 默认为falseaggressiveLazyLoading:当启用时,带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之,每种属性将会按需加载。 默认truemapUnderscoreToCamelCase:是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 默认false数据库的字段名是user_name,POJO中的属性名字是userName,两端不一致,造成mybatis无法填充对应的字段信息。可以采用别名和开启mapUnderscoreToCamelCase(驼峰匹配)
<!-- 行为参数 --> <settings> <!-- 开启驼峰匹配:经典的数据库列名(多个单词下划线连接)映射到经典的java属性名(多个单词驼峰连接) --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> typeAliases类别名 使用类别名可以减少类全路径的书写 方式一:typeAliases <!-- 类型别名 --> <typeAliases> <!-- type:pojo类的全路径,alias:别名名称(可随便写,推荐和类名一致) --> <typeAlias type="com.atguigu.mybatis.pojo.User" alias="User"/> </typeAliases>缺点:每个pojo类都要去配置。 方式二:package
<typeAliases> <!-- 开启别名包扫描,name:包路径,扫描的别名就是类名,并且大小写不敏感 --> <package name="com.atguigu.mybatis.pojo"/> </typeAliases> tyreHandlers(类型处理器)(略)environments(环境) 指定默认执行的环境,可以通过程序修改 //构建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"test"); Mappers 用于定义sql映射语句,通知MyBatis去哪里找这些语句添加UserDaoMapper.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(命名空间):映射文件的唯一标识 --> <mapper namespace="UserDaoMapper"> <!-- 查询的statement,id:在同一个命名空间下的唯一标识,resultType:sql语句的结果集封装类型 --> <select id="queryUserById" resultType="com.atguigu.mybatis.pojo.User"> select *,user_name as username from tb_user where id=#{id} </select> <!-- 此处仅仅展示按id查询的sql语句 --> </mapper>对于映射文件,CRUD标签相当于设置statement,其中有属性id,resultType,parameterType以及内容
id:在同一个命名空间下的唯一标识;使用动态代理之后,要求和mapper接口的方法名一致。必须属性resultType:sql语句的结果集封装类型;使用动态代理之后,要求和mapper接口方法的返回类型一致。和resultMap二选一parameterType:参数类型;使用动态代理之后,要求和mapper接口的方法参数类型一致。可省略,这里就省略了内容:查询的sql语句运行测试通过!!
在写程序的时候,因为MyBatis是“半自动的”,生成sql语句和javaBean的,报错很难进行调试,需要使用日志进行调试。 使用log日志步骤
导入log4j-1.2.17.jar(版本没要求)添加log4j.properties log4j.rootLogger=DEBUG,A1 log4j.logger.org.apache=DEBUG log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n使用log日志运行结果截图
得一寸进一寸,得一尺进一尺,不断积累,飞跃必来,突破随之!!!