objective-c连接MySQL数据库

时间:2024-03-10 17:30:14

       当我搜索objective-c连接MySQL数据库,发现文章已经是很久之前的了,而且是错误的,一篇错,然后连续十几篇都接着错。

       好,废话不多说,要连接数据库,首先你得安装MySQL,网上一大堆教程。安装完毕,你需要在终端上敲:mysql --version验证是否安装成功,如果有东西输出,说明你安装成功了。

  关于怎么建立数据库,怎么建表,这里也不作描述,百度上搜索一大堆。我这里创建了一个叫"lws_db"的数据库,其中只有一个表。表包括id,name,sex,age,tel几个字段,如图所示:

sql语句如下:

create table students
(
   id int unsigned not null auto_increment primary key,
   name char(8) not null,
   sex char(4) not null,
   age tinyint unsigned not null,
   tel char(13) null default "-"
);

 

      好了,数据库弄好了。接下来就要用代码连接数据库了。新建一个xCode项目,使用xCode 6.3.2版本,这里我选择了命令行项目。

     由于,mysql驱动文件放在,这个目录下:/usr/local/mysql/include,所以需要在你的项目中配置头文件搜索路径,操作如图:

 

同时,你需要告诉编译器编译参数,在other linker flags添加:-L/usr/local/mysql/lib -lmysqlclient,如图所示:

 

    好的,项目配置好了,接下来上代码:

新建一个类DBManager,用于管理数据库操作,代码如下:

.h文件

 1 #import <Foundation/Foundation.h>
 2 
 3 @class Person;
 4 
 5 @interface DBManager : NSObject
 6 
 7 + (DBManager *)sharedManager;
 8 
 9 - (NSArray *)getAllPersons;
10 - (void)addPerson:(Person *)p;
11 - (void)deletaPerson:(Person *)p;
12 
13 @end

.m文件

  1 #import "DBManager.h"
  2 #import "mysql.h"
  3 #import "Person.h"
  4 
  5 static const char *host_name = "localhost";
  6 static const char *user_name = "root";
  7 static const char *password = "root";
  8 static const char *db_name = "lws_db";
  9 
 10 @interface DBManager() {
 11     MYSQL *_myconnect;
 12 }
 13 @end
 14 
 15 @implementation DBManager
 16 
 17 +(DBManager *)sharedManager
 18 {
 19     static DBManager *sharedSingleton = nil;
 20     
 21     static dispatch_once_t onceToken;
 22     
 23     dispatch_once(&onceToken,^(void) {
 24         sharedSingleton = [[self alloc] init];
 25     });
 26     
 27     return sharedSingleton;
 28 }
 29 
 30 - (instancetype)init {
 31     if (self = [super init]) {
 32         //初始化工作
 33         _myconnect = mysql_init(_myconnect);
 34         _myconnect = mysql_real_connect(_myconnect,host_name,user_name,password,db_name,MYSQL_PORT,NULL,0);
 35         mysql_set_character_set(_myconnect, "utf8");
 36         
 37         if (_myconnect != NULL) {
 38             NSLog(@"连接成功");
 39         } else {
 40            NSLog(@"连接失败");
 41         }
 42     }
 43     return self;
 44 }
 45 
 46 - (NSArray *)getAllPersons {
 47     
 48     if (_myconnect == NULL) {
 49         return nil;
 50     }
 51     
 52    int status = mysql_query(_myconnect, "select * from students");//status=0,表示query成功
 53     
 54     if (status != 0) {
 55         NSLog(@"查询数据失败");
 56     }
 57     
 58     MYSQL_RES *result = mysql_store_result(_myconnect);//拿到结果集
 59     
 60     long long rows =result->row_count;             //一共查询到多少行
 61     
 62     NSMutableArray *rowArray = [NSMutableArray arrayWithCapacity:rows];//创建数组保存数据
 63     
 64    unsigned int fieldCount = mysql_field_count(_myconnect);//字段个数
 65     
 66     MYSQL_ROW col;//用于保存一行的结果,其实就是一个字符串数组
 67     
 68     for (int row = 0; row < rows; row++) {
 69     
 70          NSMutableString *strM = [NSMutableString string];
 71         
 72         if((col = mysql_fetch_row(result)))
 73         {
 75             for(int i = 0; i < fieldCount; i++)
 76             {
 77                 [strM appendString:[NSString stringWithUTF8String:col[i]]];//这里为了方便看结果,只返回字符串,而不是返回模型数组
 78                 [strM appendString:@" "];
 79             }
 80         }
 81         [rowArray addObject:strM];
 82     }
 84     return rowArray;
 85 }
 86 
 87 - (void)addPerson:(Person *)p {
 88     
 89     NSString *sql = [NSString stringWithFormat:@"insert into students (name, sex, age, tel) values(\'%@\', \'%@\', \'%@\',\'%@\')",p.name,p.sex,p.age,p.tel];
 90     
 91     int status = mysql_query(_myconnect, [sql UTF8String]);//status=0,表示query成功
 92     
 93     if (status == 0) {
 94         NSLog(@"插入数据成功");
 95     } else {
 96         NSLog(@"插入数据失败");
 97     }
 98 }
 99 
100 - (void)deletaPerson:(Person *)p {
101     
102     NSString *sql = [NSString stringWithFormat:@"delete from students where id=%@",p.ID];
103     
104     int status = mysql_query(_myconnect, [sql UTF8String]);//status=0,表示query成功
105     if (status == 0) {
106         NSLog(@"删除数据成功");
107     } else {
108         NSLog(@"删除数据失败");
109     }
110 }
112 @end

main函数里面:

#import <Foundation/Foundation.h>
#import "DBManager.h"
#import "Person.h"

void test() {
    DBManager *mgr = [DBManager sharedManager];
    //查询数据
    NSArray *array = [mgr getAllPersons];
    for (int i = 0; i < array.count; i++) {
        NSLog(@"%@",array[i]);
    }
    /*输出结果
     2015-06-27 15:01:29.290 MySqlTest[2451:145448] 连接成功
     2015-06-27 15:01:29.291 MySqlTest[2451:145448] 1 李文深 男 23 12345678910
     2015-06-27 15:01:29.291 MySqlTest[2451:145448] 2 张三 男 33 13099881235
     2015-06-27 15:01:29.291 MySqlTest[2451:145448] 3 李四 女 20 -
     2015-06-27 15:01:29.291 MySqlTest[2451:145448] 4 敌法师 男 8 18825694821
     */
     /*
person这个类的属性:
@property (nonatomic,copy) NSString *ID;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;
@property (nonatomic,copy) NSString *age;
@property (nonatomic,copy) NSString *tel;
*/


//添加数据 Person *p = [[Person alloc] init]; p.name = @"传说哥"; p.age = @"50"; p.sex = @""; p.tel = @"11111111111"; // [mgr addPerson:p]; /* //删除数据 p.ID = @"1"; [mgr deletaPerson:p]; */ } int main(int argc, const char * argv[]) { @autoreleasepool { test(); } return 0; }

 

从DBManager这个类可以看出,MySQL驱动是以C语言api写成的,而在该类中,重新封装以objective-c接口暴露给调用者。当然笔者这里少了些很多判断性操作,也没关闭数据库,在实际项目中,还需要读者自己完善。