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