对最新版本
Mybatis 3.2.7
做了一个demo,做个记录
需要的基本jar:
mybatis-3.2.7.jar
mysql-connector-java-5.1.27.jar
首先配置xml文件
mybatis-config.xml
CustomerMapper.xml
Customer.java
SessionFactoryUtil.java
测试:
需要的基本jar:
mybatis-3.2.7.jar
mysql-connector-java-5.1.27.jar
首先配置xml文件
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="resources/config.properties" />
- <settings>
- <setting name="cacheEnabled" value="true" />
- <setting name="lazyLoadingEnabled" value="true" />
- <setting name="multipleResultSetsEnabled" value="true" />
- <setting name="useColumnLabel" value="true" />
- <setting name="useGeneratedKeys" value="false" />
- <setting name="autoMappingBehavior" value="PARTIAL" />
- <setting name="defaultExecutorType" value="SIMPLE" />
- <setting name="defaultStatementTimeout" value="25" />
- <setting name="safeRowBoundsEnabled" value="false" />
- <setting name="mapUnderscoreToCamelCase" value="false" />
- <setting name="localCacheScope" value="SESSION" />
- <setting name="jdbcTypeForNull" value="OTHER" />
- <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
- </settings>
- <!-- 实体类别名设置 -->
- <typeAliases>
- <typeAlias type="model.Customer" alias="Customer" />
- </typeAliases>
- <!-- 数据库连接环境配置 -->
- <environments default="development">
- <environment id="development">
- <!-- JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置。 它依赖于从数据源得 到的连接来管理事务范围。 -->
- <transactionManager type="JDBC" />
- <!-- MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。 而它会让 容器来管理事务的整个生命周期(比如 Spring
- 或 JEE 应用服务器的上下文) 默认 情况下它会关闭连接。 然而一些容器并不希望这样, 因此如果你需要从连接中停止 它,将 closeConnection
- 属性设置为 false。
- <transactionManager type="MANAGED"> <property name="closeConnection"
- value="false" />
- </transactionManager>
- -->
- <!-- UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接。
- POOLED – 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例 时必要的初始连接和认证时间。这是一种当前 Web 应用程序用来快速响应请求很流行的方 法。
- JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器, 容器可以集 中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
- -->
- <dataSource type="POOLED">
- <property name="driver" value="${driver}" />
- <property name="url" value="${url}" />
- <property name="username" value="${username}" />
- <property name="password" value="${password}" />
- </dataSource>
- </environment>
- </environments>
- <!-- 多数据库配置 通过 databaseId 匹配 -->
- <databaseIdProvider type="DB_VENDOR">
- <property name="SQL Server" value="sqlserver" />
- <property name="DB2" value="db2" />
- <property name="Oracle" value="oracle" />
- <property name="MySQL" value="mysql" />
- </databaseIdProvider>
- <!-- mapping 文件路径配置 -->
- <mappers>
- <mapper resource="mapper/CustomerMapper.xml" />
- </mappers>
- </configuration>
CustomerMapper.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="model.Customer">
- <resultMap id="customerResultMap" type="model.Customer">
- <id property="id" column="id" />
- <result property="name" column="username" />
- <result property="age" column="age" />
- <result property="des" column="des" />
- </resultMap>
- <!-- 用来定义可重用的 SQL 代码段,可以包含在其他语句中。 -->
- <sql id="customerColumns"> name,age,des </sql>
- <select id="selectCustomerAll3" resultType="Customer">
- select
- <include refid="customerColumns" />
- from customers
- </select>
- <!-- useGeneratedKey ( 仅 对 insert, update 有 用 ) 这 会 告 诉 MyBatis 使 用 JDBC
- 的 getGeneratedKeys 方法来取出由数据 (比如:像 MySQL 和 SQL Server 这样的数据库管理系统的自动递增字段)内部生成的主键。
- 默认值:false。 <selectKey keyProperty="id" resultType="int" order="BEFORE"> select
- CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> #{property,javaType=int,jdbcType=NUMERIC}
- ORDER BY ${columnName} 这里 MyBatis 不会修改或转义字符串。 -->
- <insert id="saveCustomer" parameterType="model.Customer"
- useGeneratedKeys="true" keyProperty="id" flushCache="true">
- insert into
- customers(name,age,des) values (#{name}, #{age}, #{des})
- </insert>
- <select id="selectCustomerAll" resultType="Customer" flushCache="false" useCache="true">
- select id,name,age,des
- from customers
- </select>
- <!--
- 数组 :
- <foreach item="item" index="index" collection="array" open="(" separator="," close=")">
- #{item}
- </foreach>
- -->
- <select id="selectCustomer3" resultType="Customer">
- SELECT id,name,age,des
- FROM customers
- WHERE id in
- <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
- #{id}
- </foreach>
- </select>
- <select id="selectCustomerByBind" parameterType="Customer" resultType="Customer">
- <!-- <bind name="pattern" value="'%' + ${name} + '%'" /> 此未测试成功 -->
- <bind name="pattern" value="'%' + _parameter.getName() + '%'" />
- SELECT id,name,age,des
- FROM customers
- WHERE name like #{pattern}
- </select>
- <!-- resultType="hashmap" 返回一个 HashMap 类型的对象,其中的键是列名,值是列对应的值。 -->
- <select id="selectCustomerAll2" resultType="hashmap">
- select
- id,name,age,des
- from customers
- </select>
- <!-- 可用的收回策略有:
- LRU – 最近最少使用的:移除最长时间不被使用的对象。
- FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
- SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
- WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
- 默认的是 LRU。
- flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
- size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。
- readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。
- 这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。
- -->
- <!-- <cache type="com.domain.something.MyCustomCache"/> 自定义缓存 -->
- <!-- <cache-ref namespace="com.someone.application.data.SomeMapper"/> 共享相同的缓存-->
- <!-- 创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。 -->
- <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
- </mapper>
Customer.java
- package model;
- public class Customer {
- public int id;
- public String name;
- public int age;
- public String des;
- public Customer() {
- }
- public Customer(int id, String name, int age, String des) {
- this.id = id;
- this.name = name;
- this.age = age;
- this.des = des;
- }
- public Customer(String name, int age, String des) {
- this.name = name;
- this.age = age;
- this.des = des;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getDes() {
- return des;
- }
- public void setDes(String des) {
- this.des = des;
- }
- @Override
- public String toString() {
- return "Customer [id=" + id + ", name=" + name + ", age=" + age
- + ", des=" + des + "]";
- }
- }
SessionFactoryUtil.java
- package dao;
- 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 SessionFactoryUtil {
- private static final String MYBATIS_CONFIG_PATH = "resources/mybatis-config.xml";
- private static InputStream is = null;
- private static SqlSessionFactory sqlSessionFactory = null;
- static {
- try {
- is = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH);
- //SqlSessionFactoryBuilder这个类可以被实例化,使用和丢弃。一旦创建了 SqlSessionFactory 后,这个类就不需 要存在了。
- //因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围 (也就是本地方法变量)。
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 私有构造器
- */
- private SessionFactoryUtil(){};
- /**
- * SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次
- * 最简单的就是使用单例模式或者静态单例模式。
- * @return SqlSessionFactory
- */
- public static SqlSessionFactory getSqlSessionFactoryIntance(){
- return sqlSessionFactory;
- }
- /**
- * 每个线程都应该有它自己的 SqlSession 实例。
- * SqlSession 的实例不能被共享,也是线程 不安全的。
- * 因此最佳的范围是请求或方法范围。
- * 绝对不能将 SqlSession 实例的引用放在一个 类的静态字段甚至是实例字段中。
- * @return SqlSession
- */
- public static SqlSession getSqlSessionIntance() {
- return sqlSessionFactory.openSession();
- }
- }
测试:
- package dao;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import model.Customer;
- import org.apache.ibatis.session.SqlSession;
- import org.junit.Test;
- public class CustomerDao {
- public CustomerDao() {
- }
- @Test
- public void findCustomer() {
- //SqlSessionFactory ssf = null;
- SqlSession sqlSession = null;
- try {
- //ssf = SessionFactoryUtil.getSqlSessionFactoryIntance();
- sqlSession = SessionFactoryUtil.getSqlSessionIntance();
- System.out.println(sqlSession); //每次都是新建一个SqlSession实例org.apache.ibatis.session.defaults.DefaultSqlSession@dc57db
- //sqlSession = SessionFactoryUtil.getSqlSessionIntance();
- //System.out.println(sqlSession); //每次都是新建一个SqlSession实例org.apache.ibatis.session.defaults.DefaultSqlSession@c24c0
- //resultType="hashmap" 返回类型为 Map<id,Map<列名,值>>
- Map<Object, Object> customerMap = (Map<Object, Object>) sqlSession.selectMap("selectCustomerAll2", "id");
- System.out.println("customerMap : " + customerMap);
- for(Map.Entry<Object, Object> customerSingle : customerMap.entrySet()) {
- System.out.println("customerMap : " + customerSingle);
- System.out.println("customerMap_Key : " + customerSingle.getKey());
- System.out.println("customerMap_Value : " + customerSingle.getValue());
- @SuppressWarnings("unchecked")
- Map<Object, Object> map = (Map<Object, Object>) customerSingle.getValue();
- System.out.println("Name : " + map.get("name"));
- }
- //resultType="Customer" 自动封装成 list
- //如果没有查到数据,返回长度为0的list
- //List<Customer> customerList = sqlSession.selectList("selectCustomerAll");
- //测试 bind 用于 like 查询
- Customer customerBind = new Customer("Man",110,"service");
- List<Customer> customerList = sqlSession.selectList("selectCustomerByBind", customerBind);
- System.out.println("customerList : " + customerList);
- System.out.println("customerList : " + customerList.size());
- List<Customer> customerList1 = new ArrayList<Customer>();
- System.out.println("customerList1 : " + customerList1);
- System.out.println("customerList1 : " + customerList1.size());
- for (Customer customer : customerList) {
- System.out.println(customer);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if(sqlSession != null) {
- sqlSession.close();
- }
- }
- }
- @Test
- public void saveCustomer() {
- SqlSession sqlSession = null;
- try {
- sqlSession = SessionFactoryUtil.getSqlSessionIntance();
- Customer customer = new Customer("herry",110,"service");
- int id = sqlSession.insert("saveCustomer", customer); //返回影响的行数
- System.out.println(id);
- System.out.println(customer.getId()); //id 已经被set为 自增长的 key
- sqlSession.commit();
- } catch (Exception e) {
- e.printStackTrace();
- sqlSession.rollback();
- }finally {
- sqlSession.close();
- }
- }