1.什么是SqlSessionFactory? SqlSessionFactory是Mybatis中十分重要的对象,俗称会话工厂,它是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession。 SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过xml配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。 2.通过xml配置文件构建出的SqlSession实例的代码如下: InputStream inputStream=Resources.getResourceAstream(“配置文件位置”); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); 注意: SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在,如果我们多次创建同一个数据库的SqlSessionFactory,那么此数据库的资源很容易耗尽。为此,通常每一个数据库都只会对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单例模式。 3.什么是SqlSesion? SqlSession是Mybatis框架中另外一个重要的对象,它是应用程序与持久层交互操作的一个单线程对象,主要作用是持久化操作。 注意: (1)每一个线程都对应一个自己的SqlSession实例,并且该实例不能被共享,SqlSession也是线程不安全的,使用范围只允许一个方法或一次请求中。 (2)使用完SqlSession对象后要及时关闭,通常放在finally块中。 4.SqlSesion实际上封装了JDBC的连接。 5.为了简化开发,减少重复的冗余代码,通常使用工具类来创建SqlSession,具体如下: MyUtils.java
public class Myutils {
private static SqlSessionFactory sqlSessionFactory=null;
static {
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch (Exception e)
{
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
6.属性配置通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性,如mybatis配置文件数据库的连接属性可写为: db.properties
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis
jdbc.username = root
jdbc.password = 12345678
7.Mybatis配置文件中的元素: (1):是一个配置属性的元素,通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性; 例:db.properties (2):主要用于改变Mybatis运行时的行为,例如开启二级缓存,开启延时加载等; 注意:一级缓存是默认开启的,同一个方法中第一次查数据库表,第二次查缓存,若缓存被清空了,则从数据库表中查询; 扩展: a.清空缓存使用 sqlSession.commit(); b.开启二级缓存需要手动开启,缓存查询的对象需要实现序列化接口(即对应的Dao层的类实现Serialable接口)。第一步在Mybatis-config.xml中配置,第二步在XxxMapper.xml中配置。 (3):将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(jdbc类型),或者从数据库中取出结果时将jdbcType转换为javaType。 (4):为配置文件中的java类型设置一个别名,别名的配置与xml配置相关,其作用的意义是减少全限类名的冗余。 (5):事务管理器的配置; (6):用于指定Mybatis映射文件的位置,一般有四种方式: a.使用类路径引入:
<mappers>
<mapper resource="com/wds/mapper/UserMapper.xml"/>
<mappers>
b.使用本地文件路径:
<mapper url="file:///D:/com/wds/mapper/UserMapper.xml"/>
c.使用接口类引入:
<mapper class="com.wds.mapper.UserMapper.xml"/>
d.使用包名引入:
<mapper name="com.wds.mapper"/>
具体的用法自行查找!!! 8.mapper映射文件的元素: (1)select:映射查询语句,可以自定义参数,返回结果集; (2)insert:映射插入语句,返回一个整数为插入的行数; (3)update:映射更新语句,返回一个整数为更新的行数; (4)delete:映射删除语句,返回一个整数为删除的行数; (5)sql:用于定义一部分sql片段,其他的sql语句可以引用此sql; (6)cache:给定命名空间的缓存配置; (7)cache-ref:其他缓存空间的引用; (8)resultMap:用来描述如何从一个数据结果集中加载对象,字段不完全匹配时; 9.mysql数据库是主键自增长的,oracle主键是非自增长的; 10.实例展示之resultMap: (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>
<properties resource="db.properties"/>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/wds/po/UserMapper.xml"/>
<mapper resource="com/wds/po/CustomerMapper.xml"/>
</mappers>
</configuration>
(2)db.properties
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis
jdbc.username = root
jdbc.password = 12345678
(3)log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.wds=DEBUG
# 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
(5)工具类Myutils.java
package com.wds.utils;
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 java.io.Reader;
public class Myutils {
private static SqlSessionFactory sqlSessionFactory=null;
static {
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch (Exception e)
{
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
(6)User.java
package com.wds.po;
public class User {
private Integer t_id;
private String t_name;
private String t_address;
public Integer getT_id() {
return t_id;
}
public void setT_id(Integer t_id) {
this.t_id = t_id;
}
public String getT_name() {
return t_name;
}
public void setT_name(String t_name) {
this.t_name = t_name;
}
public String getT_address() {
return t_address;
}
public void setT_address(String t_address) {
this.t_address = t_address;
}
@Override
public String toString() {
return "User{" +
"t_id=" + t_id +
", t_name='" + t_name + '\'' +
", t_address='" + t_address + '\'' +
'}';
}
}
(7)映射文件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 namespace="com.wds.po.User">
<resultMap id="resultMap" type="com.wds.po.User">
<id property="t_id" column="id"/>
<result property="t_name" column="name"/>
<result property="t_address" column="address"/>
</resultMap>
<select id="findAllUsers" resultMap="resultMap">
select * from tb_user
</select>
</mapper>
(8)测试类MybatisTest.java 此处代码和上一章一样,只是增加了findAllUsers()来测试resultMap
package com.wds.test;
import com.wds.po.Customer;
import com.wds.po.User;
import com.wds.utils.Myutils;
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 java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void findCustomerById() throws Exception{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
Customer customer = sqlSession.selectOne("com.wds.po.Customer.findCustomerById",1);
System.out.println(customer.toString());
sqlSession.close();
}
@Test
public void findCustomerByName() throws Exception{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<Customer> customers = sqlSession.selectList("com.wds.po.Customer.findCustomerByName","j");
for(Customer customer:customers){
System.out.println(customer.toString());
}
sqlSession.close();
}
@Test
public void addCustomer() throws Exception{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
Customer customer = new Customer();
customer.setUsername("东生");
customer.setJobs("coder");
customer.setPhone("18139954468");
int num = sqlSession.insert("com.wds.po.Customer.addCustomer", customer);
if(num>0){
System.out.println("插入操作执行成功!!!");
}else
{
System.out.println("执行失败!!!");
}
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateCustomer() throws Exception{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
Customer customer = new Customer();
customer.setId(1);
customer.setUsername("吕憨憨");
customer.setJobs("doctor");
customer.setPhone("110256");
int num = sqlSession.update("com.wds.po.Customer.updateCustomer",customer);
if(num>0){
System.out.println("您的修改已经成功!!");
}
sqlSession.commit();
sqlSession.close();
}
@Test
public void deleteCustomer() throws Exception{
SqlSession sqlSession = Myutils.getSession();
int num = sqlSession.delete("com.wds.po.Customer.deleteCustomer",5);
if(num>0){
System.out.println("删除操作执行成功!!!");
}else{
System.out.println("删除操作执行失败!!!");
}
sqlSession.commit();
sqlSession.close();
}
@Test
public void findAllUsers(){
SqlSession sqlSession = Myutils.getSession();
List<User> users = sqlSession.selectList("com.wds.po.User.findAllUsers");
for (User s:users ){
System.out.println(s.toString());
}
sqlSession.close();
}
}
11.resultMap测试结果: 数据库表tb_user
|