条条|MyBatis学习笔记2——第一个MyBatis程序

2.1使用MyBatis

我们在使用和学习MyBatis时最好去下载官方的文件,里面包含了所需要的依赖和官方文档https://github.com/mybatis/mybatis-3/releases

我在这里放出官方的中文网站,里面都是关于MyBatis的使用介绍:https://mybatis.org/mybatis-3/zh/getting-started.html

2.1.1具体步骤:
  1. 在数据库建好目标表
  2. 在idea(pom文件)加入maven的mybatis坐标,mysql驱动坐标
    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <!--mysql依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
    
  1. 创建实体类(保存表中一行数据)

    public class Student {//推荐和表名一致,方便记忆
        //定义属性,和列名一致
    
        private Integer id;
        private String name;
        private String email;
        private int age;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", email='" + email + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
  2. 创建持久层的dao接口,定义操作数据库的方法

    import java.util.List;
    
    //接口,操作student表
    public interface StudentDao {
    
    public List<Student> selectStudents();//查询student表的所有数据
    }
    
  3. 创建mybatis使用的配置文件(sql映射文件,是个xml文件)
    用于写sql语句,一般一个表一个sql映射文件;文件名和目标接口同名且位于同一个目录下
    id:是该sql语句的唯一表示,mybatis会根据这个id来找到对应的sql语句可自定义,但最好是和接口中的方法保持一致
    resultType:表示结果类型,是sql语句执行后得到的ResultSet,遍历这个ResultSet得到的java对象类型
    操作标签:要什么操作,就把对应的sql语句放到下面对应的标签中要填类型的全限定名称 <select> <update> <insert> <delete>
    <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="com.mybatis.dao.StudentDao">
    
    <select id="selectStudents" resultType="com.mybatis.domain.Student">
        select id,name,email,age from student order by id
    </select>
    </mapper>
    
    我们要确保src/main/resources下的主配置文件在target/classes/com下也有,所以我们在pom中加入以下代码,这样主配置文件在编译时就会被copy到target目录下了
    <build>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在目录-->
        <includes><!--包括目录下的.properties,.xml文件都会被扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
    </build>
    

    然后在idea右侧的maven/项目名/Lifecycle点击compile,这样项目会进行编译,编译完后我们就可以看到多出个target文件

  4. 创建mybatis的主配置文件(放在resource目录下,名称自定义)
    提供了数据库的连接信息和sql映射文件的位置信息,一个项目一个主配置文件

    各个标签的功能和用法在下面都有说明
    <?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>
    
    <!--环境配置: 数据库连接信息
                default:必须和下面其中的环境id一致,以用于选择目标数据库
    -->
    <environments default="myenv">
    
        <!--environment:一个数据库信息的配置,环境
                         id:唯一值,自定义,表示环境名称
        -->
        <environment id="myenv">
    
            <!--transactionManager:mybatis事务类型   
            type:JDBC(表示使用JDBC的Connection对象的commit,rollback做事务处理)
            -->
            <transactionManager type="JDBC"/>
    
            <!--dataSource:数据源,用于连接数据库
                                 type:数据源类型,POOLED:连接池
            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--sql mapper(sql映射文件)位置-->
    <mappers>
        <!--单个mapper,从类路径目录开始,target/class(类路径)-->
        <mapper resource="com/mybatis/dao/StudentDao.xml"/>
    </mappers>
    </configuration>  
    
    
  5. 创建使用mybatis类
    通过mybatis访问数据库

    注意getResourceAsStream()要选择InputStream类的
    public class MyApp {
    public static void main(String[] args) throws IOException {
        //访问mybatis获取student数据
        //1.定义mybatis主配置文件的名称,从类路径的根开始(target/class)
        String con="mybatis.xml";
        //2.读取上面的con文件
        InputStream in = Resources.getResourceAsStream(con);
        //3.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        //4.创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //5.从SqlSessionFactory中获取和创建SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //6.执行目标sql语句标识;sql映射文件中的namespace + "." + 标签id
        String sqlId="com.mybatis.dao.StudentDao"+"."+"selectStudents";
        //7.执行sql语句,通过sqlId找到语句
        List<Student> studentList = sqlSession.selectList(sqlId);
        //8.输出结果
        for (Student student : studentList){
            System.out.println(student);
        }
        //9.关闭SqlSession对象
        sqlSession.close();
            }
     }
    

    进行insert操作的代码:

    public class Test01 {
    @Test
    public void t1() throws IOException {
        //访问mybatis获取student数据
        //1.定义mybatis主配置文件的名称,从类路径的根开始(target/class)
        String con="mybatis.xml";
        //2.读取上面的con文件
        InputStream in = Resources.getResourceAsStream(con);
        //3.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        //4.创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //5.从SqlSessionFactory中获取和创建SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //6.执行目标sql语句标识;sql映射文件中的namespace + "." + 标签id
        String sqlId="com.mybatis.dao.StudentDao.insertStudent";
        //7.执行sql语句,通过sqlId找到语句
        Student student=new Student();
        student.setId(1006);
        student.setName("中文");
        student.setEmail("66@tt.com");
        student.setAge(6);
        int nums = sqlSession.insert(sqlId, student);
    
        //MyBatis默认不提供事务提交,当我们进行insert、update和delete操作后要手动提交事务
        sqlSession.commit();
        //8.输出结果
        System.out.println("插入所影响的行数="+nums);
        //9.关闭SqlSession对象
        sqlSession.close();
        }
    }
    
2.1.2连接MyBatis类介绍
  • Resources:负责读取主配置文件
  • SqlSessionFactoryBuilder:创建SqlSessionFactory对象
  • SqlSessionFactory:重量级对象,该对象的创建耗时耗资源较多,一个项目中有一个就够了
    SqlSessionFactory是一个接口,实现类为DefaultSqlSessionFactory
    作用是获取SqlSession对象
    openSession():参数默认是false,获取的是非自动提交事务的SqlSession对象;
  • SqlSession:定义了操作数据的方法 例如 selectOne()selectList()insert()update()delete()commit()rollback()
    使用要求: SqlSession对象不是线程安全的,需要在方法内部使用
    在执行sql语句之前,使用openSession()获取SqlSession对象
    在执行完sql语句后,需要关闭它,执行SqlSession.close()
    这样能保证他的使用是线程安全的
注:如果我们插入数据后,发现数据库显示的新的数据的中文都是问号的话,一个要检查idea本身的编码是否都是utf-8,一个检查数据库的创建是否是utf-8

如果以上都没问题,我们可以在主配置文件中的<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>后加入?useUnicode=true&amp;characterEncoding=UTF-8

条条:该学习笔记是记录了我的学习过程,学习自动力节点c语言中文网,有不对的地方欢迎指出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343