一、mybatis批量插入数据导数据库
mybatis批量插入数据到数据库可以很好地提高数据插入的效率。手动循环插入数据的效率很低,而mybatis批量插入数据可以执行一次SQL插入多条数据。
mybatis提供了一个foreach标签,可以方便地进行批量插入。foreach标签可以用于所有的Collection实现类,包括List和Set。
以下是一个批量插入的示例:
INSERT INTO user (user_id, user_name, user_age) VALUES <foreach collection="list" item="user" separator=","> (#{user.id}, #{user.name}, #{user.age}) </foreach>
以上示例中,list代表包含了多个user对象的List集合。在foreach标签中,我们还指定了item表示List中的每个对象,separator为分隔符,这里用逗号分隔。
二、mybatis批量更新数据库
mybatis批量更新操作与插入数据操作类似,也可以使用foreach标签来实现。
以下是一个批量更新的示例:
UPDATE user SET user_name = #{name} WHERE user_id IN <foreach collection="list" item="id" separator=","> #{id} </foreach>
以上示例中,list代表包含了多个id值的List集合。在foreach标签中,我们还指定了item表示List中的每个元素(这里为一个id值),separator为分隔符,这里用逗号分隔。
三、mybatis批量查询
mybatis批量查询操作需要使用到动态SQL的foreach标签,这点与批量插入和更新不同。
以下是一个批量查询的示例:
<select id="getUserByIds" parameterType="java.util.List" resultMap="userMap"> SELECT * FROM user WHERE id IN <foreach collection="list" item="id" separator=","> #{id} </foreach> </select>
以上示例中,getUserByIds为查询语句的id,parameterType为查询参数类型,resultMap为结果集类型。在foreach标签中,我们指定了collection为查询参数(这里是一个List类型的id集合),item为List中的每个元素(这里为id值),separator为分隔符,这里用逗号分隔。
四、mybatis批量插数据
mybatis批量插数据也可以使用foreach标签,但与示例一中的插入方式不同,这里用到了JDBC的批量插入方式,同时也需要使用JDBC的BatchExecutor。
以下是一个使用JDBC批量插入数据的示例:
<insert id="batchInsertUser" parameterType="java.util.List"> <foreach item="user" collection="list" separator=";"> INSERT INTO user(user_id, user_name, user_age) VALUES (#{user.id}, #{user.name}, #{user.age}) </foreach> </insert>
以上示例中,batchInsertUser为批量插入语句的id,parameterType为查询参数类型。在foreach标签中,我们指定了item为List中的每个元素(这里为user对象),collection为List类型的user集合,separator为分隔符,这里用分号分隔。
五、mybatis实现定时插入数据
mybatis也可以实现定时插入数据,通过mybatis的Timer类来实现。Timer类可用于调度延迟任务。我们可以实现一个定时任务来每隔一定时间插入一批数据。
以下是一个使用Timer实现定时插入数据的示例:
public class InsertJob extends TimerTask { public void run() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); ListuserList = getUserList(); //获取要插入的数据集合 userMapper.batchInsertUser(userList); //调用批量插入数据的方法 sqlSession.commit(); sqlSession.close(); } private List getUserList() { List list = new ArrayList<>(); //构造要插入的数据集合 return list; } } public class MybatisTimer { public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new InsertJob(), 0, 1000 * 60 * 5); //每隔5分钟执行一次插入任务 } }
以上示例中,InsertJob为定时任务插入数据的类,getUserList为获取要插入的数据集合的方法。MybatisTimer为启动定时任务的类,其中schedule方法的第二个参数表示每隔5分钟执行一次插入任务。
六、mybatis批量保存
mybatis批量保存也需要使用foreach标签,同时也需要使用JDBC的批量插入方式。
以下是一个使用JDBC批量保存数据的示例:
public class UserDaoImpl implements UserDao { @Override public void batchSaveUser(ListuserList) throws Exception { SqlSession sqlSession = MybatisUtils.getSqlSession(); Connection connection = sqlSession.getConnection(); String sql = "INSERT INTO user(user_id, user_name, user_age) VALUES (?, ?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); int batchSize = 1000; for (int i = 0; i < userList.size(); i++) { preparedStatement.setString(1, userList.get(i).getId()); preparedStatement.setString(2, userList.get(i).getName()); preparedStatement.setInt(3, userList.get(i).getAge()); preparedStatement.addBatch(); if ((i + 1) % batchSize == 0) { preparedStatement.executeBatch(); connection.commit(); } } preparedStatement.executeBatch(); connection.commit(); sqlSession.close(); } } <insert id="saveAll" parameterType="java.util.List"> insert into users (id, name, age) values <foreach collection="list" item="user" index="index" separator=","> (#{user.id},#{user.name},#{user.age}) </foreach> </insert>
以上示例中,UserDaoImpl为实现批量保存的类。在Dao层中,我们使用JDBC的PreparedStatement并循环使用addBatch将一批预处理命令打包到执行缓冲区中。因为使用了批处理,需要手动提交事务;批处理的数量可以根据需要而调整。
在mapper.xml文件中,我们使用insert标签,并在foreach中指定collection属性为要批量保存的集合,同时手动指定字段和对应的值。
七、mybatis批量更新数据
mybatis批量更新操作与插入数据操作类似,也可以使用foreach标签来实现。
以下是一个批量更新的示例:
public class UserDaoImpl implements UserDao { @Override public void batchUpdateUser(ListuserList) throws Exception { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); int batchSize = 1000; for (int i = 0; i < userList.size(); i += batchSize) { int endIndex = i + batchSize; endIndex = endIndex > userList.size() ? userList.size() : endIndex; userMapper.batchUpdateUser(userList.subList(i, endIndex)); sqlSession.commit(); } sqlSession.close(); } } <update id="batchUpdateUser" parameterType="java.util.List"> <foreach collection="list" item="user" separator=";"> UPDATE user SET user_name = #{name} WHERE user_id = #{id} </foreach> </update>
以上示例中,UserDaoImpl为实现批量更新的类。在Dao层中,我们循环调用mapper层中的批量更新方法,并根据需求切分数据,进行分批更新。
在mapper.xml文件中,我们使用update标签,并在foreach中指定collection属性为要批量更新的集合,同时手动指定字段和对应的值。
八、mybatis如何传递多个参数
在mybatis中,我们可以使用Map、@Param或者JavaBean等方式传递多个参数。
以下是一些传递多个参数的示例:
public interface UserMapper { ListqueryUserByNameAndAge(@Param("name") String name, @Param("age") int age); User queryUserByIdAndName(Map params); List queryUserByNameAbdAgeByBean(User user); } <select id="queryUserByNameAndAge" parameterType="map" resultMap="userMap"> SELECT * FROM user WHERE user_name = #{name} AND user_age = #{age} </select> <select id="queryUserByIdAndName" parameterType="map" resultMap="userMap"> SELECT * FROM user WHERE user_id = #{id} AND user_name = #{name} </select> <select id="queryUserByNameAbdAgeByBean" parameterType="com.xxxx.User" resultMap="userMap"> SELECT * FROM user WHERE user_name = #{name} AND user_age = #{age} </select>
以上代码中,queryUserByNameAndAge方法使用了@Param注解,分别指定了name和age参数名。queryUserByIdAndName方法使用了Map类型,传递了id和name两个参数。queryUserByNameAbdAgeByBean方法使用了JavaBean类型,将name和age作为User对象的属性传递。
总结
mybatis批量插入数据可以很好地提高数据插入效率,同时也可以实现批量更新操作、批量查询操作和其他批量操作。通过使用foreach标签、JDBC批量插入方式、Timer来实现定时插入数据,同时也可以通过其他方式传递多个参数。在实际开发中,可以根据不同的需求选择合适的方法。