Mybatis学习之路 第一篇

Mybatis学习之路 第一篇

  • 该系列教程只能帮你怎么用,并不涉及源码以及讲解。
  • 本文涉及以下内容:
    1. JDBC存在的问题极其代码操作
    2. 基于xml的Mybatis的入门程序案例
    3. 基于注解的Mybatis的入门程序

1. JDBC存在的问题
  • JDBC的操作非常繁琐,有很多的操作是我们开发者不需要去关注的,我们的重点应该只是SQL语句的本身。
  • 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
  • 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。

JDBC的操作如下:

// 1.注册驱动
// 2.获取连接
// 3.获取操作数据库的预处理对象
// 4.执行SQL,得到结果集
// 5.遍历结果集
// 6.释放资源
public static void main(String[] args) {
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        //加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        //通过驱动管理类获取数据库链接
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");
        //定义 sql 语句 ?表示占位符
        String sql = "select * from user where username = ?";
        //获取预处理 statement
        preparedStatement = connection.prepareStatement(sql);
        //设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值
        preparedStatement.setString(1, "王五");
        //向数据库发出 sql 执行查询,查询出结果集
        resultSet = preparedStatement.executeQuery();
        while(resultSet.next()){  //遍历查询结果集
            System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{  //释放资源
        if(resultSet!=null){
            try {
            resultSet.close();
            } catch (SQLException e) {
            e.printStackTrace();
            }
        }
        if(preparedStatement!=null){
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } 
    } 
}
  • PreparedStatement可以防止sql注入问题,Statement不行
  • PreparedStatement对象的执行方法有三种:
    • execute:它能执行CRUD中的任意一种语句。它的返回值是bool类型,表示是否有结果集。true为有。
    • executeUpdate:它只能执行CUD语句,查询语句无法执行。它的返回值是影响数据库记录的行数。
    • executeQuery:他只能执行SELECT语句,无法执行增删改。执行结果封装的结果集ResultSet对象。
2. 基于xml的Mybatis的入门程序
2.1 我们先看一下Mybitis的目录结构:

在这里插入图片描述


2.2 导入user表到Mysql数据库中
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-04 11:34:34','女','北京'),(43,'老王','2018-03-07 17:37:26','男','北京');

2.3 在pom.xml中添加如下包:
<!--mybatis是Mybatis框架-->
<!--mysql-connector-java是mysql的驱动包-->
<!--log4j是日志输出-->
<!--junit是单元测试-->
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
    </dependency>
</dependencies>

2.4 编写User的实体类:
public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //相应的get和set方法,以及toString方法不粘贴在这里了
}

2.5 编写持久层接口 IUserDao

public interface IUserDao {
    //查询所有用户
    List<User> findAll();
}

2.6 编写持久层接口的映射文件IUserDao.xml
  • 创建位置:必须和持久层接口在相同的包中
  • 名称:必须以持久层接口名称命名文件夹,扩展名是.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="fang.dao.IUserDao">
<!--    配置查询所有-->
    <select id="findAll" resultType="fang.domain.User">
        select * from user
    </select>
</mapper>    

2.7 编写 SqlMapConfig.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">

<!--mybatis的主配置文件-->
<configuration>
    <!--配置环境-->
    <environments default="mysql">
<!--        配置mysql的环境-->
        <environment id="mysql">
<!--            配置的事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
<!--            配置数据源(连接池)-->
            <dataSource type="POOLED">
<!--                配置连接数据库的4个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

<!--    指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
<!--        <mapper resource="fang/dao/IUserDao.xml"></mapper>-->
        <package name="fang.dao"/>
    </mappers>
</configuration>

2.8 将log4j.properties文件粘贴到工程中
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

2.9 编写测试类
public class MybatisTest {
    public static void main(String[] args) throws Exception {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = sqlSession.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user: users) {
            System.out.println(user);
        }
        //6.释放资源
        sqlSession.close();
        in.close();
    }
}
  • 好啦,基于xml的入门程序就结束了。
  • 回顾一下我们基于xml入门案例的创建过程:
    • 在pom.xml中添加需要的4个包
    • 编写User的实体类
    • 编写持久层接口 IUserDao
    • 编写持久层接口的映射文件IUserDao.xml
    • 编写 SqlMapConfig.xml 配置文件
    • 编写测试类
3. 基于注解的Mybatis的入门程序
3.1 直接删除配置文件IUserDao.xml

3.2 修改IUserDao中的代码如下:

*加入注解@Select(“select * from user”)

public interface IUserDao {
    /**
     * 查询所有操作
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}

3.3 修改SqlMapConfig.xml配置文件
  • 删除mapper中的resource属性添加class属性
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
    如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名-->
<mappers>
<!--<mapper resource="fang/dao/IUserDao.xml"/>-->
    <mapper class="fang.dao.IUserDao"/>
</mappers>

3.4 直接运行之前编写好的测试类就可以啦
  • 注解相对于xml可以省事不少呢,但是都有优缺点,后续开发大多是xml和注解结合起来的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值