详解MyBatis动态生成表插入数据
2016-09-14 18:18
387 查看
MyBaits学习起来比hibernate容易上手的多,因为MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。但针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap,而Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。但是MyBaits可以通过特殊的SQL语句编写来减少对SQL的依赖,在这里介绍简单的动态成表插入数据的例子。
首先用spring集成mybaits来配置好ApplicationContext.xml文件:
再配置下映射文件:
再写下dao层的userDao.xml和userDao.java
首先用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"?> & 4000 lt;!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包,里面存放具体的sql public 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); } }
相关文章推荐
- mybatis以map为参,动态生成表并插入数据
- Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库
- Mybatis——<selectKey>生成主键/获取插入数据主键
- mysql通过mybatis insert数据时,返回插入数据的动态id
- MyBatis 动态插入 数据 insert
- Mybatis 动态表名,插入数据
- 利用freemarker 在模板里面写入动态数据,动态表格,图片插入并生成word文档
- 动态生成标签栏和Fragment,动态数据插入填充,似今日头条
- Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库
- MyBatis使用动态SQL批量插入数据
- Mybatis动态插入数据(使用trim标签)
- Mybatis 动态表名,插入数据
- Mybatis 动态动态插入更新数据
- mybatis获取插入数据时自动生成的主键id
- 详解MyBatis直接执行SQL查询及数据批量插入
- mybatis 动态插入数据 某些字段无值
- mybatis的insert元素属性详解 及 在insert插入数据获取主键id的值
- mybatis的insert元素属性详解 及 在insert插入数据获取主键id的值
- 【java项目实践】mybatis动态Insert批量插入数据
- 利用freemarker 在模板里面写入动态数据,动态表格,图片插入并生成word文档