Mybatis学习总结(一).初探Mybatis

回顾JDBC编程

1.创建Maven工程,导入mysql依赖
<!-- MySql -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.32</version>
</dependency>

2.需求:根据用户 id 查询用户信息
用户表:
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) DEFAULT NULL COMMENT '密码',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` int(10) DEFAULT NULL COMMENT '年龄',
  `sex` tinyint(1) DEFAULT NULL COMMENT '性别,1男性,2女性',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123456', '张三', '30', '1', '1984-08-08', '2014-09-19 16:56:04', '2014-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456', '李四', '21', '2', '1991-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '2', '1989-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '张伟', '20', '1', '1988-09-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '1', '1985-01-01', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'lilei', '123456', '李磊', '23', '1', '1988-08-08', '2014-09-20 11:41:15', '2014-09-20 11:41:15');

SQL:

SELECT * FROM tb_user WHERE id = ?

3.编写JDBC程序

/**
 * @Description:Jdbc连接数据库 
 * @author xingyuchao
 * @date 2016年8月2日 下午2:42:17 
 * @version V1.0
 */
public class JDBCTest {

    public static void main(String[] args) {
        ResultSet resultSet = null;
        PreparedStatement preparedStatement = null;
        Connection connection = null;
        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 创建数据库连接
            String url = "jdbc:mysql://127.0.0.1:3306/mybatis";
            String user = "root";
            String password = "123456";
            connection = DriverManager.getConnection(url, user, password);

            // 创建statmenet
            String sql = "SELECT * FROM tb_user WHERE id = ?";
            preparedStatement = connection.prepareStatement(sql);

            // 设置参数、执行sql,2个参数,第一个是参数的下标,从1开始,第二个参数数据查询条件数据
            preparedStatement.setLong(1, 1L);

            resultSet = preparedStatement.executeQuery();

            // 遍历结果集
            while (resultSet.next()) {
                System.out.println("ID: " + resultSet.getLong("id"));
                System.out.println("userName: " + resultSet.getString("user_name"));
                System.out.println("password: " + resultSet.getString("password"));
                System.out.println("name: " + resultSet.getString("name"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放连接(资源)
            if (null != resultSet) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            
            if(null != preparedStatement){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            
            if(null != connection){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

存在的问题:

1、 加载驱动的问题

  • 每次执行都要加载驱动
  • 驱动名称硬编码java代码中,如需修改驱动名称时,需要修改java文件再编译
  • 解决方案:将驱动名称放置到外部的配置文件中解决

2、 数据库连接信息硬编码到java代码中,解决:外部配置文件解决

3、 设置参数问题

  • 参数下标硬编码到java代码中,需要人工判断参数位置,使用不便
  • 参数值硬编码到代码中,如果要修改参数或者是根据不同的参数值查询,无法实现,解决:通过参数传入解决。
  • 希望能否自动判断参数下标和类型

4、 遍历结果集存在的问题,需要人工判断字段名以及位置或者参数的类型,导致使用不方便

  • 希望如果能将结果集直接映射为一个pojo对象那么使用就方便多了

5、 频繁的创建连接、关闭连接,导致资源浪费,影响应用的性能,解决:使用连接池解决


解决:使用Mybatis解决

Mybatis简介

  • Mybatis的前身是iBatis,Apache的一个开源项目,2010年这个项目从Apache迁移到Google Code改名为Mybatis 之后将版本升级到3.X,其官网:http://blog.mybatis.org/,从3.2版本之后迁移到github,目前最新稳定版本为:3.2.8。
  • Mybatis是一个类似于Hibernate的ORM持久化框架,支持普通SQL查询,存储过程以及高级映射。Mybatis通过使用简单的XML或注解用于配置和原始映射,将接口和POJO对象映射成数据库中的记录。
  • 由于Mybatis是直接基于JDBC做了简单的映射包装,所有从性能角度来看:JDBC > Mybatis > Hibernate

mybatis手动控制事务:http://toknowme.iteye.com/blog/2226645


Mybatis的整体架构



1、 mybatis配置文件,有2类配置文件

  • 全局配置文件,只能有一个,文件名不是固定的,约定文件名:mybatis-config.xml,配置了运行参数、插件、连接池等信息。
  •  Mapper.xml,映射文件,在整个mybatis中可以有多个配置文件,配置多个StatementSQL

2、 通过配置文件构造出SqlSessionFactory

3、 通过SqlSessionFactory获取到Sqlsession,通过SqlSession就可以操作数据库

4、 SqlSession同底层的执行器来执行StatementSQL),mybatis提供了2种执行器的实现

  • 基本实现
  • 带有缓存功能的实现

5、 执行器通过定义的Mapped Statement对象来执行SQL

6、 参数传入:参数类型有三种,HashMap、基本数据类型、POJO对象

7、 结果输出:输出结果集类型有三种,HashMap、基本数据类型、POJO对象


Mybatis使用步骤


1.导入依赖:
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.2.8</version>
</dependency>

2.编写全局配置文件 mybatis-config.xml

jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=123456

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>
	
	<!-- 加载配置文件 -->
	<properties resource="jdbc.properties"/>
	
	<!-- 
		配置环境,数据库连接
	 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<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>
		</environment>
	</environments>
	
	<!-- <mappers>
		<mapper resource="UserMapper.xml" /> 
	</mappers> -->
	
</configuration>


3.构建SqlSessionFactory
public class Mybatis {

    public static void main(String[] args) throws Exception {
        //定义配置文件名称
        String resource = "mybatis-config.xml";
        //通过Resources工具类读取配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //通过SqlSessionFactoryBuilder构造SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //或得到SqlSession
        SqlSession session = sqlSessionFactory.openSession();

        System.out.println(sqlSessionFactory);
        System.out.println(session);
    }

}
4.配置statement   UserMapper.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="abc">

	<select id="queryUserById" resultType="cn.zto.mybatis.pojo.User">
		SELECT * FROM tb_user WHERE id = #{id}
	</select>
	
</mapper>

User.java
public class User {

    private Long id;

    // 用户名
    private String userName;

    // 密码
    private String password;

    // 姓名
    private String name;

    // 年龄
    private Integer age;

    // 性别,1男性,2女性
    private Integer sex;

    // 出生日期
    private Date birthday;

    // 创建时间
    private Date created;

    // 更新时间
    private Date updated;
    
    //getter and setter
}  


5.将UserMapper.xml加入到Mybatis全局配置文件中

<mappers>
	<mapper resource="UserMapper.xml" /> 
</mappers>


6.根据Id查询用户信息

//名称空间.statemement
User user = session.selectOne("abc.queryUserById", 1);
System.out.println(user);
        
session.close();
测试结果:



如上无法获取到userName属性的值,是因为数据库中的字段为user_name,而对应到java对象的属性中为userName。因为需要在全局配置文件中加入驼峰标示配置(或者通过 sql语句字段起别名方式解决)
<settings>
	<!-- 开启驼峰映射 -->
	<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

添加日志支持

1.引入slf依赖
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.6.4</version>
</dependency>


2.添加log4j.properties
log4j.rootLogger=DEBUG,A1
log4j.logger.org.mybatis = 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值