现在的位置: 首页 > 综合 > 正文

mybatis 学习1

2018年05月21日 ⁄ 综合 ⁄ 共 12879字 ⁄ 字号 评论关闭

package com.zxh.customer.bean;

public class Parter {

 private Long partyId;
 
 private String partyName;

 public Long getPartyId() {
  return partyId;
 }

 public void setPartyId(Long partyId) {
  this.partyId = partyId;
 }

 public String getPartyName() {
  return partyName;
 }

 public void setPartyName(String partyName) {
  this.partyName = partyName;
 }
  
 
}

 

 

 

package com.zxh.customer.bean;

import java.io.Serializable;
import java.util.List;

import com.zxh.customer.bean.Parter;

public class User{

 private Long custId;
 
 private String custName;
 
 private Parter parter;
 
 private List<Parter> parterList;

 public Long getCustId() {
  return custId;
 }

 public void setCustId(Long custId) {
  this.custId = custId;
 }

 public String getCustName() {
  return custName;
 }

 public void setCustName(String custName) {
  this.custName = custName;
 }

 public Parter getParter() {
  return parter;
 }

 public void setParter(Parter parter) {
  this.parter = parter;
 }

 public List<Parter> getParterList() {
  return parterList;
 }

 public void setParterList(List<Parter> parterList) {
  this.parterList = parterList;
 }

 
}

 

<?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.zxh.parter">
 
 <resultMap type="Parter" id="resultParter">
  <id column="PARTY_ID" property="partyId" />
  <result column="PARTY_NAME" property="partyName" />
 </resultMap>
 
 <resultMap type="User" id="resultUser">
  <id column="CUST_ID" property="custId" />
  <result column="CUST_NAME" property="custName" />
 </resultMap>
 
  <select id="selectUser" parameterType="User" resultMap="resultUser">
  SELECT CUST_ID, CUST_NAME FROM CUST WHERE
  CUST_NAME like #{custName}
 </select>
</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="com.zxh.customer1111">

 <!-- 以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志  配置二级缓存  一级缓存为session缓存, 二级缓存可以自定义存储源 这里使用ehcache-->
 <!-- <cache type="org.mybatis.caches.ehcache.LoggingEhcache" /> -->
 <!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> -->
 <cache eviction="FIFO" flushInterval="60000" size="1024"
  readOnly="true" />

 <!-- 无关联操作 column指的是sql语句中的列别名, -->
 <resultMap type="User" id="resultUser1111">
  <id column="CUST_ID" property="custId" />
  <result column="CUST_NAME" property="custName" />
 </resultMap>
 <!-- 1、当parameterType="int" #{id} 其中id可能任取名称 2、当resultType="User" 返回列名要和类的属性名相同,否则返回null,

  resultMap="resultUser" 需要定义resultMap 映射属性和表列 parameterType,resultType 可以为int,string,long,java.util.HashMap等等 -->
 <select id="selectUserById" parameterType="int" resultType="User">
  SELECT CUST_ID as "custId", CUST_NAME "custName" FROM CUST WHERE
  CUST_ID = #{id, jdbcType=VARCHAR}
 </select>
 <select id="selectUserById1" parameterType="int" resultMap="resultUser">
  SELECT CUST_ID, CUST_NAME FROM CUST WHERE
  CUST_ID = #{id}
 </select>
 <select id="selectUser111" parameterType="User" resultMap="resultUser1111">
  SELECT CUST_ID, CUST_NAME FROM CUST WHERE
  CUST_NAME like #{custName}
 </select>
 <select id="selectUserById2" parameterType="User" resultMap="resultUser">
  SELECT CUST_ID, CUST_NAME FROM CUST WHERE
  CUST_ID = #{custId}

  <!-- 动态sql -->
  <if test="title != null"> and title = #{title} </if>

  <choose>
   <when test="title != null"> and title = #{title}
   </when>
   <when test="content != null"> and content = #{content} </when>
   <otherwise> and owner = "owner1" </otherwise>
  </choose>

  <!-- (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 程序 -->
  <trim prefix="where" prefixOverrides="and|or">
   <if test="title != null"> title = #{title} </if>
   <if test="content != null"> and content = #{content} </if>
   <if test="owner != null"> or owner = #{owner} </if>
  </trim>

  <!-- where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and

   开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。 -->
  <where>
   <if test="title != null"> title = #{title} </if>
   <if test="content != null"> and content = #{content} </if>
   <if test="owner != null"> and owner = #{owner} </if>
  </where>

  <!-- (主要用于更新时) -->
  <set>
   <if test="title != null"> title = #{title}, </if>
   <if test="content != null"> content = #{content}, </if>
   <if test="owner != null"> owner = #{owner} </if>
  </set>

  <!-- 用在in后面 -->
  <foreach collection="list" index="index" item="item" open="("
   separator="," close=")"> #{item}
  </foreach>
 </select>

 

 <!-- 多对一 或者 一对一 -->
 <resultMap type="User" id="resultUser1">
  <id column="CUST_ID" property="custId" />
  <result column="CUST_NAME" property="custName" />
  <association property="parter" resultMap="com.zxh.parter.resultParter"
   select="另一个select的id" /><!--注意此处引用的方式 -->

  <association property="parter" column="party_id" javaType="Parter">
   <id property="partyId" column="party_id" />
   <result property="partyName" column="party_name" />
  </association>
 </resultMap>
 <select id="selectUserById3" parameterType="int" resultMap="resultUser1">
  SELECT C.CUST_ID, C.CUST_NAME, P.PARTY_ID, P.PARTY_NAME FROM CUST C,
  PARTY P WHERE C.PARTY_ID = P.PARTY_ID AND
  C.CUST_ID = #{id}
 </select>

 

 <!-- 一对多 或者 多对多 -->

 <resultMap type="User" id="resultUser2">
  <id column="CUST_ID" property="custId" />
  <result column="CUST_NAME" property="custName" />
  <collection property="parterList" ofType="Parter"
   resultMap="com.zxh.parter.resultParter" /><!--注意此处引用的方式 -->

  <!-- 可以不设置resultMap, 那么需要resultParter的内容直接引进来 -->
  <!-- <id column="PARTY_ID" property="partyId" /> <result column="PARTY_NAME"
   property="partyName" /> -->
 </resultMap>
 <select id="selectUserById4" parameterType="int" resultMap="resultUser2">
  SELECT C.CUST_ID, C.CUST_NAME, P.PARTY_ID, P.PARTY_NAME FROM CUST C,
  PARTY P WHERE C.PARTY_ID = P.PARTY_ID AND
  C.CUST_ID = #{id}
 </select>

 <!-- 增加 -->
 <!-- useGeneratedKeys 获取由数据库自动生成的主键 keyProperty 获取的主键注入到此属性中 支持主键自动增长的数据库 -->
 <insert id="saveUser" parameterType="User">
  insert into cust(cust_id,
  cust_name) values(seq_cust.nextval, #{custName})
 </insert>

 <!-- 更新 -->
 <update id="updateUser" parameterType="User">
  update cust set cust_name
  = #{custName} where cust_id = #{custId}
 </update>

 <!-- 删除 -->
 <delete id="deleteUser" parameterType="int">
  delete from cust where
  cust_id = #{custId}
 </delete>
 <delete id="deleteUser1" parameterType="User">
  delete from cust where
  cust_id = #{custId}
 </delete>

 

</mapper> 

 

 

 

package com.zxh.customer.dao;

import java.util.List;

import com.zxh.customer.bean.Parter;
import com.zxh.customer.bean.User;

public interface IUserDao {

 //基本查询
 public User queryUserById(Long custId);
 
 public User queryUserById1(Long custId);
 
 public User queryUserById2(User user);
 
 public User queryUserById3(Long custId);
 
 public User queryUserById4(Long custId);
 
 public void saveUser(User user);
 
 public void updateUser(User user);
 
 public void deleteUser(Long custId);
 
 public void deleteUser1(User user);
}

 

 

 

 

package com.zxh.customer.dao;

import java.util.List;

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;

import com.zxh.customer.bean.User;
import com.zxh.customer.testbasegeneric.util.MybatisUtil;

public class UserDaoImpl implements IUserDao {

 // 根据ID查询具体某条记录
 public User queryUserById(Long custId) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();
  User user;

  try {
   user = session.selectOne("com.zxh.customer.selectUserById", custId);
  } finally {
   session.close();
  }
  return user;
 }

 public User queryUserById1(Long custId) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();
  User user;

  try {
   user = session
     .selectOne("com.zxh.customer.selectUserById1", custId);
  } finally {
   session.close();
  }
  return user;
 }

 public User queryUserById2(User user) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();
  User user1;

  try {
   user1 = session.selectOne("com.zxh.customer.selectUserById2", user);
  } finally {
   session.close();
  }
  return user1;
 }

 public User queryUserById3(Long custId) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();
  User user;

  try {
   user = session
     .selectOne("com.zxh.customer.selectUserById3", custId);
  } finally {
   session.close();
  }
  return user;
 }

 public User queryUserById4(Long custId) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();
  User user;

  try {
   user = session
     .selectOne("com.zxh.customer.selectUserById4", custId);
  } finally {
   session.close();
  }
  return user;
 }

 // 新增
 public void saveUser(User user) {

  // 默认不自动提交事务 openSession每次都是获取新的连接Connection
  // 在DAO层只是持久化数据,不应该包含逻辑,在service层把多个操作放在一个事务中(同一个session同一个Connection)
  // 那么session应该由 service传入,在serice控制事务的提交与回滚, 不提倡这么做, 还是集成spirng吧
  SqlSession session = MybatisUtil.getSessionFactory().openSession();

  try {
   session.insert("com.zxh.customer.saveUser", user);
   // 提交事务
   session.commit();
  } finally {
   session.close();
  }
 }

 // 批量新增
 public void saveUserList(List<User> userList) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession(
    ExecutorType.BATCH, false);

  try {
   for (int i = 0; i < userList.size(); i++) {
    session.insert("com.zxh.customer.saveUser", userList.get(i));
   }
   // 提交事务
   session.commit();
   // 清理缓存,防止溢出
   session.clearCache();
   
  } finally {
   session.close();
  }
 }

 // 更新
 public void updateUser(User user) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();

  try {
   session.update("com.zxh.customer.updateUser", user);
   session.commit();
  } finally {
   session.close();
  }
 }

 // 删除
 public void deleteUser(Long custId) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();

  try {
   session.delete("com.zxh.customer.deleteUser", custId);
   session.commit();
  } finally {
   session.close();
  }
 }

 // 删除
 public void deleteUser1(User user) {

  SqlSession session = MybatisUtil.getSessionFactory().openSession();

  try {
   session.delete("com.zxh.customer.deleteUser1", user);
   session.commit();
  } finally {
   session.close();
  }
 }

}

 

 

package com.zxh.customer.util;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtil {
 
 private static SqlSessionFactory sqlSessionFactory;
 private static Reader reader;

 static {
  try {
   reader = Resources.getResourceAsReader("config/Configuration.xml");
   sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 public static SqlSessionFactory getSessionFactory() {
  
  return sqlSessionFactory;
 }

}

 

 

 

Configuration.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>

 <!-- 属性配置 xml文件中使用 ${} url "/"路径-文件 或 "."-java类文件 -->
 <properties resource="config/jdbc_config.properties">
  <!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
  <property name="url" value="jdbc:oracle:thin:@172.16.1.241:1521:jtcrm" />
  <property name="username" value="jtorder" />
  <property name="password" value="jtorder" /> -->
 </properties>

 <!-- 或者 首先读取properties元素内部的子元素的值, 再读取properties配置文件的值 后者覆盖前者 -->
 <!-- <properties resource="config/jdbc.properties"> <property name="driver"
  value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@172.16.1.241:1521:jtcrm"

  /> </properties> -->

 <!-- 设置mybatis3 运行时的行为方式 -->
 <settings>
  <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
  <setting name="defaultStatementTimeout" value="60000" />
  <!-- 启用或禁用 缓存 -->
  <setting name="cacheEnabled" value="false" />
  <!-- 启用或禁用延迟加载。当禁用时, 所有关联对象都会即时加载 -->
  <setting name="lazyLoadingEnabled" value="true" />
  <!-- 允许或不允许多种结果集从一个单独 的语句中返回(需要适合的驱动) 不用考虑 -->
  <setting name="multipleResultSetsEnabled" value="true" />
  <!-- 使用列标签代替列名。 不同的驱动在这 方便表现不同 不用考虑 -->
  <setting name="useColumnLabel" value="true" />
  <!-- 允许 JDBC 支持生成的键。 需要适合的 驱动。 如果设置为 true 则这个设置强制 生成的键被使用 -->
  <setting name="useGeneratedKeys" value="false" />
  <!-- 等等 -->
 </settings>

 <!-- 定义类别名,简化xml文件的配置 -->
 <typeAliases>
  <typeAlias type="com.zxh.customer.bean.User" alias="User" />
  <typeAlias type="com.zxh.customer.bean.Parter" alias="Parter" />
 </typeAliases>

 <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
    <!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@172.16.1.241:1521:jtcrm" />
    <property name="username" value="jtorder" />
    <property name="password" value="jtorder" /> -->
   </dataSource>
  </environment>
 </environments>
 
 <!-- SQL映射文件 -->
 <mappers>
  <mapper resource="com/zxh/customer/bean/User.xml" />
  <mapper resource="com/zxh/customer/bean/Parter.xml" />
 </mappers>

</configuration>

 

 

 

jdbc_config.properties

 

driver=oracle.jdbc.driver.OracleDriver
url=jdbc\:oracle\:thin\:@172.16.1.241\:1521\:jtcrm
username=jtorder
password=jtorder

 

 

 

 

package com.zxh.customer.test;
 
import java.util.List;

import com.zxh.customer.bean.User;
import com.zxh.customer.daogeneric.IUserDao;
import com.zxh.customer.daogeneric.UserDaoImpl;

public class Test {
 

 public static void main(String[] args) {

  // 基本查询
  IUserDao userDao = new UserDaoImpl();
  
  User user = new User();
  user.setCustName("%中国%"); 
  // List<User> resultUser = userDao.selectList("com.zxh.parter.selectUser", user);
  // System.out.println(resultUser.size());
  
  System.out.println("成功!");
 }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.