一,Mybatis介绍
Mybatis是apache 的一个开源项目,Mybatis是一个优秀持久层框架,他对jdbc的操作进行了封装,是开发者只需关注SQL本身。Mybatis通过xml或注释的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过java对象和statement中的的sql进行映射生成最终的sql语句,最后mybatis框架执行sql并将结果映射成java对象并返回。
二.Mybatis架构
三.Mybatis搭建
1.主配置文件(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>
//使用自动扫描包来定义别名
<typeAliases>
//<package>的name属性用于指定被定义的别名的包名,Mybatis会将com.ssm.bean包的POJO类以
首字母小写的非限定类名作为他的别名
<package name="com.ssm.bean"/>
</typeAliases>
//配置环境
<environments default="development">
//环境变量
<environment id="development">
//使用jdbc事务管理
<transactionManager type="JDBC" />
//数据源,数据库连接池
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />
<property name="username" value="root" />
<property name="password" value="briup" />
</dataSource>
</environment>
</environments>
/*配置映射文件路径(有四种方式)
1.<mapper resource="com/ssm/mapper/UserMapper.xml">使用类路径引入
2.<mapper url="file:///D:/com/sssm/mapper/UserMapper.xml">使用本地文件路径引入
3.<mapper class="com.ssm.mapper.UserMapper">使用接口类引入
4.<mapper resource="com.ssm.mapper">使用包名引入
这里使用类路径引入
*/
<mappers>
<mapper resource="com/ssm/mapper/UserMapper.xml">
</mappers>
</configuration>
2.建立一个实体类(User.java)
package com.sm.bean;
public class User {
private Integer id;
private String username;
private String jobs;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
}
}
3.建立数据库表(t_user)
4.建立dao层接口
package com.sm.mapper;
import com.sm.bean.User;
/*
这里是到层的接口不需写实现类,对应着UserMapper.xml文件,每个接口名和UserMapper.xml中标签id所
对应。参数类型对应配置文件的parameterType,返回值类型对应配置文件的resultType
*/
public interface UserMapper {
public User findUserById(Integer id);//通过id查询User
public int insertUser(User user);//插入User
public int updateById(User user);//更新User
public int deleteUserById(Integer id);//通过id删除User
}
5.建立一个映射文件(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>标签里面写sql语句
<mapper namespace="com.sm.mapper.UserMapper">
//映射查询语句,可自定义参数,返回结果集(parameterType参数的数据类型,resultType结果的数据类型)
这里举例,通过id查询表中信息
<select id="findUserById" parameterType="Integer" resultType="comssm.bean.User">
select * from t_user where id=#{id}
</select>
//模糊查询
<select id="findUserByName" parameterType="String" resultType="com.ssm.bean.User">
select * from t_user where username like concat('%',${value},'%')
</select>
//映射插入语句,执行后返回一个整数,代表插入的条数(statementType默认为预编译方式PREPARED)
<insert id="addUser" parameterType="com.ssm.bean.User" statementType="PREPARED">
inset into t_user(username,jobs,phone) values(#{username},#{jobs},#{phone})
</insert>
//映射更新语句,执行后返回一个整数,代表更新的条数
<update id="updateUser" parameterTyoe="com.ssm.bean.User">
update t_user set username=#{username},jobs=#{jobs},phone=#{phone}
where id=#{id}
</update>
//映射删除语句,执行后返回一个整数,代表删除的条数
<delete id="deleteUser" parameterType="Integer">
delete from t_user where id=#{id}
</delete>
//用于定义一部分SQL,然后可被其他语句引用此SQL
举例:
<sql id="user Conlumns">
id,username,jobs,phone
</sql>
<select id="findUserById" parameterType="Integer" resultType="com.ssm.bean.User">
select <include refid="user Columns">
from t_user
where id=#{id}
</select>
</mapper>
6.建立SessionFactory工厂类(功能创建Session对象)
package com.briup.mybatis.chap01;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoyUtil {
private static SqlSessionFactory sqlSessionFactoy;
static {
String resource="mybatis-config.xml";//主配置文件路径
try {
InputStream inputStream=Resources.getResourceAsStream(resource);
sqlSessionFactoy=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取SqlSession
public static SqlSession getSession() {
return sqlSessionFactoy.openSession();
}
}
7.测试类:MybatisTest.java
1.查询操作
//获取Session
SqlSessionFactoryUtil sqlSessionFactory=new SqlSessionFactoryUtil();
SqlSession sqlSession=sqlSessionFactory.getSession();
//通过id查询
User user=sqlSession.selectOne("com.ssm.mapper.UserMapper.findUserById",2);
//如果查询结果为多条数据(如果没有参数,可以不写)
List<User> list0=sqlSession.selectList("com.ssm.mapper.UserMapper.方法名",参数值);
//模糊查询
List<User> list1=sqlSession.selectList("com.ssm.mapper.UserMapper.方法名","参数值");
//关闭SqlSession
SqlSession.close();
2.插入操作
//前面获取Session的操作不想写了
User user=new User();
user.setUsername("tom");
user.setJobs("worker");
user.setPhone("13934283646");
int rows=sqlSession.insert("com.ssm.mapper.UserMapper.方法名",user);
//事务提交(插入操作必须有提交事务这一步)
sqlSession.commit();
//关闭SqlSession
sqlSession.close();
3.更新操作
User user=new User();
user.setId(4);
user.setUsername("tom");
user.setJobs("teacher");
user.setPhone("13645871234");
int rows=sqlSession.update("com.ssm.mapper.UserMapper.updateUser",user);
//事务提交(更新操作也需要提交事务)
SqlSession.commit();
//SqlSession关闭
SqlSesion.close();
4.删除操作
//通过id删除user
int rows=sqlSession.delete("com.ssm.mapper.UserMapper.deleteUser",4);
//事务提交(删除操作也需要提交事务)
sqlSession.commit();
//关闭SqlSession
sqlSession.close();
8.Mapper动态代理开发方式(测试类:MybatisTest1.java)
//获取Session
SqlSessionFactoryUtil sqlSessionFactory=new SqlSessionFactoryUtil();
SqlSession sqlSession=sqlSessionFactory.getSession();
//通过SqlSession帮上面dao层接口生成实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);//UserMapper为到层接口的类名
//通过实现类对象调用接口中抽象方法,从而映射到映射配置文件中的实现方法
User user=userMapper.findUserById(4);//获取到结果对象