xml的mysql增删改查_MyBatis之基于XML的增删改查

这里先吐槽下,写的半天的东西,IE浏览器弹出调试窗口导致写的东西全部没保存,搞得我还要重新用谷歌写,思路全没了,fuck.

前面学习了下spring的DAO层,说起DAO层,那ORM肯定是少不了的,ORM的框架也比较多,做C#的时候用EF,现在Java的话流行SSM,所以就想着学习下Mybatis,参考这EF的几篇博客,打算MyBatis这块也系统的学习下,主要涉及单表增删改查、属性与列名映射、表之间关系映射、事务与锁、存储过程、缓存、Spring与MyBatis结合这几块,可能随着深入的学习还会有慢慢补充。今天主要学习单表的增删改查。

一、准备

1.引入库

这里新建了一个maven的project,既然是MyBatis,肯定少不了pom.xml中引入它,同时与数据库交换,这里用的是mysql,所以也少不了mysql连接库。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

Cuiyw

MyBatisDemo

0.0.1-SNAPSHOT

jar

MyBatisDemo

http://maven.apache.org

UTF-8

org.mybatis

mybatis

3.2.1

mysql

mysql-connector-java

5.1.6

junit

junit

3.8.1

test

View Code

2.创建Model

既然是ORM,那肯定也得有对象,所以创建model.这里创建了一个简单的User类。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packageCuiyw.MyBatis.Model;public classUser {

@OverridepublicString toString() {//TODO Auto-generated method stub

return "User [id=" + Id + ", name=" + Name + ", age=" + Age + "]";

}public intgetId() {returnId;

}public void setId(intid) {

Id=id;

}publicString getName() {returnName;

}public voidsetName(String name) {

Name=name;

}public intgetAge() {returnAge;

}public void setAge(intage) {

Age=age;

}private intId;privateString Name;private intAge;

}

View Code

3.创建数据库表

ORM要做持久化,那少不了数据库,这里创建了MyBatis数据库,并增加了user表。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

CREATE DATABASE `mybatis` /*!40100 DEFAULT CHARACTER SET utf8*/;CREATE TABLE `user` (

`id`int(11) NOT NULLAUTO_INCREMENT,

`NAME`varchar(20) DEFAULT NULL,

`age`int(11) DEFAULT NULL,PRIMARY KEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

View Code

二、MyBatis使用

前面算是把准备工作做完了,那下面就是开始MyBatis的使用了,这里主要是单表的增删改查。处理增删改查的时候首先要解决的是怎么把User类与数据库中的user表对应起来,对象关系映射那肯定得有个映射才对。于是乎UserMapper出现了,用它来映射数据库处理得一些操作。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

select * from user where id=#{id}

select * from user

SELECT LAST_INSERT_ID()insert into user(name,age) values (#{name},#{age})

delete from user where id=#{id}

update user set name=#{name},age=#{age} where id=#{id}

View Code

上面UserMapper.xml中配置了对user表的增删改查,有了UserMapper.xml,算是项目中与表user扯上关系了,通过传入传出参数也与User类扯上了关系,不过还差一步,就是目前并不知道是映射到哪个数据库,地址多少,所以还需要一个数据库配置文件。这里要提下insert,其他几个都是直接一条sql,而insert与其他不一样,主要是为了演示新增返回主键值。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

View Code

1.新增

先了解下insert的属性。

parameterType:入参的全限定类名或类型别名

keyColumn:设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置

keyProperty:默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

useGeneratedKeys:取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

statementType:取值范围STATEMENT,PREPARED(默认值),CALLABLE

flushCache:取值范围true(默认值)|false,设置执行该操作后是否会清空二级缓存和本地缓存

timeout:默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常

databaseId:取值范围oracle|mysql等,表示数据库厂家,元素内部可通过``来为特定数据库指定不同的sql语句

这里有两个知识点,第一个是commit()提交的问题。我刚开始是按照下面写的.

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

//mybatis的配置文件

String resource = "DBConfig.xml";//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)

Reader reader =Resources.getResourceAsReader(resource);//构建sqlSession的工厂

SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(reader);//创建能执行映射文件中sql的sqlSession

SqlSession session =sessionFactory.openSession();

String statement="Cuiyw.MyBatis.DBMapping.UserMapper.addUser";

User user=newUser();

user.setName("Cuiyw");

user.setAge(27);int result=session.insert(statement, user);

session.close();

System.out.println(user.getId());

View Code

在main中运行上面的代码,也能打印出返回的主键值,但当我打开数据库表查询时并没有找到数据,当时觉得时没刷新,刷新了好几变还是没有,又去百度了下,参考其他博客发现时自己少了session.commit(),增加上之后发现数据库也有值了。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

//mybatis的配置文件

String resource = "DBConfig.xml";//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)

Reader reader =Resources.getResourceAsReader(resource);//构建sqlSession的工厂

SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(reader);//创建能执行映射文件中sql的sqlSession

SqlSession session =sessionFactory.openSession();

String statement="Cuiyw.MyBatis.DBMapping.UserMapper.addUser";

User user=newUser();

user.setName("Cuiyw");

user.setAge(27);int result=session.insert(statement, user);

session.commit();

session.close();

System.out.println(user.getId());

View Code

但有搜了几篇文章,发现有的insert时也没调用commit(),刚开始怀疑是不是代码遗漏了,还看了下面的评论,怎么也没人说,这不科学啊,于是有继续百度查找原因,终于还是找到了,原来SqlSessionFactory的openSession中有个是带布尔值参数的方法autoCommit,默认是false,代表不是自定提交,所以当我创建session时传入true后,也不用再写commit()方法了。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

//mybatis的配置文件

String resource = "DBConfig.xml";//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)

Reader reader =Resources.getResourceAsReader(resource);//构建sqlSession的工厂

SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(reader);//创建能执行映射文件中sql的sqlSession

SqlSession session = sessionFactory.openSession(true);

String statement="Cuiyw.MyBatis.DBMapping.UserMapper.addUser";

User user=newUser();

user.setName("Cuiyw");

user.setAge(27);int result=session.insert(statement, user);//session.commit();

session.close();

System.out.println(user.getId());

View Code

第二个是获取主键的问题。这个也是之前做C#的时候遇到过,所以想着看下MyBatis是怎么实现,除了除了上面使用selectKey的方式还可以在insert中直接配置keyProperty和useGeneratedKeys。

selectKey常用属性如下:

作用:在insert元素和update元素中插入查询语句。

keyProperty:默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中

resultType:keyPropety所指向的属性类全限定类名或类型别名

order属性:取值范围BEFORE|AFTER,指定是在insert语句前还是后执行selectKey操作

statementType:取值范围STATEMENT,PREPARED(默认值),CALLABLE

2.删改查

其实这几个是比较类似的,都是SqlSession中调用对应的方法。下面是先增加一个user,然后修改,遍历和删除

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public static void main( String[] args ) throwsIOException

{//mybatis的配置文件

String resource = "DBConfig.xml";//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)

Reader reader =Resources.getResourceAsReader(resource);//构建sqlSession的工厂

SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(reader);//创建能执行映射文件中sql的sqlSession

SqlSession session = sessionFactory.openSession(true);

System.out.println("新增");

String statement="Cuiyw.MyBatis.DBMapping.UserMapper.addUser";

User user=newUser();

user.setName("Cuiyw");

user.setAge(27);int result=session.insert(statement, user);//session.commit();//session.close();

System.out.println(user.getId());

System.out.println("查询单个");

statement="Cuiyw.MyBatis.DBMapping.UserMapper.getUser";

user=session.selectOne(statement, user.getId());//session.close();

System.out.println(user.toString());

System.out.println("修改");

statement="Cuiyw.MyBatis.DBMapping.UserMapper.updateUser";

user.setName("Cuiye Update");

result=session.update(statement, user);

System.out.println("遍历所有");

statement="Cuiyw.MyBatis.DBMapping.UserMapper.getUserList";

List users=session.selectList(statement);//session.close();

for(int i=0;i

{

System.out.println(users.get(i));

}

session.commit();

System.out.println("删除");

statement="Cuiyw.MyBatis.DBMapping.UserMapper.deleteUserById";

session.delete(statement,user.getId());

System.out.println("删除之后遍历所有");

statement="Cuiyw.MyBatis.DBMapping.UserMapper.getUserList";

users=session.selectList(statement);

session.close();for(int i=0;i

{

System.out.println(users.get(i));

}

}

View Code

8bcf34edbe8913531a1b4e1da0242fb2.png


版权声明:本文为weixin_42240669原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。