mybatics 中调用mysql存储过程。
说起mybatics 框架,身边的java开发工程师们基本上都是耳熟能详。 mybatics是apache的一个开源项目,前身为ibatics,2010年此项目由apache软件基金会迁移到了google code,mybatics的确是一款十分优秀的开源持久层框架,sql代码隔离封装、自动POJO映射、jdbc
说起mybatics 框架,身边的java开发工程师们基本上都是耳熟能详。 mybatics是apache的一个开源项目,前身为ibatics,2010年此项目由apache软件基金会迁移到了google code,mybatics的确是一款十分优秀的开源持久层框架,sql代码隔离封装、自动POJO映射、jdbc 动态sql———— mybatics的好处可以说出一箩筐,然而mybatics还有一个十分优秀的特性却往往被人忽略 ----那就是mybatics还支持存储过程的调用。
不熟悉存储过程的人大都觉得存储过程复杂难懂,认为既然有了dao,那么所有的对数据库操作的逻辑(CRUD)都放到dao层就可以了,存储过程是没有必要的。无论如何,在dao中写java代码总比在数据库中写存储过程要舒服容易的多,又何必多花费时间学习一门新的存储过程语言呢?
的确,对于以下中小型项目而言,基本的增删改查sql操作就足以应付了(再稍微复杂点也就高级查询,也就把dao层改改弄得稍复杂点就行了)。可是做过稍大型点的项目的人(尤其是互联网方面)都知道,大项目尤其是分布式系统的互联网项目对于数据库安全、性能、稳定性都有很高的要求。 当web服务器和数据库服务器分布在不同的机器上,dao层调数据库服务器是需要很大的网络开销,sql语句必须从web服务器发送到数据库服务器再执行。可是存储过程就不同,存储过程的所有sql逻辑到存放在数据库服务器本地且执行效率非常高。而且由于dao层代码是放到本地,存储过程代码是在远程服务器中,故安全性上也比不上存储过程。至于稳定性就更不用谈了。
幸运的是mybatics是完美支持存储过程调用的,这一点让人感到十分欣慰,也无疑更是增加了我对它的喜爱。
对于mysql而言,mysql 5.0以后的版本是支持存储过程的 。
下面我介绍下mybatics中如何调用mysql 存储过程,至于调用oracle 的存储过程也是大同小异的,值得注意的是当程序需要返回List集合数据出来时,Oracle中需要返回游标,而mysql中直接select出去即可 。
1、 mybatics中调用mysql 存储过程返回LIST 列表数据。
根据name (模糊)查询用户信息列表,返回用户列表
UserMapper.xml 中 配置 存储过程调用, 注意 statementType="CALLABLE" ,select元素配置的ressultType 直接就是User类型。
<select id="queryUserListByLikeName_SP" parametertype="map" resulttype="User" statementtype="CALLABLE"> {call queryUserList_nameSP( #{name,jdbcType=VARCHAR,mode=IN} ) } </select>
public Map<string object> getUserListNameLike(String name) { try { Map<string> params=AjaxUtil.getMap(); params.put("name", name); List<user> userList = userMapper.queryUserListByLikeName_SP(params); if(userList!=null){ Map<string> map= AjaxUtil.messageMap(1, "查询成功"); map.put("userList", userList); return map; } } catch (Exception e) { logger.error(e); throw new RuntimeException(e); } return AjaxUtil.messageMap(-1, "查询失败"); }</string></user></string></string>
public List<user> queryUserListByLikeName_SP( Map<string object> params);</string></user>
DELIMITER $$ USE `easyuidemo`$$ DROP PROCEDURE IF EXISTS `queryUserList_nameSP`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `queryUserList_nameSP`(IN in_name VARCHAR(50)) BEGIN SELECT * FROM t_user t WHERE t.name LIKE CONCAT('%',in_name,'%') ; END$$ DELIMITER ;
2、 mybatics中调用mysql 存储过程添加用户。
页面表单ajax上传的用户信息,通过存储过程完成用户添加。要求添加成功时,存储过程中要返回rc(reponseCode结果码)、msg(结果消息)、userId(新添加的用户id)
UserMapper.xml 中的配置。
值得注意的是,这里的存储过程配置既可以配置为select节点元素,也可以配置为其它insert、update、delete元素,且无须配置resultType 或resultMap,如果是select元素,请一定要设置userCache=“false” 。入参我这里设置为了map。(这里的map其实就是java.util.Map, mybatics中内置了许多java中类型到jdbc类型的别名映射,比如java中int对应为jdbc中integer,而map就是java.util.Map的在mybatics中的别名 ),大家可能会注意我这入参并没有用User 这个bean对象,用bean来传字段属性岂不是更合乎情理吗? 这个稍候再跟大家解释下。。。
<select id="addUser_SP" parametertype="map" statementtype="CALLABLE" usecache="false"> {call addUser_SP( #{name,jdbcType=VARCHAR,mode=IN}, #{age,jdbcType=INTEGER,mode=IN}, #{email,jdbcType=VARCHAR,mode=IN}, #{address,jdbcType=VARCHAR,mode=IN}, #{phone,jdbcType=VARCHAR,mode=IN}, #{rc,jdbcType=VARCHAR,mode=OUT}, #{msg,jdbcType=VARCHAR,mode=OUT}, #{userId,jdbcType=VARCHAR,mode=OUT} ) } </select>
service 层java代码。
大家一定在奇怪这句代码 userMapper.addUser_SP(params); 这前面并没有用变量接收方法的返回值,其实这个方法是没有返回值的,即使你定义了要返回某个值(如Map
public Map<string object> addUser_SP(User user) { try { Map<string> params=AjaxUtil.getMap(); params.put("name", user.getName()); params.put("address", user.getAddress()); params.put("age", user.getAge()); params.put("email", user.getEmail()); params.put("phone", user.getPhone()); userMapper.addUser_SP(params); Map<string object> map=new HashMap<string>(); map.put("rc", params.get("rc")); map.put("msg", params.get("msg")); map.put("userId", params.get("userId")); return map; } catch (Exception e) { logger.error(e); throw new RuntimeException(e); } }</string></string></string></string>
再看下mapper接口方法的定义(没什么好说的就一个接口方法定义)
public void addUser_SP(Map<string object> params);</string>
最后再看下存储过程代码:
DELIMITER $$ USE `easyuidemo`$$ DROP PROCEDURE IF EXISTS `addUser_SP`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `addUser_SP`( IN in_name VARCHAR (50), IN in_age INTEGER, IN in_email VARCHAR (50), IN in_address VARCHAR (200), IN in_phone VARCHAR (20), OUT rc INTEGER, OUT msg VARCHAR (50), OUT userId VARCHAR (50) ) BEGIN DECLARE v_userId VARCHAR (50) DEFAULT ROUND(RAND() * 9000000+10000000) ; DECLARE v_ucount INTEGER DEFAULT 0 ; SELECT COUNT(*) INTO v_ucount FROM t_user WHERE t_user.`id` = v_userId ; IF v_ucount > 0 THEN SET rc = - 1 ; SET msg = '生成userId重复,插入失败' ; SET userId='-00000000'; ELSE INSERT INTO t_user (id, `name`, age, email, address, phone) VALUES ( v_userId, in_name, in_age, in_email, in_address, in_phone ) ; SET userId = v_userId ; SET rc=1; SET msg='添加成功'; #commit ; END IF ; END$$ DELIMITER ;
存储过程本身也没什么好说的,唯一值得大家关注的是:mysql存储过程中最后有commit和没有commit 是有所不同的。
如果存储过程中没有执行commit,那么spring容器一旦发生了事务回滚,存储过程执行的操作也会回滚。如果存储过程执行了commit,那么数据库自身的事务此时已提交,这时即使在spring容器中托管了事务,并且由于其他原因导致service代码中产生异常而自动回滚,但此存储过程是不会回滚,因为数据自身的事务已在存储过程执行完毕前提交了, 也就是说此时spring回滚对存储过程的操作是无效的了。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Dans la base de données MySQL, la relation entre l'utilisateur et la base de données est définie par les autorisations et les tables. L'utilisateur a un nom d'utilisateur et un mot de passe pour accéder à la base de données. Les autorisations sont accordées par la commande Grant, tandis que le tableau est créé par la commande Create Table. Pour établir une relation entre un utilisateur et une base de données, vous devez créer une base de données, créer un utilisateur, puis accorder des autorisations.

MySQL convient aux débutants car il est simple à installer, puissant et facile à gérer les données. 1. Installation et configuration simples, adaptées à une variété de systèmes d'exploitation. 2. Prise en charge des opérations de base telles que la création de bases de données et de tables, d'insertion, d'interrogation, de mise à jour et de suppression de données. 3. Fournir des fonctions avancées telles que les opérations de jointure et les sous-questionnaires. 4. Les performances peuvent être améliorées par l'indexation, l'optimisation des requêtes et le partitionnement de la table. 5. Prise en charge des mesures de sauvegarde, de récupération et de sécurité pour garantir la sécurité et la cohérence des données.

Simplification de l'intégration des données: AmazonrDSMysQL et l'intégration Zero ETL de Redshift, l'intégration des données est au cœur d'une organisation basée sur les données. Les processus traditionnels ETL (extrait, converti, charge) sont complexes et prennent du temps, en particulier lors de l'intégration de bases de données (telles que AmazonrDSMysQL) avec des entrepôts de données (tels que Redshift). Cependant, AWS fournit des solutions d'intégration ETL Zero qui ont complètement changé cette situation, fournissant une solution simplifiée et à temps proche pour la migration des données de RDSMySQL à Redshift. Cet article plongera dans l'intégration RDSMYSQL ZERO ETL avec Redshift, expliquant comment il fonctionne et les avantages qu'il apporte aux ingénieurs de données et aux développeurs.

Pour remplir le nom d'utilisateur et le mot de passe MySQL: 1. Déterminez le nom d'utilisateur et le mot de passe; 2. Connectez-vous à la base de données; 3. Utilisez le nom d'utilisateur et le mot de passe pour exécuter des requêtes et des commandes.

1. Utilisez l'index correct pour accélérer la récupération des données en réduisant la quantité de données numérisées SELECT * FROMMLOYEESEESHWHERELAST_NAME = 'SMITH'; Si vous recherchez plusieurs fois une colonne d'une table, créez un index pour cette colonne. If you or your app needs data from multiple columns according to the criteria, create a composite index 2. Avoid select * only those required columns, if you select all unwanted columns, this will only consume more server memory and cause the server to slow down at high load or frequency times For example, your table contains columns such as created_at and updated_at and timestamps, and then avoid selecting * because they do not require inefficient query se

Navicat lui-même ne stocke pas le mot de passe de la base de données et ne peut récupérer que le mot de passe chiffré. Solution: 1. Vérifiez le gestionnaire de mots de passe; 2. Vérifiez la fonction "Remember Motway" de Navicat; 3. Réinitialisez le mot de passe de la base de données; 4. Contactez l'administrateur de la base de données.

Clause SQLLIMIT: Contrôlez le nombre de lignes dans les résultats de la requête. La clause limite dans SQL est utilisée pour limiter le nombre de lignes renvoyées par la requête. Ceci est très utile lors du traitement de grands ensembles de données, des affichages paginés et des données de test, et peut améliorer efficacement l'efficacité de la requête. Syntaxe de base de la syntaxe: selectColumn1, Column2, ... FromTable_NamelimitNumber_Of_Rows; Number_OF_ROWS: Spécifiez le nombre de lignes renvoyées. Syntaxe avec décalage: selectColumn1, Column2, ... FromTable_Namelimitoffset, numéro_of_rows; décalage: sauter

Affichez la base de données MySQL avec la commande suivante: Connectez-vous au serveur: MySQL -U Username -P mot de passe Exécuter les bases de données Afficher les bases de données; Commande pour obtenir toutes les bases de données existantes Sélectionnez la base de données: utilisez le nom de la base de données; Tableau de vue: afficher des tables; Afficher la structure de la table: décrire le nom du tableau; Afficher les données: sélectionnez * dans le nom du tableau;
