JDBC编程中的问题

    1. 将SQL语句硬编码到Java代码,不利于系统维护。
        设想如何解决:将SQL单独抽取出来,在配置文件(xml方式、properties文件)进行配置。
    2. 数据库连接不能重复利用,对数据库资源是一中浪费。
        设想如何解决:使用数据库连接池管理数据库连接。
    3. 向Statement设置参数时,对于参数的位置通过硬编码指定,不利于系统维护。
        设想如何解决:是否能够自动将Java对象的值设置到Statement。
    4. 遍历结果集,resultSet.getString硬编码指定列名称。
        设想如何解决:能否自动将SQL查询结果集转成Java对象。

MyBatis介绍

        MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到google code,并且改名为MyBatis。
        MyBatis 是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。
        MyBatis 通过xml或主键的方式将要执行的statement配置起来,并通过Java对象和statement中的SQL进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射成Java对象并返回。
        MyBatis是一个不完全的ORM框架,MyBatis也可以进行对象关系映射,但是还是需要手动写SQL语句。Hibernate对JDBC的封装比较深,是一个完全的优秀的ORM框架,完全实现了Java对象到关系的映射,SQL不需要手动编写。

Mybatis框架

    Mybatis配置
    

    1. SqlMapConfig.xml是MyBatis的核心配置文件,配置了数据源(连接池)、事务mapper.xml是MyBatis的映射文件。
    2. SqlSessionFactory 会话工厂,用户生产会话SqlSession。
    3. SqlSession 会话,是一个面向用户的门面接口,用于操作数据库(CRUD)
    4. Executor执行器,SqlSession内部通过Executor操作数据库,Executor需要使用Mapped Statement中封装的数据信息来操作数据库。
    5. Mapped Statement是MyBatis一个底层封装对象,封装了SQL语句、传入SQL语句的参数,将SQL查询结果映射成Java对象。

Mybatis入门程序

    1. 添加jar包 下载地址:链接:http://pan.baidu.com/s/1mgtFYxa 密码:vq10 (包括源码)
        核心jar包是:mybatis-3.2.8.jar
        依赖jar包在lib目录下
        还需要自己添加数据库的jar包
        创建一个Java Project (下图是最终项目图)
        
    2. log4j.properties日志文件(主要用户控制台打印log)
        添加Source Folder :config,并且创建log4j.properties
        直接使用官网配置,只是改成DEBUG模式    
1
2
3
4
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    3. 创建SqlMapConfig.xml配置文件
        在config文件夹下创建SqlMapConfig.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<configuration>
    <!-- 和spring整合后environments配置将废除 -->
    <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?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
 
</configuration>

    4. 创建po类,User 在package com.hqu.model下 ,并创建数据库和对应表插入测试数据
        目标:将sql查询结果映射成Java对象,po类的属性和user表字段对应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.hqu.model;
 
import java.sql.Date;
 
public class User {
    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    private String detail;
    private float score;
 
    // getter and setter .. 
}

    5. 编写User.xml(mapper.xml文件 ) 在config创建文件夹sqlmap并创建User.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="test">
 
    <!-- 查询用户信息
    select :将select标签内容称为statement
    id:是在user.xml的唯一标识,statement的id
    parmeterType:指向sql(向statement中)中传入参数的类型
    #{}:表示一个点位符,{}中的id表示传入变量名,当传入单个值{}中的变量可以随意
    resultType:将sql查询结果集映射成java对象的类型 -->
    <select id="findUserByName" parameterType="string" resultType="com.hqu.model.User">
        select * from User where username = #{id}
    </select>
 
    <insert id="insertUser" parameterType="com.hqu.model.User">
        insert into
        user(username,birthday,sex,address,detail,score)
        values (#{username},#{birthday},#{sex},#{address},#{detail},#{score})
    </insert>
</mapper>

6.将User.xml在SqlMapConfig.xml配置

1
2
3
4
5
6
7
<configuration>
    ...
    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml" />
    </mappers>
</configuration>
7. Mybatis查询程序
    新建类测试测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class MybatisTest {
 
    SqlSession sqlSession = null;
 
    @Before
    public void before() throws IOException {
     
        String resource = "SqlMapConfig.xml"// mybatis的配置文件
 
        InputStream is = Resources.getResourceAsStream(resource);
 
        // 创建会话工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
 
        sqlSession = sqlSessionFactory.openSession(); // 从会话工厂中的到会话
    }
 
    @After
    public void after() {
        sqlSession.close(); // 释放资源
    }
 
    @Test
    public void testSelect() {
        // 通过sqlSession操作数据库
        // 第一个参数:user.xml定义的statement的id
        // 第二个参数:输入参数
        User user = sqlSession.selectOne("test.findUserByName""jerome");
        System.out.println(user);
    }
     
    @Test
    public void testInsert() {
 
        User user = new User();
        user.setUsername("jelly");
        user.setSex("女");
        user.setAddress("深圳");
        user.setScore(12f);
 
        sqlSession.insert("test.insertUser", user);
         
        sqlSession.commit(); // 提交事务
    }
 
}
结束。
code链接:http://pan.baidu.com/s/1sjlzpAP 密码:exmy

Mybatis是如何解决JDBC的问题

    1. 将SQL语句硬编码到Java代码,不利于系统维护。
        设想如何解决:将SQL单独抽取出来,在配置文件(xml方式、properties文件)进行配置。
        在mybatis的映射文件(如:User.xml)配置sql语句。
    2. 数据库连接不能重复利用,对数据库资源是一中浪费。
        设想如何解决:使用数据库连接池管理数据库连接。
        在SqlMapConfig.xml下的environments节点配置了连接池
    3. 向Statement设置参数时,对于参数的位置通过硬编码指定,不利于系统维护。(如preparedStatement.setString(1,"jerome"))
        设想如何解决:是否能够自动将Java对象的值设置到Statement。
         在User.xml中通过paramenterType,输入参数的类型,在sql语句通过#{}表示占位符号,{}写的是po的属性名,完成自动将java对象映射到sql语句中。
    4. 遍历结果集,resultSet.getString硬编码指定列名称。(如:resultSet.getString("id"))
        设想如何解决:能否自动将SQL查询结果集转成Java对象
        User user = sqlSession.selectOne("test.findUserByName", "jerome");

参考传智播客公开课:链接:http://pan.baidu.com/s/1bnbH2qj 密码:9f30
后期详细深入视频  链接:http://pan.baidu.com/s/1qWFTzQ0 密码:jqqx (资料暂时就这些了)
参考文档:
1. http://mybatis.org/mybatis-3/zh/index.html (MyBatis官方文档)
对应的pdf(英文):链接:http://pan.baidu.com/s/1pJrL42v 密码:2yq0
对应的pdf(中文):链接:http://pan.baidu.com/s/1pJqzBDp 密码:dwhf

MyBatis - 介绍、简单入门程序的更多相关文章

  1. JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明

    1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...

  2. JAVAEE——SpringMVC第一天:介绍、入门程序、架构讲解、SpringMVC整合MyBatis、参数绑定、SpringMVC和Struts2的区别

    1. 学习计划   第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a) 框架结构 b) 组件说明 4.SpringMVC整合MyBatis 5.参数绑定 a) Sp ...

  3. 【mybatis深度历险系列】mybatis的框架原理+入门程序解析

    在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和 ...

  4. springmvc(一) springmvc框架原理分析和简单入门程序

    springmvc这个框架真的非常简单,感觉比struts2还更简单,好好沉淀下来学习~ --WH 一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解 ...

  5. SpringMVC学习(一)———— springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  6. springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  7. mybatis由浅入深day01_4入门程序_4.6根据用户id(主键)查询用户信息

    4 入门程序 4.1 需求 根据用户id(主键)查询用户信息 根据用户名称模糊查询用户信息 添加用户 删除 用户 更新用户 4.2 环境 java环境:jdk1.7.0_72 eclipse:indi ...

  8. MyBatis(1)-简单入门

    简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...

  9. Mybatis(一)Mybatis简介与入门程序

    Mybatis简介: MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建 ...

随机推荐

  1. 利用JAVA多线程来提高数据处理效率

    肿瘤大数据挖掘中经常需要处理上百亿行的文本文件,这些文件往往高达数百GB,假如文件结构简单统一,那么用sed和awk 处理是非常方便和快速的.但有时候会遇到逻辑较为复杂的处理流程,这样我一般会用JAV ...

  2. android注解入门 并来自己写一个框架

    介绍 这里我带大家来学习一下注解 并且用来写下一个模仿xUtils3 中View框架 此框架 可以省略activity或者fragment的 findViewById 或者设置点击事件的烦恼 我正参加 ...

  3. 【事务】<查询不到同一调用方法其它事务提交的更新>解决方案

    最近遇到一个很棘手的问题,至今也解释不清楚原因,不过已经找到了解决方案. 先来看看Propagation属性的值含义,@Transactional中Propagation属性有7个选项可供选择: Pr ...

  4. Python 2.7 闭包的局限

    想法源自:http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to- ...

  5. Spring中配置DataSource的六种方式

    第一种:beans.xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource ...

  6. Android studio - Failed to find target android-18

    看了一下国外的解决方案,好多人也都遇到此类问题.看老外的聊天,由衷觉得着实的可爱,同时外国的月亮也不见得比国内的圆.以下是他们的对话(最后有一个小总结):   I have a problem wit ...

  7. EasyUI常用组件(基础)

    ---------------------------------------------------------------------------------------------------- ...

  8. post插件

    分享牛系列,分享牛专栏,分享牛.在项目开发中,http请求方式是最常见的了.怎么模拟http请求呢?方法有很多种,可以使用httpclient直接模拟请求,也可以使用火狐post插件方式,这个章节主要 ...

  9. mysql字符集,insert,update,delete,select

    发现有错误:数据太长了.//查看数据库的所有编码:show variables like 'character%';-----+| character_set_client     | utf8    ...

  10. 23 服务IntentService Demo6

    MainActivity.java package com.qf.day23_service_demo2; import android.app.Activity; import android.co ...