1.Mybatis框架中设计两个主要对象 SqlSessionFactory、SqlSession.
**SqlSessionFactory:**是单个数据库映射关系经过编译后的内存镜像,主要用来创建SqlSession。
SqlSessionFactory一旦被创建,整个应用执行期间都会存在,若多次创建同一个数据库的SqlSessionFactory,有可能增加数据库不必要的资源消耗,所以一般,通常每个数据库都只对应一个SqlSessionFactory,在创建SqlSessionFactory时,一般使用单例模式。
SqlSession是应用程序与持久层(模型层)之间执行交互操作的一个单线程对象,主要用来执行 持久化操作。
使用SqlSession对象后,要及时关闭,一般地,放在finally快中关闭。
2.Mybatis 核心配置文件 与 映射文件 常用XML节点总结:
核心配置文件(mybatis-config.xml):
映射文件:
3.demo:(具体每个文件在后面)
4.附件
其中,mybatis-config.xml 是Mybatis框架 的配置文件(一般放在项目默认资源目录下) :
<?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="db.properties" />
<!-- 定义别名 -->
<typeAliases>
<!-- <typeAlias alias="user" type="com.ssm.po.User" /> -->
<package name="com.ssm.po" />
</typeAliases>
<!-- 配置自定义工厂 -->
<objectFactory type="com.ssm.factory.MyObjectFactory">
<property name="name" value="MyObjectFactory"/>
</objectFactory>
<!--1.配置环境 ,默认的环境id为mysql -->
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<!--数据库连接池 -->
<dataSource type="POOLED">
<!-- 数据库驱动 -->
<property name="driver" value="${jdbc.driver}" />
<!-- 连接数据库的url -->
<property name="url" value="${jdbc.url}" />
<!-- 连接数据库的用户名 -->
<property name="username" value="${jdbc.username}" />
<!-- 连接数据库的密码 -->
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--2.配置Mapper的位置 -->
<mappers>
<mapper resource="com.ssm.mapper/CustomerMapper.xml" />
<mapper resource="com.ssm.mapper/UserMapper.xml" />
</mappers>
</configuration>
核心配置中,引入的db.properties(数据库配置信息):
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
mybatis-config.xml 关联的映射文件 (CustomerMapper.xml、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">
<!-- namespace表示命名空间 -->
<mapper namespace="resources.com.ssm.mapper.CustomerMapper">
<!--根据客户编号获取客户信息 -->
<!--<select id="findCustomerById" parameterType="Integer"-->
<!--resultType="com.ssm.po.Customer">-->
<!--select * from t_customer where id = #{id}-->
<!--</select>-->
<!--定义表的前缀名 -->
<sql id="tablename">
${prefix}customer
</sql>
<!--定义要查询的表 -->
<sql id="someinclude">
from
<include refid="${include_target}" />
</sql>
<!--定义查询列 -->
<sql id="customerColumns">
id,username,jobs,phone
</sql>
<!--根据id查询客户信息 -->
<select id="findCustomerById" parameterType="Integer"
resultType="com.ssm.po.Customer">
select
<include refid="customerColumns"/>
<include refid="someinclude">
<property name="prefix" value="t_" />
<property name="include_target" value="tablename" />
</include>
where id = #{id}
</select>
<!--根据客户名模糊查询客户信息列表-->
<select id="findCustomerByName" parameterType="String"
resultType="com.ssm.po.Customer">
<!-- select * from t_customer where username like '%${value}%' -->
select * from t_customer where username like concat('%',#{value},'%')
</select>
<!-- 添加客户信息 -->
<!--<insert id="addCustomer" parameterType="com.ssm.po.Customer">-->
<!--insert into t_customer(username,jobs,phone)-->
<!--values(#{username},#{jobs},#{phone})-->
<!--</insert>-->
<!-- 更新客户信息 -->
<update id="updateCustomer" parameterType="com.ssm.po.Customer">
update t_customer set
username=#{username},jobs=#{jobs},phone=#{phone}
where id=#{id}
</update>
<!-- 删除客户信息 -->
<delete id="deleteCustomer" parameterType="Integer">
delete from t_customer where id=#{id}
</delete>
<!-- 3.添加客户信息 -->
<insert id="addCustomer" parameterType="com.ssm.po.Customer"
keyProperty="id" useGeneratedKeys="true">
insert into t_customer(username,jobs,phone)
values(#{username},#{jobs},#{phone})
</insert>
</mapper>
<?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="resources.com.ssm.mapper.UserMapper">
<resultMap type="com.ssm.po.User" id="resultMap">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
<result property="age" column="t_age"/>
</resultMap>
<select id="findAllUser" resultMap="resultMap">
select * from t_user
</select>
</mapper>
测试类(程序入口):
package com.ssm.test;
import java.io.InputStream;
import java.util.List;
import com.ssm.po.User;
import com.ssm.utils.MybatisUtils;
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.ssm.po.Customer;
/**
* 入门程序测试类
*/
public class MybatisTest {
/**
* 根据客户编号查询客户信息
*/
@Test
public void findCustomerByIdTest() throws Exception {
// 通过工具类生成SqlSession对象
SqlSession sqlSession= MybatisUtils.getSession();
// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果
Customer customer = sqlSession.selectOne("resources.com.ssm.mapper"
+ ".CustomerMapper.findCustomerById", 1);
// 打印输出结果
System.out.println(customer.toString());
// 5、关闭SqlSession
sqlSession.close();
}
/**
* 根据用户名称来模糊查询用户信息列表
*/
@Test
public void findCustomerByNameTest() throws Exception{
// 通过工具类生成SqlSession对象
SqlSession sqlSession= MybatisUtils.getSession();
// 4、SqlSession执行映射文件中定义的SQL,并返回映射结果
List<Customer> customers = sqlSession.selectList("resources.com.ssm.mapper"
+ ".CustomerMapper.findCustomerByName", "j");
for (Customer customer : customers) {
//打印输出结果集
System.out.println(customer);
}
// 5、关闭SqlSession
sqlSession.close();
}
/**
* 3.添加客户
*/
@Test
public void addCustomerTest(){
// 获取SqlSession
SqlSession sqlSession = MybatisUtils.getSession();
Customer customer = new Customer();
customer.setUsername("rose");
customer.setJobs("student");
customer.setPhone("13333533092");
// 使用主键自助增长的添加方法
int rows = sqlSession.insert("resources.com.ssm.mapper"
+ ".CustomerMapper.addCustomer", customer);
// 输出插入数据的主键id值
System.out.println(customer.getId());
if(rows > 0){
System.out.println("您成功插入了"+rows+"条数据!");
}else{
System.out.println("执行插入操作失败!!!");
}
sqlSession.commit();
sqlSession.close();
}
/**
* 更新客户
*/
@Test
public void updateCustomerTest() throws Exception{
// 通过工具类生成SqlSession对象
SqlSession sqlSession= MybatisUtils.getSession();
// 4、SqlSession执行更新操作
// 4.1创建Customer对象,对对象中的数据进行模拟更新
Customer customer = new Customer();
customer.setId(4);
customer.setUsername("rose");
customer.setJobs("programmer");
customer.setPhone("13311111111");
// 4.2执行SqlSession的更新方法,返回的是SQL语句影响的行数
int rows = sqlSession.update("resources.com.ssm.mapper"
+ ".CustomerMapper.updateCustomer", customer);
// 4.3通过返回结果判断更新操作是否执行成功
if(rows > 0){
System.out.println("您成功修改了"+rows+"条数据!");
}else{
System.out.println("执行修改操作失败!!!");
}
// 4.4提交事务
sqlSession.commit();
// 5、关闭SqlSession
sqlSession.close();
}
/**
* 删除客户
*/
@Test
public void deleteCustomerTest() throws Exception{
// 通过工具类生成SqlSession对象
SqlSession sqlSession= MybatisUtils.getSession();
// 4、SqlSession执行删除操作
// 4.1执行SqlSession的删除方法,返回的是SQL语句影响的行数
int rows = sqlSession.delete("resources.com.ssm.mapper"
+ ".CustomerMapper.deleteCustomer", 4);
// 4.2通过返回结果判断删除操作是否执行成功
if(rows > 0){
System.out.println("您成功删除了"+rows+"条数据!");
}else{
System.out.println("执行删除操作失败!!!");
}
// 4.3提交事务
sqlSession.commit();
// 5、关闭SqlSession
sqlSession.close();
}
@Test
public void findAllUserTest() {
// 获取SqlSession
SqlSession sqlSession = MybatisUtils.getSession();
// SqlSession执行映射文件中定义的SQL,并返回映射结果
List<User> list = sqlSession.selectList("resources.com.ssm.mapper.UserMapper.findAllUser");
for (User user : list) {
System.out.println(user);
}
// 关闭SqlSession
sqlSession.close();
}
}
其中,涉及的获取SqlSession 实例的 工具类(一般为了简化开发,会使用工具类(将前边初始化SqlSessionFactory的部分封装为一个工具)来创建SqlSession):
package com.ssm.utils;
import java.io.Reader;
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 MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
// 初始化SqlSessionFactory对象
static {
try {
// 使用MyBatis提供的Resources类加载MyBatis的配置文件
Reader reader =
Resources.getResourceAsReader("mybatis-config.xml");
// 构建SqlSessionFactory工厂
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取SqlSession对象的静态方法
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
写在最后,闲着没事看看体会一下
SqlSession 对象的一些方法(好了,写不动了,贴图吧 Orz…………):