MyBatis的数据库操作

1.首先,在MYSQL数据库中创建一个新的数据库mybatis和tb_user表
(1)创建库
create database mybatis;
use mybatis;
(2)创建表
CREATE TABLE IF NOT EXISTS `tb_user` (
  `ID` int(11) NOT NULL,
  `NAME` varchar(18) DEFAULT NULL,
  `SEX` char(2) DEFAULT NULL,
  `AGE` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `tb_user`
  ADD PRIMARY KEY (`ID`);
在MYSQL数据库中执行SQL脚本,完成创建数据库和表的操作.
前面已经介绍了,在所有的ORM框架中都有一个非常重要的媒介:PO(持久化对象),持久化对象的作用就是完成持久化操作,简单的说,就是通过该对象可对数据库执行增删改查的操作,以面向对象的方式操作数据库.
应用程序无须直接访问数据库,甚至无须理会底层数据库采用何种数据库,这一切应用程序完全透明,应用程序只需创建,修改,删除持久化对象即可:与此同时,MyBatis则负责把这种操作转换为指定数据库表的操作.
Mybatis中的PO是非常简单的,其是低侵入式的设计,完全采用普通的Java对象作为持久化对象使用.下面即是一个POJO(普通的,传统的Java对象)类.
2.模型
public class User implements Serializable
{
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    
    //无参数构造器
    public User()
    {
        super();
    }
    
    //有参数构造器
    public User(
            String name,
            String sex,
            Integer age
            )
    {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
...
上面这个类的代码,和普通的JavaBean没有任何区别,实际上,MyBatis直接采用了POJO(普通的,传统的Java对象)作为持久化类,这就是MyBatis被称为低侵入式设计的原因.MyBatis不要求持久化类继承任何父类,或者实现任何接口,这样可保证代码不被污染.
对于MyBatis来说,现在还不理解持久化类User和数据库表之间的对应关系,也不理解持久化类User和数据库表之间的对应关系,也不理解持久化类的属性与数据表之间的对应关系.MyBatis是通过XML文件去完成持久化类和数据库表之间的映射关系的.
3.mapper
<?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="org.fkit.mapper.UserMapper">
    <insert id="save" parameterType="org.fkit.domain.User" useGeneratedKeys="true">
        INSERT INTO tb_user(NAME,SEX,AGE) VALUES(#{name},#{sex},#{age})
    </insert>
</mapper>
上面的XML配置中定义了一条insert语句,详细解释如下:
(1)<mapper namespace=”org.fkit.mapper.UserMapper”>,为这个mapper指定一个唯一的namespace,为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的,例如:namespace=”org.fkit.mapper.UserMapper”就是org.fkit.mapper+UserMapper
(2)在insert标签中编写了插入sql语句,设置insert标签的id属性为save.id属性值必须是唯一的,不能够重复.
(3)使用parameterType属性指明插入时使用的参数类型
(4)使用useGeneratedKeys=”true”表示使用数据库的自动增长策略,这需要底层数据库的支持.
(5)insert标签中只有一条标准的insert语句,用来向tb_user表插入一条数据,#{name}表示取参数中的对象的name属性值.
接下来,通过这个持久化来完成数据库的操作:插入一条数据.
对于MyBatis来说,现在还不知道需要连接哪个数据库,以及连接数据库时所用的连接池,用户名和密码等详情信息.这些信息对于所有的持久化类都是通用的,MyBatis把这些通用信息称为配置信息,配置信息需要使用配置文件指定:
4.batis-config
<?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>
<!-- 指定MyBatis所用日志的具体实现 -->
<settings>
    <setting name="logImpl" value="LOG4J" />
</settings>
<!-- 环境配置,即链接的数据库 -->
<environments default="mysql">
    <environment id="mysql">
        <!-- 指定事务管理类型,type="JDBC"指直接简单使用JDBC的提交和回滚设置 -->
        <transactionManager type="JDBC"></transactionManager>
        <!-- dateSource指数据源配置,POOLED是JDBC链接对象的数据源连接池的实现 -->
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://211.149.241.185:22006/mybatis"/>
            <property name="username" value="mio1505" />
            <property name="password" value="bhdpxTJDMPABdXt2" />
        </dataSource>
    </environment>
</environments>
<!-- mappers告诉MyBatis去哪里找持久化类的映射文件 -->
<mappers>
    <mapper resource="org/fkit/mapper/UserMapper.xml" />
</mappers>
</configuration>
MyBatis配置文件默认被命名为mybatis-config.xml,应用程序运行时需要先加载该文件.MyBatis配置文件是一个XML文件,该文件第一行是XML文件声明,指定该XML文件的版本和存储该文件所用的字符集.
MyBatis配置文件的根元素是<configuration…/>,根元素中有<settings…/>子元素,该元素有很多子元素,本示例只是配置了日志信息,之后可以在控制台看到输出的SQL语句,其在调试中非常有用.根元素中还有<environments…/>子元素,用来配置MyBatis的环境,即连接的数据库,该子元素用于将SQL映射应用用于多种数据库之中,每个数据库对应一个SqlSessionFactory,可以配置多种环境,但只能为SqlSessionFactory实例中选择一个环境,default属性表示选择的环境.<environment>子元素用于配置一个环境,<transactionManager>子元素用来配置MyBatis当中的事务管理,JDB表示直接简单使用JDBC的提交和回滚设置,<dataSource>子元素用来配置数据源,MyBatis并不推荐采用DriverManager来连接数据库,而是推荐使用数据源来管理数据库连接,这样能保证最好的性能.该元素依次有很多<property>子元素,这些<property>子元素用于配置MyBatis连接数据库的必要信息,如连接数据库的驱动,URL,用户名,密码等.
数据源是一种用来提高数据库连接性能的常规手段,数据源会负责维持一个数据库连接池,当程序创建数据源实例时,系统会一次性创建多个数据库连接,并把这些数据库连接保存在连接池中.当程序需要进行数据库访问时,无须重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接,当程序使用数据库连接访问数据库结束后,无须关闭数据库连接,而是将数据库连接归还给连接池即可.通过这种方式,可避免频繁的获取数据库连接,关闭数据库连接导致的性能下降.
5.数据插入
    @RequestMapping("/hello")
    public String hello(Model model) throws Exception
    {
        //读取myBatis-config.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //创建session实例
        SqlSession session = sqlSessionFactory.openSession();
        User user = new User("admin","m",22);
        //插入数据
        session.insert("org.fkit.mapper.UserMapper.save",user);
        //提交事务
        session.commit();
        //关闭session
        session.close();
        
        model.addAttribute("msg", "this is msg");
        return "1";
    }
上面持久化操作的代码非常简单,程序先创建一个User对象,再使用SqlSession的insert()方法来保存User对象即可,这是完全对象化的操作方式,可以说非常简单明了.当Java程序以面向对象的方式来操作持久化对象时,MyBatis负责将这种操作转换为底层SQL操作.