Mybatis的学习1____使用idea和mybatis编写第一个程序

1.什么是Mybatis?

1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2.什么是持久层?

持久是相对于瞬时来说的, 持久层,可以理解成数据 保存在 数据库或者 硬盘一类可以保存很长时间的设备里面,不像放在内存中那样断电就消失了,也就是把数据存在持久化设备上 ,你想一下 内存中的数据 断电就没有了,硬盘的数据 是否会像内存中的数据一样断电消失么?当然不会。

3.Mybatis的缺点:

(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

4.Mybatis和Hibernate区别:

(1)Mybatis和hibernate不同,它不完全是一个ORM(对象关系映射)框架,因为MyBatis需要程序员自己编写Sql语句。

(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。 

(3)Hibernate对象/关系映射(ORM)能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。 

5.#{}  ,${} 的区别:

#{} :预编译处理,相当于PreparedStatement中的占位符。

${}:字符串替换,会替换成变量的值。

#{}可以有效的解决SQL注入的问题。

===============================================================================================================

第一个Mybatis程序的编写:

1.搭建数据库实验环境:

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mybatis`;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` INT(20) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  `pwd` VARCHAR(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT  INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');

2.创建一个普通的maven项目:

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kuang</groupId>
    <artifactId>ssm-mybatis-study</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>

        <!--mybatis的包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>8.0.16</version>
        </dependency>

        <!--连接数据库的驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

    </dependencies>


    <build>
        <!--希望maven在导出项目的时候,能够将我们的配置及资源导出-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>

    </build>



</project>

3.代码的编写:

3.1  pojo 实体类的编写:

public class User {

    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }

}

3.2Dao层接口 UserMapper的编写:

public interface UserMapper {

    //获取所有的User
    List<User> getUser();


}

3.3Dao层userMapper.xml配置文件的编写:

<?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 标签:对应mapper接口的类-->
<mapper namespace="com.xbf.dao.UserMapper">
    <!--select标签对应执行sql的查询语句  id对应映射接口中的方法的名字 -->
    <!--属性: resultType:返回结果的类型-->
    <!--select标签的中间部分,写sql语句-->
    <select id="selectUser" resultType="com.xbf.pojo.User">
        select * from user
    </select>

    <!--增加用户-->
    <insert id="addUser" parameterType="com.xbf.pojo.User">
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>

    <!--删除user 通过id删-->
    <delete id="deleteUserById">
      delete from user where id=#{id}
    </delete>

    <!---->
    <update id="modify" parameterType="com.xbf.pojo.User">
        update user set pwd=#{pwd},name=#{name} where id=#{id}
    </update>

    <!---->
    <select id="getUserById" resultType="com.xbf.pojo.User">
        select * from user where id=#{id}
    </select>

</mapper>

3.4在src/resources 下的database.properties的编写:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
username=root
password=1234567890

在src/resources 下的mybatis-config.xml的编写:

<?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>

    <properties resource="database.properties"/>

    <!--配置环境 这里可以有多套环境 default是代表默认的那一套环境-->
    <environments default="development">
        <!--环境的id 即环境的名字-->
        <environment id="development">
            <!--transactionManager 事务管理,type:JDBC-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource:数据源-->
            <dataSource type="POOLED">
                <!--xml中 不允许使用 ? 得用 &amp;  替换-->
                <property name="driver" value="${driver}"></property>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--关联映射文件-->
    <mappers>
        <mapper resource="com/xbf/dao/userMapper.xml"/>
    </mappers>

</configuration>

4.工具类(主要为了获取SqlSessionFactory)

//目的为了获得SqlSessionFactory
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //在maven中所有的资源文件都在resources下,我们一般可以直接拿到
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

5.测试类的编写:

public class UserMapperTest {
    @Test
    //获取user
    public void testSelectUser(){
        //1.拿到sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory= MybatisUtils.getSqlSessionFactory();

        //2.通过sqlSessionFactory对象 openSession() 创建一个sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.通过sqlSession 获得mapper对象,参数为映射文件中对应的接口类的class对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        //4.通过mapper对象来执行操作
        List<User> users = mapper.selectUser();

        //关闭资源
        sqlSession.close();

        //输出结果
        System.out.println(users);

    }

    @Test
    //
    public void addTest(){

        User user=new User("4","张三","250");
        SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.addUser(user);

        //提交事务
        sqlSession.commit();
        //关闭资源
        sqlSession.close();

    }

    @Test
    //
    public void deleteTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.deleteUserById(4);

        //提交事务
        sqlSession.commit();
        sqlSession.close();

    }

    //
    @Test
    public void midifyTest(){

        User u=new User("2","沙雕","250");
        SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.modify(u);

        sqlSession.commit();
        sqlSession.close();
    }

    //
    @Test
    public void selectTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User u = mapper.getUserById(2);
        System.out.println(u);
    }
}

项目结构:

 

测试结果:

[User{id=1, name='狂神', pwd='123456'}, User{id=2, name='沙雕', pwd='250'}, User{id=3, name='李四', pwd='987654'}, User{id=4, name='张三', pwd='250'}]

猜你喜欢

转载自www.cnblogs.com/xbfchder/p/11234633.html