MyBatis介绍 :
是一个优秀的开源持久层框架,半自动化的ORM框架,前身是IBatis,2010年由apache迁移到了google改名mybaits,2013迁移到了github
持久层数据框架 专注于数据库打交道的这个一个分层
持久层技术
1、JDBC a.java访问数据库
2、Hibernate 通过Hibernate框架访问数据库
3、MyBatis 通过MyBatis框架访问数据库
MyBatis第一个项目
导入jar包
添加配置文件src/mybatis.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>
<!-- 数据库的连接信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件信息 -->
<mappers>
<mapper resource="com/twy/dao/userinfoMapper.xml"/>
</mappers>
</configuration>
添加一个映射文件src/com/twy/dao/userinfoMapper.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="UserMapper">
<select id="findAllUser" resultType="com.twy.pojo.UserInfo">
select * from userinfo
</select>
</mapper>
javabean src/com/twy/pojo/UserInfo.java
package com.twy.pojo;
public class UserInfo {
String uid;
String uname;
String upwd;
String ubir;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getUbir() {
return ubir;
}
public void setUbir(String ubir) {
this.ubir = ubir;
}
@Override
public String toString() {
return "UserInfo [uid=" + uid + ", uname=" + uname + ", upwd=" + upwd + ", ubir=" + ubir + "]";
}
}
测试
package com.twy.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.twy.pojo.UserInfo;
public class TestUserInfo {
@Test
public void testFindAllUser() throws IOException {
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
InputStream ins = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sf = sb.build(ins);
SqlSession session = sf.openSession();
List<UserInfo> users = session.selectList("UserMapper.findAllUser");
for (UserInfo userInfo : users) {
System.out.println(userInfo);
}
}
}
结果
引入日志记录
加入log4j的jar文件
在src目录下加入log4j.properties的属性的文件
src/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
查看执行记录
详解配置文件
<?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>
<!-- 数据库的连接信息 -->
<environments default="development">
<environment id="development">
<!--JDBC(采用JDBC的方式来管理事务) MANAGED(由容器来管理事务的生命周期, spring) -->
<transactionManager type="JDBC"></transactionManager>
<!-- UNPOOLED(不使用连接池) POOLED(使用连接池) JNDI(通过JNDI容器获取数据库连接) -->
<dataSource type="POOLED">
<!-- db连接四要素 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 映射文件信息 -->
<mappers>
<!-- 注册单个映射文件 -->
<mapper resource="com/twy/dao/userinfoMapper.xml" />
<!-- <mapper url=”映射文件的路径”>:映射文件可以在本地,也可以在网络上 -->
<!--
<mapper class=”映射文件的类路径”>:注册单个映射文件
i. 此种方式是有条件限制的
1. 映射文件的文件名要和Dao接口的名称相同
2. 映射文件要和Dao接口在同一包中
3. 映射文件中的<mapper/>的namespace的值为Dao接口的全类名
-->
</mappers>
</configuration>
MyBatis API详解
1、 Resources
a) 资源,用于读取资源文件,有很多的方法都可以加载并解析资源文件,返回不同的IO流对象
2、 SqlSessionFactoryBuilder类
a) 用与创建SqlSessionFactory, 使用的是SqlSessionFactoryBuilder类的build方法, SqlSessionFactoryBuilder创建完了以后,自动的释放了;
3、 SqlSessionFactory
是一个重量级的对象(系统的开销非常大的一个对象),线程安全的, 可以通过他打开一个SqlSession
openSession(true):打开一个具有自动提交功能的SqlSession
openSession(false):需要手动的去提交
openSession():同openSession(false)
4、 SqlSession接口
对象用于执行持久化操作,一次会话以SqlSession的对象创建开始,SqlSession对象的关闭结束;
对象线程不安全,每次数据库的会话结束前需要马上调用关闭方法;
常用的方法:
增加:
Insert(String);
Insert(String, Object);
删除
Delete(String)
Delete(String, Object)
修改
Update(String)
Update(String, Object)
查询
selectOne():查询单个对象
selectList():查询列表
select():查询列表
增删查改完整案例
src/jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8
jdbc.uname=root
jdbc.upwd=123456
src/mybatis.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"></properties>
<!-- 注册单个类 -->
<!-- <typeAlias type="com.dn.pojo.Userinfo" alias="user"/> -->
<!-- 注册别名 -->
<typeAliases>
<!-- 批量注册 -->
<package name="com.twy.pojo" />
</typeAliases>
<!-- 数据库的连接信息 -->
<environments default="development">
<!-- 环境一 -->
<environment id="development">
<!--JDBC(采用JDBC的方式来管理事务) MANAGED(由容器来管理事务的生命周期, spring) -->
<transactionManager type="JDBC"></transactionManager>
<!-- UNPOOLED(不使用连接池) POOLED(使用连接池) JNDI(通过JNDI容器获取数据库连接) -->
<dataSource type="POOLED">
<!-- db连接四要素 -->
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.uname}" />
<property name="password" value="${jdbc.upwd}" />
</dataSource>
</environment>
</environments>
<!-- 映射文件信息 -->
<mappers>
<!-- 注册单个映射文件 -->
<mapper resource="com/twy/dao/userinfoMapper.xml" />
<!-- <mapper url="file:///E:\ssss\sss.xml"/> -->
<!-- <mapper class="com.twy.pojo.Userinfo"/> <package name="com.dn.dao"/> -->
</mappers>
</configuration>
src/com/twy/pojo/UserInfo.java
package com.twy.pojo;
public class UserInfo {
int uid;
String uname;
String upwd;
String ubir;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getUbir() {
return ubir;
}
public void setUbir(String ubir) {
this.ubir = ubir;
}
@Override
public String toString() {
return "UserInfo [uid=" + uid + ", uname=" + uname + ", upwd=" + upwd + ", ubir=" + ubir + "]";
}
}
src/com/twy/dao/userinfoMapper.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="UserMapper">
<select id="findAllUser" resultType="userinfo">
select * from userinfo
</select>
<select id="findById" resultType="userinfo" parameterType="int">
select * from userinfo where uid=#{id}
</select>
<insert id="addUser" parameterType="userinfo">
insert into userinfo(uname,upwd,ubir) values(#{uname},#{upwd},#{ubir})
</insert>
<delete id="delUser" parameterType="int">
delete from userinfo where uid=#{id}
</delete>
<update id="updateUser" parameterType="userinfo">
update userinfo set uname=#{uname},upwd=#{upwd},ubir=#{ubir} where uid=#{uid}
</update>
</mapper>
测试
package com.twy.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.twy.pojo.UserInfo;
public class TestUserInfo {
@Test
public void testFindAllUser() throws IOException {
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
InputStream ins = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sf = sb.build(ins);
SqlSession session = sf.openSession();
List<UserInfo> users = session.selectList("UserMapper.findAllUser");
for (UserInfo userInfo : users) {
System.out.println(userInfo);
}
}
@Test
public void testFindById() throws IOException {
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
InputStream ins = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sf = sb.build(ins);
SqlSession session = sf.openSession();
UserInfo userInfo = session.selectOne("UserMapper.findById", 1);
System.out.println(userInfo);
}
@Test
public void testAddUser() throws IOException {
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
InputStream ins = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sf = sb.build(ins);
SqlSession session = sf.openSession();// sf.openSession(true)自动提交事务
UserInfo userInfo = new UserInfo();
userInfo.setUname("孙行者");
userInfo.setUbir("200-5-20");
userInfo.setUpwd("888888");
session.insert("UserMapper.addUser", userInfo);
session.commit();
}
@Test
public void testDelUser() throws IOException {
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
InputStream ins = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sf = sb.build(ins);
SqlSession session = sf.openSession();
session.delete("UserMapper.delUser", 1);
session.commit();
}
@Test
public void testUpdateUser() throws IOException {
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
InputStream ins = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sf = sb.build(ins);
SqlSession session = sf.openSession();
UserInfo userInfo = new UserInfo();
userInfo.setUid(2);
userInfo.setUname("孙行者");
userInfo.setUbir("200-5-20");
userInfo.setUpwd("666666");
session.update("UserMapper.updateUser", userInfo);
session.commit();
}
}