回顾JDBC编程
1.创建Maven工程,导入mysql依赖
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
用户表:
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://blog.mybatis.org/
下载地址(3.2.8):https://github.com/mybatis/mybatis-3/releases
官方文档:http://www.mybatis.org/mybatis-3/
官方文档(中文版):http://www.mybatis.org/mybatis-3/zh/index.html
下载地址(3.2.8):https://github.com/mybatis/mybatis-3/releases
官方文档:http://www.mybatis.org/mybatis-3/
mybatis-spring文档:http://www.mybatis.org/spring/zh/index.html
mybatis手动控制事务:http://toknowme.iteye.com/blog/2226645
Mybatis的整体架构
1、 mybatis配置文件,有2类配置文件
- 全局配置文件,只能有一个,文件名不是固定的,约定文件名:mybatis-config.xml,配置了运行参数、插件、连接池等信息。
- Mapper.xml,映射文件,在整个mybatis中可以有多个配置文件,配置多个Statement(SQL)
2、 通过配置文件构造出SqlSessionFactory
3、 通过SqlSessionFactory获取到Sqlsession,通过SqlSession就可以操作数据库。
4、 SqlSession同底层的执行器来执行Statement(SQL),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>
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