详解MyBatis动态生成表插入数据

来源:互联网 发布:打包软件下载 编辑:程序博客网 时间:2024/06/06 03:55

MyBaits学习起来比hibernate容易上手的多,因为MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。但针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap,而Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。但是MyBaits可以通过特殊的SQL语句编写来减少对SQL的依赖,在这里介绍简单的动态成表插入数据的例子。
首先用spring集成mybaits来配置好ApplicationContext.xml文件:

<?xml version="1.0" encoding="UTF-8"?><beans      xmlns="http://www.springframework.org/schema/beans"      xmlns:tx="http://www.springframework.org/schema/tx"      xmlns:p="http://www.springframework.org/schema/p"      xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd       http://www.springframework.org/schema/tx       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd       http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">  <!-- 配置数据源-->      <bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">      <property name="driverClassName">          <value>oracle.jdbc.driver.OracleDriver</value>      </property>      <property name="url">          <value>jdbc:oracle:thin:@172.18.1.252:1521:ORA9IS</value>         <!--springmybaitis是我的数据库  -->    </property>      <property name="username">          <value>test</value>      </property>      <property name="password">          <value>test</value>      </property>  </bean>  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">      <property name="dataSource" ref="jdbcDataSource" />      <property name="configLocation" value="classpath:mybatis-config.xml"></property>  </bean>  <!--上面为sqlSessionFactory找到jdbc数据源以及mybaits-config.xml的路径--><bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">      <property name="mapperInterface" value="com.springMyBatis.system.dao.UserDao"></property>      <property name="sqlSessionFactory" ref="sqlSessionFactory"></property><!--上面的com.springMyBatis.system.dao.UserDao文件是对数据库的操作的接口,就是把操作通过sqlSessionFactory映射到数据库中-->      </bean>  </beans>

再配置下映射文件:

<?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>      <mappers>          <mapper resource="com/springMyBatis/system/dao/UserDao.xml"/>      </mappers>  </configuration>

再写下dao层的userDao.xml和userDao.java

package com.springMyBatis.system.dao;import com.springMyBatis.system.model.User;public interface UserDao {    public User getUser(User user);    public void addUser(User user);    public void updateUser(User user);    public void deleteUser(int UserId);}
<?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.springMyBatis.system.dao.UserDao"> <!-- select 是查询数据的动态方法 --> <select id="select" resultType="java.util.Map" parameterType="java.util.Map">            <foreach collection="keys" item="k" index="index" open="(" separator="," close=")">                SELECT * FROM ${tablename} WHERE ${k} IN '${params[k]}'            </foreach>    </select></select>  <!-- insert 是插入数据的动态方法 --> <insert id="insert" parameterType="java.util.Map">        insert into ${tablename}        <foreach collection="keys" item="k" index="index" open="(" separator="," close=")">            ${k}        </foreach>        values        <foreach collection="keys" item="k" index="index" open="(" separator="," close=")">            '${params[k]}'        </foreach>    </insert><update id="update" parameterType="java.util.Map" >        update ${tablename}         <set>        <foreach collection="keys" item="k" index="index" open="" separator="," close="">            ${k}='${params[k]}'        </foreach>        </set>        where        <foreach collection="keys2" item="j" index="index" open="" separator="and" close="">            ${j}='${params2[j]}'        </foreach>    </update>     </mapper>
然后我们直接将dao层和测试方法写一块,实际业务中可将方法单独放入一个包内供其它业务调用,重用性很高``package cn.com.wavenet.webservices.workflow.activiti.service2;import java.util.HashMap;import java.util.Map;import java.util.Set;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.com.wavenet.webservices.hydro.core.mapper.base.BasicMapper;//这个包就是前面的BasicMapper包,里面存放具体的sqlpublic class testmybaits {    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:activiti.cfg.xml");    BasicMapper basicMapper=(BasicMapper)context.getBean("basicMapper");    SqlSessionFactory sqlSessionFactory=(SqlSessionFactory)context.getBean("SqlSessionFactory");    public static void main(String[] args) {        testmybaits tt = new testmybaits();        //插入数据,user_s是oracle创建的一张表表名,只有id和name        Map<String , Object> params_user = new HashMap<String, Object>();        params_user.put("id", "1");        params_user.put("name", "jack");        tt.insert("user_s", params_user);        //更新数据,执行这个方法时请将上面的插入数据的几行代码注释掉防止冲突        Map<String , Object> params_user1 = new HashMap<String, Object>();        Map<String , Object> params_user2 = new HashMap<String, Object>();        params_user2.put("id", "1");//表示对刚刚上面插入的数据进行更新,id是更新条件        params_user1.put("id", "2");        params_user1.put("name", "我是新的jack");        tt.update("user_s",  params_user1, params_user2);    }        //插入数据到指定表        public void insert(String tableName , Map<String , Object>params){            SqlSession sqlSession = sqlSessionFactory.openSession();            basicMapper=sqlSession.getMapper(BasicMapper.class);            String[] keys = new String[params.size()];            Set<String> sset = params.keySet();            int i = 0;            for(String os : sset){                keys[i++] = os;            }            String[] keys2 = new String[params.size()];            Set<String> sset2 = params.keySet();            i = 0;            for (String os : sset2) {                keys2[i++] = os;            }            Map<String, Object> map=new HashMap<String, Object>();            map.put("tablename" , tableName);            map.put("keys" , keys);            map.put("params" , params);              basicMapper.insert(map);                  }        //更新数据        public void update(String tableName , Map<String , Object>params , Map<String , Object>params2){            SqlSession sqlSession = sqlSessionFactory.openSession();            basicMapper=sqlSession.getMapper(BasicMapper.class);            Map<String, Object> map=new HashMap<String, Object>();            String[] keys = new String[params.size()];               Set<String> sset = params.keySet();               int i = 0;               for (String os : sset) {                   keys[i++] = os;               }               String[] keys2 = new String[params2.size()];               Set<String> sset2 = params2.keySet();               i = 0;               for (String os : sset2) {                   keys2[i++] = os;               }               map.put("tablename", tableName);               map.put("keys", keys);               map.put("params", params);               map.put("keys2", keys2);               map.put("params2", params2);               basicMapper.update(map);            }    }
0 0
原创粉丝点击