您的位置:首页 > 其它

详解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文件:

<?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