MyBatis由ibatis发展而来,是一个支持普通 SQL查询,存储过程和高级映射的优秀持久层层框架。MyBatis 消除 了几乎所有的 JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 对象映射成数据库中的记录。 本文将演示一个入门级的示例,希望能刚接触这块的朋友快速入门。
一、创建一个数据库表,本文使用的是ORACLE,建一个简单的表,顺便插入两条数据
create table USERS
(
u_id VARCHAR2(20) primary key,
u_name VARCHAR2(20),
u_password VARCHAR2(20)
);
insert into USERS values ('0001', 'zhangsan', '123456');
insert into USERS values ('0002', 'lisi', '123456');
二、创建工程,导入JAR包,包括mybatis包和数据库连接包
三、创建一个简单的JAVABEAN对象
package com.ljz.bean;
public class User {
private String u_id;
private String u_name;
private String u_password;
//必须要有这个无参构造方法,不然根据UserMapper.xml中的配置,在查询数据库时,将不能反射构造出User实例
public User(){
super();
}
public User(String u_id,String u_name,String u_password){
this.u_id = u_id;
this.u_name = u_name;
this.u_password = u_password;
}
//此处省略getter,setter方法
@Override
public String toString() {
String ret = "User对象:id:" + u_id + ",name:" + this.u_name +", password: " + this.u_password;
return ret;
}
}
四、创建DAO层接口
package com.ljz.mapper;
import java.util.List;
import com.ljz.bean.User;
public interface UserMapper {
//查询所有
public List<User> queryUserAll();
//查询数据
public User queryUserByName(String name);
//插入数据
public boolean insertUser(User user);
//更新数据
public boolean updateUser(User user);
//删除数据
public void deleteUser(User user);
}
该接口类似于Hibernate中的Dao接口,但在MyBatis中,该接口只需要声明即可,不需实现。
五、创建Dao的实现,也可以说是接口映射器,映射器对应的配置文件如下:
<?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">
<!-- namespace是UserMapper接口的路径 -->
<mapper namespace="com.ljz.mapper.UserMapper">
<!-- 这里的id必须和UserMapper接口中的接口方法名相同 -->
<select id="queryUserAll" resultType="com.ljz.bean.User">
select * from users
</select>
<select id="queryUserByName" parameterType="java.lang.String" resultType="com.ljz.bean.User">
select u_id, u_name,u_password from users where u_id = #{u_id}
</select>
<insert id="insertUser" parameterType="User">
insert into users(u_id,u_name,u_password) values (#{u_id},#{u_name},#{u_password})
</insert>
<update id="updateUser" parameterType="User" >
update users set u_name=#{u_name},u_password=#{u_password} where u_id = #{u_id}
</update>
<delete id="deleteUser" parameterType="User">
delete from users where u_id =#{u_id}
</delete>
</mapper>
六、创建数据源,也就是mybatis-config.xml文件的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Configuration 3.0 //EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- <settings>
<setting name="cacheEnabled" value="false"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="defaultExceptionType" value="REUSE"/>
</settings>
-->
<!-- 给bean起别名 -->
<typeAliases>
<typeAlias type="com.ljz.bean.User" alias="User"/>
</typeAliases>
<!-- 数据源配置 ORACLE -->
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="ljz"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--映射器xml装载进来 同等于把“dao”的实现装载进来 -->
<mappers>
<mapper resource="com/ljz/mapper/UserMapper.xml"/>
</mappers>
</configuration>
七、获得SqlSessionFactory实例
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder从我们刚刚配置的xml文件或者一个预定义的配置类的实例获得。此处我们定义一个MyibatisUtil类,用于获得SqlSessionFactory实例。由于SqlSessionFactory实例会在整个应用程序执行期间都会存在,应避免重复创建,所以应使用单例模式或静态单例模式。最好是依赖注入容器,通过Spring等框架创建支行程序来管理对象的生命周期。
package com.ljz.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyibatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static{
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
System.out.println("sqlSessionFactory : " + sqlSessionFactory);
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
八、测试
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中,每次请求后应记得像文件流操作一样关闭SqlSession对象,最好是在finally块中。
package com.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.ljz.bean.User;
import com.ljz.mapper.UserMapper;
import com.ljz.util.MyibatisUtil;
public class MyTest {
private SqlSessionFactory sqlSessionFactory
= MyibatisUtil.getSqlSessionFactory();
//查询所有的数据
public List<User> queryUserAll(){
List<User> list = null;
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
list = userMapper.queryUserAll();
// //根据ID查询数据
// User user = userMapper.queryUserByName("0002");
}finally{
sqlSession.close();
}
return list;
}
//插入数据 (节省空间,关键语句写在一起了)
public void insertUser(User user){
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//获得映射器对象后,就可以调用其中的方法了
userMapper.insertUser(user); //增
// userMapper.updateUser(user); //改
// userMapper.deleteUser(user); //删
sqlSession.commit(); //一定要加上此句进行提交啊
}finally{
sqlSession.close(); //良好的习惯,关闭
}
}
public static void main(String[] args) {
TestMapper test = new TestMapper();
// test.queryUserByName();
User user = new User("0003","tom", "123456");
test.insertUser(user);
List<User> list = test.queryUserAll();
for(User u : list){
System.out.println(u);
}
}
}