Mybatis入门程序

1      Mybatis入门程序

Mybatis课程的所有代码程序将通过一个订单商品案例来进行讲解。

1.1  需求

对用户信息的增删改查操作。

1、  根据用户ID来查询用户信息;

2、  根据用户名称来模糊查询用户信息列表;

3、  添加用户

4、  删除用户(练习)

5、  修改用户(练习)

1.2  环境准备

l  Jdk环境:jdk1.7.0_72

l  Ide环境:eclipse indigo

l  数据库环境:MySQL5.1

l  Mybatis:3.2.7

1.2.1  数据库初始化

1.2.1.1       数据库脚本


1、  执行sql_table.sql脚本,创建数据库表;

2、  执行sql_data.sql初始化测试数据。

1.2.1.2       数据库表

订单商品案例的数据库脚本中,总共包含四张表,其中入门程序只使用user

用户表的表结构如下:

1.2.2  下载mybatis

mybaits的代码由github管理,下载地址:https://github.com/mybatis/mybatis-3/releases

 

Lib:mybatis的依赖包

Mybatis-3.2.7.jar:mybatis的核心包

Mybatis-3.2.7.pdf:mybatis的使用指南

1.3  工程搭建(三步)

1.3.1  第一步:创建java工程

用eclipse创建一个java工程,jdk使用1.7.0_72。

1.3.2  第二步:加入jar包

加入以下四部分jar包,其中junit的jar包,是非必须的。

l  Mybatis核心包

l  Mybatis依赖包

l  MySQL驱动包

l  Junit单元测试包(单元测试需要的包)

1.3.3  第三步:添加log4j.properties文件

Mybatis使用的日志包是log4j的,所以需要添加log4j.properties。

 

在classpath下创建log4j.properties如下:

文件内容可以从mybatis-3.2.7.pdf中拷贝

# Global loggingconfiguration

log4j.rootLogger=DEBUG, stdout

# Console output...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 

日志级别在开发阶段设置成DEBUG,在生产阶段设置成INFO或者ERROR

1.4  编程步骤

1、  创建PO类,根据需求创建;

2、  创建全局配置文件SqlMapConfig.xml;

3、  编写映射文件;

4、  加载映射文件,在SqlMapConfig.xml中进行加载;

5、  编写测试程序,即编写Java代码,连接并操作数据库。

         思路:

a)        读取配置文件;

b)        通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。

c)        通过SqlSessionFactory创建SqlSession。

d)        调用SqlSession的操作数据库方法。

e)        关闭SqlSession。

1.5  代码开发

1.5.1  创建PO类

创建的po类的属性要和数据库中表的列名一致(如果表中的列名是带有下划线,那么po类中对应的的属性名要采用驼峰式命名)

User.java类如下:

Public class User {

private int id;

    private String username;// 用户姓名

    private String sex;// 性别

    private Date birthday;// 生日

    private String address;// 地址

get/set……

1.5.2  创建SqlMapConfig.xml配置文件

在classpath下,创建SqlMapConfig.xml文件

SqlMapConfig.xml(文件头可以从mybatis-3.2.7.pdf文档的2.1.2小节中拷贝):

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

<!-- 配置mybatis的环境信息 -->

<environments default="development">

    <environment id="development">

       <!-- 配置JDBC事务控制,由mybatis进行管理 -->

       <transactionManager type="JDBC"></transactionManager>

       <!-- 配置数据源,采用dbcp连接池 -->

       <dataSource type="POOLED">

           <property name="driver"value="com.mysql.jdbc.Driver"/>

           <property name="url"value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8"/>

           <property name="username"value="root"/>

           <property name="password"value="root"/>

       </dataSource>

    </environment>

</environments>

</configuration>

1.5.3  需求开发

在classpath下,创建sqlmap文件夹。在sqlmap目录下,创建User.xml映射文件。

Mybatis的映射文件头(可以从mybatis-3.2.7.pdf文件中拷贝):

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

1.5.3.1       根据用户ID来查询用户信息
1.5.3.1.1      编写映射文件

在User.xml中添加以下代码:

<!--

    namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离

    注意:使用mapper代理开发时,namespace有特殊且重要的作用

 -->

<mapper namespace="test">

 

    <!-- 根据用户ID,查询用户信息 -->

    <!--

       [id]statementid,要求在命名空间内唯一 

       [parameterType]:入参的java类型

       [resultType]:查询出的单条结果集对应的java类型

       [#{}]表示一个占位符?

       [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义

     -->

    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">

       SELECT * FROM USER WHERE id = #{id}

    </select>

</mapper>

1.5.3.1.2      加载映射文件

SqlMapConfig.xml中,添加以下代码:

<!-- 加载mapper -->

<mappers>

    <mapper resource="sqlmap/User.xml"/>

</mappers>

1.5.3.1.3      编写测试程序

publicclass MybatisFirst {

 

    @Test

    public void findUserByIdTest() throws Exception{

      

       //1、读取配置文件

       String resource = "SqlMapConfig.xml";

       InputStream inputStream = Resources.getResourceAsStream(resource);

       //2、根据配置文件创建SqlSessionFactory

       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

       //3SqlSessionFactory创建SqlSession

       SqlSession sqlSession = sqlSessionFactory.openSession();

       //4SqlSession执行statement,并返回映射结果

       //第一个参数:statementid,建议:namespace.statementId(确保唯一)

       //第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

       User user = sqlSession.selectOne("findUserById", 1);

      

       //打印输出结果集

       System.out.println(user);

      

       //5、关闭SqlSession

       sqlSession.close();

    }

}

1.5.3.2       根据用户名称来模糊查询用户信息列表
1.5.3.2.1      编写映射文件

User.xml中,添加以下内容:

<!-- 根据用户名称模糊查询用户信息列表 -->

<!--

       [${}]:表示拼接SQL字符串

        [${value}]:表示要拼接的是简单类型参数。

        注意:

       1、如果参数为简单类型时,${}里面的参数名称必须为value

       2${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}

-->

<select id="findUsersByName"parameterType="String" resultType="cn.itcast.mybatis.po.User">

    SELECT * FROM USER WHERE username LIKE '%${value}%'

</select>

 

1.5.3.2.2      加载映射文件

已配置,此处无需再次配置。

1.5.3.2.3      编写测试程序

@Test

public void findUsersByNameTest()throws Exception {

    // 1、读取配置文件

    String resource = "SqlMapConfig.xml";

    InputStream inputStream = Resources.getResourceAsStream(resource);

    // 2、根据配置文件创建SqlSessionFactory

    SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);

    // 3SqlSessionFactory创建SqlSession

    SqlSession sqlSession = sqlSessionFactory.openSession();

    // 4SqlSession执行statement,并返回映射结果

    // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

    // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

    List<User> users = sqlSession.selectList("test.findUsersByName", "小明");

 

    // 打印输出结果集

    System.out.println(users);

 

    // 5、关闭SqlSession

    sqlSession.close();

}

1.5.3.3       添加用户
1.5.3.3.1      编写映射文件

<!-- 添加用户 -->

<!-- 如果主键的值是通过MySQL自增机制生成的,那么我们此处不需要再显示的给ID赋值 -->

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User">

    INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})

</insert>

1.5.3.3.2      加载映射文件

已配置,此处无需再次配置。

1.5.3.3.3      编写测试程序

注意:增删改操作要对SqlSession执行commit操作。

@Test

    public void insertUserTest() throws Exception {

       // 1、读取配置文件

       String resource = "SqlMapConfig.xml";

       InputStream inputStream = Resources.getResourceAsStream(resource);

       // 2、根据配置文件创建SqlSessionFactory

       SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder()

              .build(inputStream);

       // 3SqlSessionFactory创建SqlSession

       SqlSession sqlSession = sqlSessionFactory.openSession();

       // 4SqlSession执行statement,并返回映射结果

      

       //构建user参数,没有赋值的属性采取默认值

       User user = new User();

       user.setUsername("东哥1");

       user.setAddress("清河宝盛西里");

      

       // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

       // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

       sqlSession.insert("insertUser", user);

 

       //切记:增删改操作时,要执行commit操作

        sqlSession.commit();

 

       // 5、关闭SqlSession

       sqlSession.close();

    }

 

1.5.3.3.4      主键返回之MySQL自增主键

思路:

Ø  MySQL自增主键,是指在insert之前MySQL会自动生成一个自增的主键。

Ø  我们可以通过MySQL的函数获取到刚插入的自增主键:

LAST_INSERT_ID()

Ø  这个函数是在insert语句之后去调用。

 

修改映射文件:

<!-- 添加用户之自增主键返回(selectKey方式) -->

<!--

       [selectKey标签]:通过select查询来生成主键

       [keyProperty]:指定存放生成主键的属性

       [resultType]:生成主键所对应的Java类型

       [order]:指定该查询主键SQL语句的执行顺序,相对于insert语句

       [last_insert_id]MySQL的函数,要配合insert语句一起使用

-->

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User">

    <selectKey keyProperty="id" resultType="int"order="AFTER">

       SELECT LAST_INSERT_ID()

    </selectKey>

    INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})

</insert>

 

1.5.3.3.5      主键返回之MySQL函数UUID(自己练习)

注意:使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

<!-- 添加用户之UUID主键返回 -->

<!--

    [uuid]MySQL的函数,生成的主键是35位的字符串,所以使用它时要修改id的类型为字符类型

    注意:

       1、此时order采用BEFORE,因为需要先生成出主键,再执行insert语句

       2、显式的给ID赋值

-->

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User">

    <selectKey keyProperty="id" resultType="string"order="BEFORE">

       SELECT UUID()

    </selectKey>

    INSERT INTO USER(id,username,sex,birthday,address) VALUES(#{id},#{username},#{sex},#{birthday},#{address})

</insert>

 

1.5.3.3.6      主键返回之Oracle序列返回(自己练习)

<!-- 添加用户之sequence返回 -->

<!--

    通过Oraclesequence获取主键方式与MySQLuuid方式基本一致 

-->

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User">

    <selectKey keyProperty="id" resultType="int"order="BEFORE">

       SELECT user_seq.nextval() FROM dual

    </selectKey>

    INSERT INTO USER(id,username,sex,birthday,address) VALUES(#{id},#{username},#{sex},#{birthday},#{address})

</insert>

1.5.3.4       删除用户
1.5.3.4.1      编写映射文件

<!-- 根据ID删除用户 -->

<delete id="deleteUser"parameterType="int">

    DELETE FROM USER WHERE id= #{id}

</delete>

1.5.3.4.2      加载映射文件

已配置,此处无需再次配置。

1.5.3.4.3      编写测试程序

@Test

public void deleteUserTest() throws Exception{

    // 1、读取配置文件

    String resource = "SqlMapConfig.xml";

    InputStream inputStream = Resources.getResourceAsStream(resource);

    // 2、根据配置文件创建SqlSessionFactory

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

              .build(inputStream);

    // 3SqlSessionFactory创建SqlSession

    SqlSession sqlSession = sqlSessionFactory.openSession();

    // 4SqlSession执行statement,并返回映射结果

    // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

    // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

    sqlSession.delete("test.deleteUser", 30);

      

    //切记:增删改操作时,要执行commit操作

    sqlSession.commit();

 

    // 5、关闭SqlSession

    sqlSession.close();

}

 

1.5.3.5       修改用户
1.5.3.5.1      编写映射文件

<!-- 根据传入的用户信息修改用户 -->

<update id="updateUser"parameterType="cn.itcast.mybatis.po.User">

    UPDATE USER SET username = #{username},sex=#{sex}WHERE id=#{id}

</update>

 

1.5.3.5.2      加载映射文件

已配置,此处无需再次配置。

1.5.3.5.3      编写测试程序

@Test

public void updateUserTest() throws Exception{

    // 1、读取配置文件

    String resource = "SqlMapConfig.xml";

    InputStream inputStream = Resources.getResourceAsStream(resource);

    // 2、根据配置文件创建SqlSessionFactory

    SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);

    // 3SqlSessionFactory创建SqlSession

    SqlSession sqlSession = sqlSessionFactory.openSession();

    // 4SqlSession执行statement,并返回映射结果

      

    //构建user参数,没有赋值的属性采取默认值

    User user = new User();

    user.setId(28);

    user.setUsername("东哥11");

    user.setAddress("清河宝盛西里");

      

    // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

    // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

    sqlSession.update("test.updateUser", user);

      

    //切记:增删改操作时,要执行commit操作

    sqlSession.commit();

 

    // 5、关闭SqlSession

    sqlSession.close();

}

 

1.6  小结

1.6.1  parameterType和resultType

parameterType指定输入参数的java类型,可以填写别名或Java类的全限定名。

resultType指定输出结果的java类型,可以填写别名或Java类的全限定名。

1.6.2  #{}和${}

#{}:相当于预处理中的占位符?。

#{}里面的参数表示接收java输入参数的名称。

#{}可以接受HashMap、简单类型、POJO类型的参数。

当接受简单类型的参数时,#{}里面可以是value,也可以是其他。

#{}可以防止SQL注入。

${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。

${}会引起SQL注入,所以要谨慎使用。

${}可以接受HashMap、简单类型、POJO类型的参数。

当接受简单类型的参数时,${}里面只能是value。

1.6.3  selectOne和selectList

selectOne:只能查询0或1条记录,大于1条记录的话,会报错:

selectList:可以查询0或N条记
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值