mybatise

JDBC

public static void main(String[] args) {
        ResultSet resultSet = null;
        PreparedStatement preparedStatement = null;
        Connection connection = null;
        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 创建数据库连接
            String url = "jdbc:mysql://127.0.0.1:3306/mybatis_0505";
            String user = "root";
            String password = "123456";
            connection = DriverManager.getConnection(url, user, password);

            // 创建statmenet
            String sql = "SELECT * FROM tb_user WHERE id = ?";
            preparedStatement = connection.prepareStatement(sql);

            // 设置参数、执行sql,2个参数,第一个是参数的下标,从1开始,第二个参数数据查询条件数据
            preparedStatement.setLong(1, 1L);

            resultSet = preparedStatement.executeQuery();

            // 遍历结果集
            while (resultSet.next()) {
                System.out.println("ID: " + resultSet.getLong("id"));
                System.out.println("userName: " + resultSet.getString("user_name"));
                System.out.println("password: " + resultSet.getString("password"));
                System.out.println("name: " + resultSet.getString("name"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放连接(资源)
            if (null != resultSet) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(null != preparedStatement){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(null != connection){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

}

存在问题

1、 驱动包硬编码到java代码中,更换数据库必须修改java文件重新编写,解决:定义到配置文件中。

2、 数据库连接字符串、用户名、密码硬编码到java代码中,解决:定义到配置文件中。

3、 Sql语句硬编码到java代码中

  a) 修改sql,必须修改java文件、重新编译

  b) 无法达到代码重用的作用

  c) 解决方案:能否将sql写到配置文件中?

4、 设置参数有问题

  a) 参数写死了,解决方案:传递进来即可

  b) 需要判断参数类型,解决方案:能否自动判断?

  c) 需要手动判断参数的位置,解决:能否自动判断?

5、 遍历结果集存在问题

  a) 需要判断类型

  b) 手动指定字段名

  c) 解决:能否直接将结果集映射为java对象?

6、 释放资源存在问题,频繁的创建连接和关闭连接,造成资源的浪费,影响系统的性能,解决:使用连接池

关于pom war jar

jar是java工程, war 是web工程,pom是聚合工程

Mybatis的整体架构

问:如何获取sqlSessionFactory ?

答: 分两种情况,1.不存在spring 时候直接new sqlSessionFactoryBuild 2.存在spring_mybatise整合包时候,直接在水平bean得到

问:sql为什么没有List类型

答:把对象放到list,不可能把list映射到数据中

总结:

1、 mybatis的配置文件有2类

  a) mybatisconfig.xml,配置文件的名称不是固定的,配置了全局的参数的配置,全局只能有一个配置文件。

  b) Mapper.xml 配置多个statemement,也就是多个sql,整个mybatis框架中可以有多个Mappe.xml配置文件。

2、 通过mybatis配置文件得到SqlSessionFactory

3、 通过SqlSessionFactory得到SqlSession,得到SqlSession就可以操作数据了。

4、 SqlSession通过底层的Executor(执行器),执行器有2类实现:

  a) 基本实现

  b) 带有缓存功能的实现

  

5、 MappedStatement是通过Mapper.xml中定义statement生成的对象。

6、 参数输入,无需手动判断参数类型和参数下标位置

  a) HashMap,KV格式的数据类型

  b) Java的基本数据类型

  c) POJO,java的对象

7、 结果集输出,自动将查询的结果集映射为java对象(POJO)

  a) HashMap,KV格式的数据类型

  b) Java的基本数据类型

  c) POJO,java的对象

http://www.mybatis.org/mybatis-3/zh/index.html  mybatise中文文档

1.编写main方法实例化SqlSessionFactory

配置mybatis-config.xml

执行sql查询总结

1、 配置UserMapper.xml,配置sql

2、 需要将UserMapper.xml添加到mybatis-config.xml中

3、 通过SqlSession执行

4、 测试

使用mybatis实现CRUD

定义UserDAO接口

public interface UserDAO {

    /**
     * 根据id查询用户数据
     *
     * @param id
     * @return
     */
    public User queryUserById(Long id);

    /**
     * 新增user数据
     *
     * @param user
     */
    public void saveUser(User user);

    /**
     * 更新user数据
     *
     * @param user
     */
    public void updateUser(User user);

    /**
     * 根据id删除用户数据
     *
     * @param id
     */
    public void deleteUserById(Long id);

}

编写接口的实现类

public class UserDAOImpl implements UserDAO{

    private SqlSessionFactory sqlSessionFactory;

    public UserDAOImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User queryUserById(Long id) {
        SqlSession session = this.sqlSessionFactory.openSession();
        User user = session.selectOne("userDAO.queryUserById", id);
        session.close();
        return user;
    }

    @Override
    public void saveUser(User user) {
        SqlSession session = this.sqlSessionFactory.openSession();
        session.insert("userDAO.saveUser", user);
        //提交事物
        session.commit();
        session.close();
    }

    @Override
    public void updateUser(User user) {
        SqlSession session = this.sqlSessionFactory.openSession();
        session.update("userDAO.updateUser", user);
        //提交事物
        session.commit();
        session.close();
    }

    @Override
    public void deleteUserById(Long id) {
        SqlSession session = this.sqlSessionFactory.openSession();
        session.delete("userDAO.deleteUserById", id);
        //提交事物
        session.commit();
        session.close();
    }

}

编写UserDAOMapp.xml

<mapper namespace="userDAO">

    <select id="queryUserById" resultType="cn.itcast.mybatis.pojo.User">
        SELECT *,user_name userName FROM tb_user WHERE id = #{id}
    </select>

    <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User">
        INSERT INTO tb_user (
            id,
            user_name,
            password,
            name,
            age,
            sex,
            birthday,
            created,
            updated
        )
        VALUES
            (
                NULL,
                #{userName},
                #{password},
                #{name},
                #{age},
                #{sex},
                #{birthday},
                NOW(),
                NOW()
            );
    </insert>

    <update id="updateUser" parameterType="cn.itcast.mybatis.pojo.User">
        UPDATE tb_user
        SET
         user_name = #{userName},
         password = #{password},
         name = #{name},
         age = #{age},
         sex = #{sex},
         birthday = #{birthday},
         updated = NOW()
        WHERE
            id = #{id}
    </update>

    <delete id="deleteUserById">
        DELETE FROM tb_user WHERE id = #{id}
    </delete>

</mapper>

加入到mybatis-config.xml中

public class UserDAOImplTest {

    private UserDAO userDAO;

    @Before
    public void setUp() throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        this.userDAO = new UserDAOImpl(sqlSessionFactory);
    }

    @Test
    public void testQueryUserById() {
       User user = this.userDAO.queryUserById(1L);
       System.out.println(user);
    }

    @Test
    public void testSaveUser() {
        User user = new User();
        user.setAge(20);
        user.setBirthday(new Date());
        user.setName("test_1");
        user.setPassword("123456");
        user.setSex(1);
        user.setUserName("test_username_1");

        this.userDAO.saveUser(user);
    }

    @Test
    public void testUpdateUser() {
        User user = this.userDAO.queryUserById(2L);
        user.setAge(30);
        this.userDAO.updateUser(user);
    }

    @Test
    public void testDeleteUserById() {
        this.userDAO.deleteUserById(6L);
    }

}

面试题:#{}${}的区别

时间: 2024-08-14 06:08:32

mybatise的相关文章

SpringMVC+Mybatise的使用发现的问题

目前发现Spring MVC对多对象参数的支持不好,不能直接AJAX POST 多个对象给后台,如这样定义的控制函数 @RequestMapping(value = "/insert", method = RequestMethod.POST) @ResponseBody public ResultDataEO<RegRtnType> insert(BuildingEO data,HouseEO Data) 如果想在前端静态页面通过AJAX POST 这两个对象数据,基本上

MyBatise代码自动生成时候Oralce的number类型BigDecimal问题

第一次使用MyBatise发现一个问题,使用MyBatise的代码自动生成工具时候,即便在配置文件中定义了 Xml代码   <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <javaTypeResolver> <property name="forceBigDecimals

mybatise 实现同一字段多模糊查询

mybatise 同一字段多模糊查询 <foreach collection="typeList" index="index" item="item" open="(" separator="or" close=")"> s.type like concat(concat('%',#{item}),'%') </foreach>

mybatise 动态sql

1. <if><choose> 动态sql 相当 <if> Java if  满足多个条件  <choose> <when>    java switch case 满足一个条件 2.<where> <set> 判断是否添加 and 或者 or 3.<foreach> foreach元素的属性主要有 item,index,collection,open,separator,close. item表示集合中每一个

mybatise 设置全局变量实例

前言 在平时的工作中有时候是需要在配置文件中配置全局变量的,因为这些东西是不会变的,并且每个mapper都传参的话也显得有点繁琐,还好mybatis本身是支持全局变量的,今天工作中用到了,记录一下. mybatis可以设置全局变量,可以用于数据库类型的标示,比如:dbType=oracle .dbType=mysql; 可通过configurationProperties参数设置,设置方法如下: <bean id="sqlSessionFactory" class="o

Spring的配置文件

Web.xml将会配置Spring的配置文件位置: <servlet>        <servlet-name>x</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>            <param-name>contextC

SSM--Spring(4.3.2.RELEASE) + SpringMVC(4.3.2.RELEASE) + MyBatis(3.4.1) 整合

. 1. 开发环境搭建 参考博文:Eclipse4.6(Neon) + Tomcat8 + MAVEN3.3.9 + SVN项目完整环境搭建 2. Maven Web项目创建 2.1. 2.2. 2.3. 2.4. 2.5. 完成后目录结构图 2.5 (可选)设置: 选中项目 单击右键设置; 项目编码换成UTF-8:Properties -> Resource -> Text file encoding 设置默认的JRE:Properties -> Java Build Path -&g