MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
1、 mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
创建工程,并创建数据库
加入mybatis核心包、依赖包、数据驱动包。
lib下:依赖包
mybatis-3.2.7.jar:核心 包
mybatis-3.2.7.pdf,操作指南
在classpath下创建log4j.properties如下:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis默认使用log4j作为输出日志信息。
在classpath下创建SqlMapConfig.xml,如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--和spring整合后 environments配置将废除-->
<environmentsdefault="development">
<environmentid="development">
<!--使用jdbc事务管理-->
<transactionManagertype="JDBC"/>
<!-- 数据库连接池-->
<dataSourcetype="POOLED">
<propertyname="driver"value="com.mysql.jdbc.Driver"/>
<propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
<propertyname="username"value="root"/>
<propertyname="password"value="mysql"/>
</dataSource>
</environment>
</environments>
</configuration>
SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。
Po类作为mybatis进行sql映射使用,po类通常与数据库表对应,User.java如下:
Public class User {
private intid;
private Stringusername;// 用户姓名
private Stringsex;// 性别
private Datebirthday;// 生日
private Stringaddress;// 地址
get/set……
第六步:程序编写
在classpath下的sqlmap目录下创建sql映射文件Users.xml:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mappernamespace="test">
</mapper>
namespace :命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。
mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml,如下:
<mappers>
<mapperresource="sqlmap/User.xml"/>
</mappers>
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 命名空间,作用是对sql进行隔离,理解sql隔离
注意:使用mapper戴丽丽方法,namepace有特殊的重要作用
-->
<mappernamespace="test">
<!-- 在映射文件中配置很多sql语句 -->
<!--通过select执行数据库查询
id:表示映射文件中的sql
将sql语句封装到mappedstatement对象中,所以将id称为statement的id
parameterType指定输入数据类型,这里指定int型
resultType 指定sql输出结果的所影射的java对象类型,select指定resulttype表示将单条记录映射成java对象
#{}表示一个占位符?
#{id}: id表示接收的输入参数,参数名就是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以value或其他名称
-->
<selectid="findUserById"parameterType="int"resultType="cn.hpu.mybatis.po.User">
SELECT* FROM USER WHERE id=#{id}
</select>
<!-- 根据用户名称模糊查询用户
resultType:指定单条记录映射的java对象
${}表示拼接sql串,借接收的内容不加修饰拼接在Sql中,传入简单类型那么$中只能写value
使用${}可能会引起sql注入,or 1=1
-->
<selectid="findUserByName"parameterType="String"resultType="cn.hpu.mybatis.po.User">
SELECT* FROM USER WHERE username LIKE '%${value}%'
</select>
<!--
添加用户
#{}中指定pojo的属性名,接收到对象的属性值,mybatis通过OGNL获取对象属性值-->
<insertid="insertUser"parameterType="cn.hpu.mybatis.po.User">
<!--
将插入数据的主键返回到user对象中
select last_insert_id() 得到刚执行插入的记录信息的主键值,只适用自增主键;
keyProperty 将查询到的主键值设置到parameterType指定的对象的那个属性
order 相对于insert的执行顺序
resultType 指定结果类型
-->
<selectKeykeyProperty="id"order="AFTER"resultType="int">
selectlast_insert_id()
</selectKey>
insertinto user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- uuid 返回非自增主键,主键需要是String -->
<!-- <insert id="insertUseruuid"parameterType="cn.hpu.mybatis.po.User"> -->
<!--
使用MYsql的uuid()生成主键
执行过程首先通过uuid()得到主键,将主键设置到user对象的id属性中
其次在insert执行时,从user对象中取出id属性值
-->
<!--
<selectKeykeyProperty="id" order="BEFORE"resultType="java.long.int">
selectuuid()
</selectKey>
insertinto user (id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
-->
<!-- 通过id删除用户 -->
<deleteid="deleteUser"parameterType="java.lang.Integer">
deletefrom user where id=#{id}
</delete>
<!-- 通过id更新用户 -->
<updateid="updateUser"parameterType="cn.hpu.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id};
</update>
</mapper>
1 mybatis配置文件
2 创建会话工厂传入mybatis的配置文件信息
3通过工厂得到SqlSession
4通过SqlSession操作数据库
5提交事物//释放资源
/**
* @author yang 2015 7 21
*/
public classMybatisFirst {
//根据id查询用户信息,得到一条记录结果
@Test
public void findUserById()throwsException{
//mybatis配置文件
Stringresource="SqlMapConfig.xml";
InputStreaminputStream=Resources.getResourceAsStream(resource);
//创建会话工厂 传入mybatis的配置文件信息
SqlSessionFactorysqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSessionsqlSession=sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数映射文件 statement的id ,等于命名空间加statement的id
//第二个参数,指定和映射文件中所匹配的paratertype类型的参数
//sqlSeeion.selectOne 结果是与映射文件中所匹配的resulttype类型的对象
User user =sqlSession.selectOne("test.findUserById",1);
System.out.println(user);
//释放资源
sqlSession.close();
}
//根据用户名称模糊查询用户列表
@Test
public void findUserByName()throws Exception{
//mybatis配置文件
Stringresource="SqlMapConfig.xml";
InputStreaminputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionsqlSession=sqlSessionFactory.openSession();
//sqlSeeion.selectList结果是与映射文件中所匹配的resulttype类型的对象
List<User> list=sqlSession.selectList("test.findUserByName","小明");
System.out.println(list);
//释放资源
sqlSession.close();
}
//添加用户
@Test
public void insertUser()throws Exception{
Stringresource="SqlMapConfig.xml";
InputStreaminputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionsqlSession=sqlSessionFactory.openSession();
//用户数据
Useruser=new User();
user.setUsername("王小军");
user.setBirthday(newDate());
user.setSex("1");
user.setAddress("河南焦作");
//通过SqlSession操作数据库
sqlSession.insert("test.insertUser",user);
//提交事物
sqlSession.commit();
//获取用户信息主键 主键返回
System.out.println("id:"+user.getId());
//释放资源
sqlSession.close();
}
//根据id删除用户
@Test
public void deleteUsertest()throws Exception{
Stringresource="SqlMapConfig.xml";
InputStreaminputStream=Resources.getResourceAsStream(resource);
SqlSessionFactorysqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionsqlSession=sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUser",28);
sqlSession.commit();
//释放资源
sqlSession.close();
}
//更新用户
@Test
public void UpdateUserById()throws Exception{
Stringresource="SqlMapConfig.xml";
InputStreaminputStream=Resources.getResourceAsStream(resource);
SqlSessionFactorysqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSessionsqlSession=sqlSessionFactory.openSession();
//用户数据
Useruser=new User();
user.setId(30);
user.setUsername("安");
user.setBirthday(newDate());
user.setSex("1");
user.setAddress("河南焦作");
//通过SqlSession操作数据库
sqlSession.update("test.updateUser",user);
sqlSession.commit();
//释放资源
sqlSession.close();
}
}