mybatis实例教程

2024-05-05 15:38
文章标签 mybatis 实例教程

本文主要是介绍mybatis实例教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mybatis实战教程(mybatis in action)之一:开发环境搭建

Mybatismaven工程

pom.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
   <!-- mysql数据库相关包 -->
   < dependency >
      < groupId >mysql</ groupId >
       < artifactId >mysql-connector-java</ artifactId >
           < version >5.1.6</ version >
   </ dependency >
  <!-- mybatis相关的数据包 -->
  < dependency >
      < groupId >org.mybatis</ groupId >
       < artifactId >mybatis</ artifactId >
       < version >3.2.3</ version >
  </ dependency >

创建用户表,并插入一条测试数据

?
1
2
3
4
5
6
7
8
9
10
Create  TABLE  ` user ` (
   `id`  int (11)  NOT  NULL  AUTO_INCREMENT,
   `userName`  varchar (50)  DEFAULT  NULL ,
   `userAge`  int (11)  DEFAULT  NULL ,
   `userAddress`  varchar (200)  DEFAULT  NULL ,
   PRIMARY  KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2  DEFAULT  CHARSET=utf8;
Insert  INTO  ` user VALUES  ( '1' 'spring' '19' '广东深圳' );
Insert  INTO  ` user VALUES  ( '2' 'summer' '20' '上海浦东' );

到此为止,前期准备工作就完成了。下面开始真正配置mybatis项目了。
1. 设置mybatis 配置文件:mybatiscfg.xml 在src/main/resources目录下建立此文件,内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<? 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 >
     < typeAliases
         < typeAlias  alias = "User"  type = "com.binhu.entity.User" /> 
     </ typeAliases
     < environments  default = "development" >
         < environment  id = "development" >
         < transactionManager  type = "JDBC" />
             < dataSource  type = "POOLED" >
             < property  name = "driver"  value = "com.mysql.jdbc.Driver" />
             < property  name = "url"  value = "jdbc:mysql://127.0.0.1:3306/hubin"  />
             < property  name = "username"  value = "root" />
             < property  name = "password"  value = "system" />
             </ dataSource >
         </ environment >
     </ environments >
     
     < mappers >
         < mapper  resource = "entity/User.xml" />
     </ mappers >
</ configuration >

2. 建立与数据库对应的 java class,以及映射文件.

建立 User 类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package  com.binhu.entity;
public  class  User {
     
     private  int  id;
     private  String userName;
     private  String userAge;
     private  String userAddress;
     
     public  int  getId() {
         return  id;
     }
     public  void  setId( int  id) {
         this .id = id;
     }
     public  String getUserName() {
         return  userName;
     }
     public  void  setUserName(String userName) {
         this .userName = userName;
     }
     public  String getUserAge() {
         return  userAge;
     }
     public  void  setUserAge(String userAge) {
         this .userAge = userAge;
     }
     public  String getUserAddress() {
         return  userAddress;
     }
     public  void  setUserAddress(String userAddress) {
         this .userAddress = userAddress;
     }
}

同时建立这个User 的映射文件, User.xmlsrc/main/resources/entity目录下建立此文件,内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version= "1.0"  encoding= "UTF-8" ?>
<!DOCTYPE mapper PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace= "com.hubin.mybatis.inter.IUserOperation" >
     <select id= "selectUserByID"  parameterType= "int"  resultType= "User" >
         select * from `user` where id = #{id}
     </select>
     <select id= "selectUserByUserAge"  parameterType= "int"  resultType= "User" >
         select * from `user` where userAge = #{很随意嘛}
     </select>
</mapper>

下面对这几个配置文件解释下:
1.mybatiscfg.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.binhu.entity.User"/>  这个别名非常重要,你在 具体的类的映射中,比如User.xml 中 resultType 就是对应这里的。要保持一致,当然这里的 resultType 还有另外单独的定义方式,后面再说。
2.  mybatiscfg.xml里面 的<mapper resource="entity/User.xml"/>是包含要映射的类的xml配置文件。
3. 在User.xml 文件里面 主要是定义各种SQL 语句,以及这些语句的参数,以及要返回的类型等。
4.<mapper namespace="com.hubin.mybatis.inter.IUserOperation">是命名空间,namespace的取值如果不是接口编程,随便怎么取值都可以,只要唯一即可,可是如果是利用接口编程就要和接口保持一致,第二章接口编程中有介绍。

开始测试
建立测试类Test:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package  com.hubin.mybatis.test;
import  java.io.Reader;
import  org.apache.ibatis.io.Resources;
import  org.apache.ibatis.session.SqlSession;
import  org.apache.ibatis.session.SqlSessionFactory;
import  org.apache.ibatis.session.SqlSessionFactoryBuilder;
import  com.binhu.mybatis.entity.User;
import  com.hubin.mybatis.inter.IUserOperation;
public  class  Test {
     private  static  SqlSessionFactory sqlSessionFactory;
     private  static  Reader reader; 
     static {
         try {
             reader    = Resources.getResourceAsReader( "mybatiscfg.xml" );
             sqlSessionFactory =  new  SqlSessionFactoryBuilder().build(reader);
         } catch (Exception e){
             e.printStackTrace();
         }
     }
     public  static  SqlSessionFactory getSession(){
         return  sqlSessionFactory;
     }
     
     public  static  void  main(String[] args) {
         getUserByUserId();
         getUserInter();
       
     }
    public  static  void  getUserByUserId(){
        SqlSession session = sqlSessionFactory.openSession();
        try  {
        User user = (User) session.selectOne( "com.hubin.mybatis.inter.IUserOperation.selectUserByID" , 1 );
        System.out.println(user.getUserAddress());
        System.out.println(user.getUserName());
        finally  {
        session.close();
        }
    }
    public  static  void  getUserByUserAge(){
        
        System.out.println( "getUserByUserAge" );
        SqlSession session = sqlSessionFactory.openSession();
        try  {
        User user = (User) session.selectOne( "com.hubin.mybatis.inter.IUserOperation.selectUserByUserAge" , 98 );
        System.out.println(user.getUserAddress());
        System.out.println(user.getUserName());
        finally  {
        session.close();
        }
        
    }
}

mybatis实战教程(mybatis in action)之二:以接口的方式编程

前面一章,已经搭建好了eclipse,mybatis,mysql的环境,并且实现了一个简单的查询。请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句:
session.selectOne("com.binhu.entity.UserMapper.selectUserByID",1)

其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细过程:

在源码目录下建立 com.hubin.mybatis.inter 这个包,并建立接口类 IUserOperation , 内容如下:

?
1
2
3
4
5
6
7
8
package  com.hubin.mybatis.inter;
import  com.binhu.mybatis.entity.User;
public  interface  IUserOperation {    
     public  User selectUserByID( int  id);
     
}

请注意:这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应(<select id="selectUserByID"),<mapper namespace="com.hubin.mybatis.inter.IUserOperation">中的namespace值与你创建的接口相同

重写测试代码:

?
1
2
3
4
5
6
7
8
package  com.hubin.mybatis.inter;
import  com.binhu.mybatis.entity.User;
public  interface  IUserOperation {    
     public  User selectUserByID( int  id);
     
}

mybatis实战教程(mybatis in action)之三:实现数据的增删改查


前面已经讲到用接口的方式编程。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:
1. 用 mybatis 查询数据,包括列表
2. 用 mybatis 增加数据
3. 用 mybatis 更新数据.
4. 用 mybatis 删除数据.

查询数据,前面已经讲过简单的,主要看查询出列表的
查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的.

查询列表的语句在 User.xml 中

?
1
2
3
4
5
6
7
8
9
10
11
12
<!--*****************************查询出多条数据***************************************************  -->
<!-- 为了返回list 类型而定义的returnMap -->
     < resultMap  type = "User"  id = "resultListUser" >
         < id  column = "id"  property = "id"  />
         < result  column = "userName"  property = "userName"  />
         < result  column = "userAge"  property = "userAge"  />
         < result  column = "userAddress"  property = "userAddress"  />
     </ resultMap >
     <!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的  -->
     < select  id = "selectCountryByAge"  parameterType = "int"  resultMap = "resultListUser" >
         select * from user where userAge = #{查询的时候很随意填什么都可以,添加和删除的时候需要注意了}
     </ select >

在 IUserOperation 接口中增加方法:public List<User> selectCountryByAge(int userAge);
现在在 TestUser类中做测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
      * 通过接口的方式连接数据库查询多条数据
      */
     public  static  void  selectCountryByAge(){
         SqlSession session = sqlSessionFactory.openSession();
         try {
             IUserOperation userOperation = session
                     .getMapper(IUserOperation. class );
             List<User> list=userOperation.selectCountryByAge( 98 );
             for (User user:list){
                 System.out.println(user.getUserName()+ "  " +user.getUserAddress()+ "  " +user.getId());
             }
         } finally {
             session.close();
         }
     
     }  

可以看到,结果成功查询出来。如果是查询单个数据的话,用第二讲用过的方法就可以了。
用mybatis 增加数据 
在 IUserOperation 接口中增加方法:public void addUser(User user);
在 User.xml 中配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--执行增加操作的SQL语句。id和parameterType  
        分别与IUserOperation接口中的addUser方法的名字和  
        参数类型一致。以#{name}的形式引用Student参数  
        的name属性,MyBatis将使用反射读取Student参数  
        的此属性。#{name}中name大小写敏感。引用其他  
        的gender等属性与此一致。seGeneratedKeys设置  
        为"true"表明要MyBatis获取由数据库自动生成的主  
        键;keyProperty="id"指定把获取到的主键值注入  
        到Student的id属性--> 
     < insert  id = "addUser"  parameterType = "User" 
         useGeneratedKeys = "true"  keyProperty = "id"
         insert into user(userName,userAge,userAddress)  
              values(#{userName},#{userAge},#{userAddress})  
     </ insert >

现在在 TestUser类中做测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
  * 通过接口的方式向数据库中插入数据
  */
public  static  void  addUser(){
     
     SqlSession session = sqlSessionFactory.openSession();
     try {User user= new  User();
     user.setUserName( "winter" );
     user.setUserAge( "18" );
     user.setUserAddress( "南京秦淮" );
     IUserOperation userOperation = session
             .getMapper(IUserOperation. class );
     userOperation.addCountry(user);
     finally  {
         session.commit();
         session.close();
     }
     
}

用mybatis 更新数据
方法类似,先在 IUserOperation 中增加方法:public void updateUser(User user);
然后配置 User.xml 

?
1
2
3
< update  id = "updateUser"  parameterType = "User"  >
         update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
</ update >

现在在 TestUser类中做测试:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  void  updateUser(){
         //先得到用户,然后修改,提交。
         SqlSession session = sqlSessionFactory.openSession();
         try  {
             IUserOperation userOperation=session.getMapper(IUserOperation. class );
             User user = userOperation.selectUserByID( 1 );            
             user.setUserAddress( "原来是魔都的浦东创新园区" );
             userOperation.updateUser(user);
             session.commit();
             
         finally  {
             session.close();
         }
     }

用mybatis 删除数据 
同理,IUserOperation 增加方法:public void deleteUser();
配置User.xml

?
1
2
3
< delete  id = "deleteUser"  parameterType = "int" >
         delete from user where id=#{id}
     </ delete >

然后在Test类中写测试方法:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   /**
      * 删除数据,删除一定要 commit.
      * @param id
      */
     public  void  deleteUser( int  id){
         SqlSession session = sqlSessionFactory.openSession();
         try  {
             IUserOperation userOperation=session.getMapper(IUserOperation. class );           
             userOperation.deleteUser(id);
             session.commit();            
         finally  {
             session.close();
         }
     }


这样,所有增删改查都完成了,注意在增加,更改,删除的时候要调用session.commit(),这样才会真正对数据库进行操作,否则是没有提交的。
到此为止,简单的单表操作,应该都会了,接下来的时间了,我会讲多表联合查询,以及结果集的选取。 

mybatis实战教程(mybatis in action)之四:实现关联数据的查询


有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个Article 这个表,并初始化数据.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Drop  TABLE  IF EXISTS `article`;
Create  TABLE  `article` (
   `id`  int (11)  NOT  NULL  auto_increment,
   `userid`  int (11)  NOT  NULL ,
   `title`  varchar (100)  NOT  NULL ,
   `content` text  NOT  NULL ,
   PRIMARY  KEY   (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5  DEFAULT  CHARSET=utf8;
-- ----------------------------
-- 添加几条测试数据
-- ----------------------------
Insert  INTO  `article`  VALUES  ( '1' '1' 'test_title' 'test_content' );
Insert  INTO  `article`  VALUES  ( '2' '1' 'test_title_2' 'test_content_2' );
Insert  INTO  `article`  VALUES  ( '3' '1' 'test_title_3' 'test_content_3' );
Insert  INTO  `article`  VALUES  ( '4' '1' 'test_title_4' 'test_content_4' );

你应该发现了,这几个文章对应的userid都是1,所以需要用户表user里面有id=1的数据。可以修改成满足自己条件的数据.按照orm的规则,表已经创建了,那么肯定需要一个对象与之对应,所以我们增加一个 Article 的class

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package  com.binhu.mybatis.entity;
public  class  Article {
     
     private  int  id;
     private  User user;
     private  String title;
     private  String content;
     
     public  int  getId() {
         return  id;
     }
     public  void  setId( int  id) {
         this .id = id;
     }
     
     public  User getUser() {
         return  user;
     }
     public  void  setUser(User user) {
         this .user = user;
     }
     public  String getTitle() {
         return  title;
     }
     public  void  setTitle(String title) {
         this .title = title;
     }
     public  String getContent() {
         return  content;
     }
     public  void  setContent(String content) {
         this .content = content;
     }
}

注意一下,文章的用户是怎么定义的,是直接定义的一个User对象。而不是int类型。

多对一的实现
场景:在读取某个用户发表的所有文章。当然还是需要在User.xml 里面配置 select 语句, 但重点是这个 select 的resultMap 对应什么样的数据呢。这是重点,这里要引入 association 看定义如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- User 联合文章进行查询 方法之一的配置 (多对一的方式)  -->    
     < resultMap  id = "resultUserArticleList"  type = "Article" >
         < id  property = "id"  column = "aid"  />
         < result  property = "title"  column = "title"  />
         < result  property = "content"  column = "content"  />
         
         < association  property = "user"  javaType = "User" >
             < id  property = "id"  column = "id"  />
             < result  property = "userName"  column = "userName"  />
             < result  property = "userAddress"  column = "userAddress"  />            
         </ association >        
     </ resultMap >
< select  id = "getUserArticles"  parameterType = "int"  resultMap = "resultUserArticleList" >
        select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article 
               where user.id=article.userid and user.id=#{id}
     </ select >

这样配置之后,就可以了,将select 语句与resultMap 对应的映射结合起来看,就明白了。用association 来得到关联的用户,这是多对一的情况,因为所有的文章都是同一个用户的。

还有另外一种处理方式,可以复用我们前面已经定义好的 resultMap ,前面我们定义过一个 resultListUser ,看这第二种方法如何实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
< resultMap  type = "User"  id = "resultListUser" >
         < id  column = "id"  property = "id"  />
         < result  column = "userName"  property = "userName"  />
         < result  column = "userAge"  property = "userAge"  />
         < result  column = "userAddress"  property = "userAddress"  />
     </ resultMap >
     <!-- User 联合文章进行查询 方法之二的配置 (多对一的方式) -->    
     < resultMap  id = "resultUserArticleList-2"  type = "Article" >
         < id  property = "id"  column = "aid"  />
         < result  property = "title"  column = "title"  />
         < result  property = "content"  column = "content"  />        
         < association  property = "user"  javaType = "User"  resultMap = "resultListUser"  />             
     </ resultMap >
     
     < select  id = "getUserArticles"  parameterType = "int"  resultMap = "resultUserArticleList" >
        select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article 
               where user.id=article.userid and user.id=#{id}
     </ select >

将 association  中对应的映射独立抽取出来,可以达到复用的目的。
好了,现在在Test 类中写测试代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  void  getUserArticles( int  userid){
         SqlSession session = sqlSessionFactory.openSession();
         try  {
             IUserOperation userOperation=session.getMapper(IUserOperation. class );           
             List<Article> articles = userOperation.getUserArticles(userid);
             for (Article article:articles){
                 System.out.println(article.getTitle()+ ":" +article.getContent()+
                         ":作者是:" +article.getUser().getUserName()+ ":地址:" +
                          article.getUser().getUserAddress());
             }
         finally  {
             session.close();
         }
     }

漏掉了一点,我们一定要在 IUserOperation 接口中,加入 select 对应的id 名称相同的方法:
public List<Article> getUserArticles(int id);
然后运行就可以测试。

这篇关于mybatis实例教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962045

相关文章

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

Mybatis从3.4.0版本到3.5.7版本的迭代方法实现

《Mybatis从3.4.0版本到3.5.7版本的迭代方法实现》本文主要介绍了Mybatis从3.4.0版本到3.5.7版本的迭代方法实现,包括主要的功能增强、不兼容的更改和修复的错误,具有一定的参考... 目录一、3.4.01、主要的功能增强2、selectCursor example3、不兼容的更改二、