Mybatis学习(一)使用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.什么是持久层?

Dao层,Service层,Controller层…
完成持久化工作的代码块
层界限十分明显。

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

3.mybatis的作用

  • 帮助程序员将数据存入数据库中
  • 传统的JDBC代码太复杂了。简化。框架。自动化。
  • 不用Mybatis也可以。更容易上手,技术没有高低之分

4.Mybatis的缺点:

  • SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
  • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

5.Mybatis和Hibernate区别:

扫描二维码关注公众号,回复: 13429770 查看本文章

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

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

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

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

#{} :预编译处理,相当于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:导入maven依赖

<?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.2 Dao层接口 UserMapper的编写:

public interface UserMapper {
    
    

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


}

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

在MyBatis的xml页面中:
id:就是接口中对应的方法名
resultType:Sql语句执行的返回值!

<?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对应映射接口中的方法的名字 parameterType : 参数类型! -->
    <!--属性: 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中 不允许使用 ? 得用 &  替换-->
                <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/jing/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'}]

5.万能map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!

(1)编写接口

 int addUser2(Map<String,Object> map);

(2).编写对应mapper中的SQL语句

<insert id="addUser2" parameterType="map">
        insert into mybatis.user (id, pwd) values (#{userid},#{passWord});
 </insert>

(3).测试

@Test
public void addUser2(){
    
    
SqlSession sqlSession = MybatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map<String, Object> map = new HashMap<String, Object>();

    map.put("userid",5);
    map.put("passWord","2222333");

    mapper.addUser2(map);

    sqlSession.close();
}

6.模糊查询

//1. Java代码执行的时候,传递通配符 % %
   List<User> userList = mapper.getUserLike("%李%");
   
//2. 在sql拼接中使用通配符!
   select * from mybatis.user where name like "%"#{
    
    value}"%"

(增删改查的注意事项:)

1.事务:

增删改需要进行事物的提交!

增删改需要进行事物的提交!!

增删改需要进行事物的提交!!!

2.参数问题:

如果是基本类型可以省略不写,而引用类型必须是: 包名+类名。

猜你喜欢

转载自blog.csdn.net/jingli456/article/details/114068545
今日推荐