Rumah pangkalan data tutorial mysql mybatics 中调用mysql存储过程。

mybatics 中调用mysql存储过程。

Jun 07, 2016 pm 02:50 PM
mysql penyimpanan panggilan proses

说起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>
Salin selepas log masuk
      service 层java代码,调用mapper接口 入参传一个map,返回值是List 类型

    

	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>
Salin selepas log masuk
          mapper 接口 代码,就一个接口声明(通过mybatics动态代理方式产生其实现类)

	public List<user> queryUserListByLikeName_SP( Map<string object> params);</string></user>
Salin selepas log masuk
     最后看下,存储过程的代码。(也很简单就一个select 模糊查询)

     

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 ;
Salin selepas log masuk

      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>
Salin selepas log masuk

    service 层java代码。

    大家一定在奇怪这句代码  userMapper.addUser_SP(params); 这前面并没有用变量接收方法的返回值,其实这个方法是没有返回值的,即使你定义了要返回某个值(如Map),你会发现无论你得到的永远是null。所以这里根本就不需要接收返回值。那么调用存储过程返回的out参数到要如何接收呢?细心的你可能已经发现了,没错,就是在入参param中!!调用存储过程成功后,你会发现,存储返回的rc、 msg和userId 三个out参数都被放到了你传入的参数params中————也就是说params会在调用存储成功后多出三个字段值rc、msg、userId。

	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>
Salin selepas log masuk
   

再看下mapper接口方法的定义(没什么好说的就一个接口方法定义)

public void addUser_SP(Map<string object> params);</string>
Salin selepas log masuk

最后再看下存储过程代码:

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 ;
Salin selepas log masuk


存储过程本身也没什么好说的,唯一值得大家关注的是:mysql存储过程中最后有commit和没有commit 是有所不同的。

如果存储过程中没有执行commit,那么spring容器一旦发生了事务回滚,存储过程执行的操作也会回滚。如果存储过程执行了commit,那么数据库自身的事务此时已提交,这时即使在spring容器中托管了事务,并且由于其他原因导致service代码中产生异常而自动回滚,但此存储过程是不会回滚,因为数据自身的事务已在存储过程执行完毕前提交了,  也就是说此时spring回滚对存储过程的操作是无效的了。




Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Mysql: Konsep mudah untuk pembelajaran mudah Mysql: Konsep mudah untuk pembelajaran mudah Apr 10, 2025 am 09:29 AM

MySQL adalah sistem pengurusan pangkalan data sumber terbuka. 1) Buat Pangkalan Data dan Jadual: Gunakan perintah Createdatabase dan Createtable. 2) Operasi Asas: Masukkan, Kemas kini, Padam dan Pilih. 3) Operasi lanjutan: Sertai, subquery dan pemprosesan transaksi. 4) Kemahiran Debugging: Semak sintaks, jenis data dan keizinan. 5) Cadangan Pengoptimuman: Gunakan indeks, elakkan pilih* dan gunakan transaksi.

Cara membuka phpmyadmin Cara membuka phpmyadmin Apr 10, 2025 pm 10:51 PM

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

MySQL: Pengenalan kepada pangkalan data paling popular di dunia MySQL: Pengenalan kepada pangkalan data paling popular di dunia Apr 12, 2025 am 12:18 AM

MySQL adalah sistem pengurusan pangkalan data relasi sumber terbuka, terutamanya digunakan untuk menyimpan dan mengambil data dengan cepat dan boleh dipercayai. Prinsip kerjanya termasuk permintaan pelanggan, resolusi pertanyaan, pelaksanaan pertanyaan dan hasil pulangan. Contoh penggunaan termasuk membuat jadual, memasukkan dan menanyakan data, dan ciri -ciri canggih seperti Operasi Join. Kesalahan umum melibatkan sintaks SQL, jenis data, dan keizinan, dan cadangan pengoptimuman termasuk penggunaan indeks, pertanyaan yang dioptimumkan, dan pembahagian jadual.

Mengapa menggunakan mysql? Faedah dan kelebihan Mengapa menggunakan mysql? Faedah dan kelebihan Apr 12, 2025 am 12:17 AM

MySQL dipilih untuk prestasi, kebolehpercayaan, kemudahan penggunaan, dan sokongan komuniti. 1.MYSQL Menyediakan fungsi penyimpanan dan pengambilan data yang cekap, menyokong pelbagai jenis data dan operasi pertanyaan lanjutan. 2. Mengamalkan seni bina pelanggan-pelayan dan enjin penyimpanan berganda untuk menyokong urus niaga dan pengoptimuman pertanyaan. 3. Mudah digunakan, menyokong pelbagai sistem operasi dan bahasa pengaturcaraan. 4. Mempunyai sokongan komuniti yang kuat dan menyediakan sumber dan penyelesaian yang kaya.

Cara menggunakan redis berulir tunggal Cara menggunakan redis berulir tunggal Apr 10, 2025 pm 07:12 PM

Redis menggunakan satu seni bina berulir untuk memberikan prestasi tinggi, kesederhanaan, dan konsistensi. Ia menggunakan I/O multiplexing, gelung acara, I/O yang tidak menyekat, dan memori bersama untuk meningkatkan keserasian, tetapi dengan batasan batasan konkurensi, satu titik kegagalan, dan tidak sesuai untuk beban kerja yang berintensifkan.

MySQL dan SQL: Kemahiran Penting untuk Pemaju MySQL dan SQL: Kemahiran Penting untuk Pemaju Apr 10, 2025 am 09:30 AM

MySQL dan SQL adalah kemahiran penting untuk pemaju. 1.MYSQL adalah sistem pengurusan pangkalan data sumber terbuka, dan SQL adalah bahasa standard yang digunakan untuk mengurus dan mengendalikan pangkalan data. 2.MYSQL menyokong pelbagai enjin penyimpanan melalui penyimpanan data yang cekap dan fungsi pengambilan semula, dan SQL melengkapkan operasi data yang kompleks melalui pernyataan mudah. 3. Contoh penggunaan termasuk pertanyaan asas dan pertanyaan lanjutan, seperti penapisan dan penyortiran mengikut keadaan. 4. Kesilapan umum termasuk kesilapan sintaks dan isu -isu prestasi, yang boleh dioptimumkan dengan memeriksa penyataan SQL dan menggunakan perintah menjelaskan. 5. Teknik pengoptimuman prestasi termasuk menggunakan indeks, mengelakkan pengimbasan jadual penuh, mengoptimumkan operasi menyertai dan meningkatkan kebolehbacaan kod.

Tempat Mysql: Pangkalan Data dan Pengaturcaraan Tempat Mysql: Pangkalan Data dan Pengaturcaraan Apr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

Cara Membina Pangkalan Data SQL Cara Membina Pangkalan Data SQL Apr 09, 2025 pm 04:24 PM

Membina pangkalan data SQL melibatkan 10 langkah: memilih DBMS; memasang DBMS; mewujudkan pangkalan data; mewujudkan jadual; memasukkan data; mengambil data; mengemas kini data; memadam data; menguruskan pengguna; Menyandarkan pangkalan data.

See all articles