Mybatis学习(三)

4.Mybatis入门程序

4.1 需求

对数据库中用户的数据进行增删改查操作

1.根据用户id查询用户信息

2.根据用户名称模糊查询用户列表

3.添加用户

4.修改用户

5.删除用户

4.2 准备环境

数据库:mysql 5.x    mybatis:3.2.7     ide的话,根据个人喜好就行了(本人写测试程序都是用的eclipse)

所需的jar包和sql文件      

http://pan.baidu.com/s/1kVdjDn5

4.3 代码开发

4.3.1 创建po类

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

 1 package com.jxdd.mybatis;
 2 
 3 import java.util.Date;
 4 
 5 public class User {
 6     private int id;
 7     private String username;
 8     private String sex;
 9     private Date birthday;
10     private String address;
11     public int getId() {
12         return id;
13     }
14     public void setId(int id) {
15         this.id = id;
16     }
17     public String getUsername() {
18         return username;
19     }
20     public void setUsername(String username) {
21         this.username = username;
22     }
23     public String getSex() {
24         return sex;
25     }
26     public void setSex(String sex) {
27         this.sex = sex;
28     }
29     public Date getBirthday() {
30         return birthday;
31     }
32     public void setBirthday(Date birthday) {
33         this.birthday = birthday;
34     }
35     public String getAddress() {
36         return address;
37     }
38     public void setAddress(String address) {
39         this.address = address;
40     }
41     @Override
42     public String toString() {
43         return "User [id=" + id + ", username=" + username + ", sex=" + sex
44                 + ", birthday=" + birthday + ", address=" + address + "]";
45     }
46     
47 }
User POJO

4.3.2 创建SqlMapConfig.xml配置文件

在classpath下,创建SqlMapConfig.xml文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6 <!-- 配置mybatis的环境信息 -->
 7 <environments default="development">
 8     <environment id="development">
 9         <!-- 配置JDBC事务控制,由mybatis进行管理 -->
10         <transactionManager type="JDBC"></transactionManager>
11         <!-- 配置数据源,采用dbcp连接池 -->
12         <dataSource type="POOLED">
13             <property name="driver" value="com.mysql.jdbc.Driver"/>
14             <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8"/>
15             <property name="username" value="root"/>
16             <property name="password" value="root"/>
17         </dataSource>
18     </environment>
19 </environments>
SqlMapConfig

4.3.3 创建 User.xml映射文件

(1)根据用户id来查询用户信息

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper    
 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    
 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!-- namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离
 6     注意:使用mapper代理开发时,namespace有特殊且重要的作用
 7  -->
 8 <mapper namespace="test">
 9     <!-- 根据用户ID,查询用户信息 -->
10     <!-- 
11         [id]:statement的id,要求在命名空间内唯一  
12         [parameterType]:入参的java类型
13         [resultType]:查询出的单条结果集对应的java类型
14         [#{}]: 表示一个占位符?
15         [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义
16      -->
17     <select id="findUserById" parameterType="int" resultType="com.jxdd.mybatis.po.User">
18         SELECT * FROM USER WHERE id = #{id}
19     </select>
20 </mapper>
User.xml

4.3.4 记载映射文件

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

1 <!-- 加载mapper -->
2 <mappers>
3     <mapper resource="sqlmap/User.xml"/>
4 </mappers>

4.3.5 编写测试程序

 1 package com.jxdd.mybatis.test;
 2 
 3 import java.io.InputStream;
 4 
 5 import org.apache.ibatis.io.Resources;
 6 import org.apache.ibatis.session.SqlSession;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 9 import org.junit.Test;
10 
11 import com.jxdd.mybatis.po.User;
12 
13 public class MybatisTest1 {
14     @Test
15     public void findUserByIdTest() throws Exception{
16         //1.读取配置文件
17         InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
18         //2.根据配置文件创建SqlSessionFactory
19         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
20         //3.SqlSessionFactory创建SqlSession
21         SqlSession sqlSession = sqlSessionFactory.openSession();
22         //4.SqlSession执行statement,并返回映射结果
23         //第一个参数:statement的id,建议: namespace.statementId(确保唯一)
24         //第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致
25         User user = sqlSession.selectOne("findUserById", 1);
26         //打印输出结果集
27         System.out.println(user);
28         //5.关闭SqlSession
29         sqlSession.close();
30     }
31     
32 }
test

4.3.6 运行输出结果

 

 

 

(2)根据用户名称模糊查询用户信息列表

4.3.7 编写映射文件

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

 1 <!-- 根据用户名称模糊查询用户信息列表 -->
 2     <!-- 
 3             [${}]:表示拼接SQL字符串
 4              [${value}]:表示要拼接的是简单类型参数。
 5              注意:
 6             1、如果参数为简单类型时,${}里面的参数名称必须为value 
 7             2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}
 8     -->
 9     <select id="findUsersByName" parameterType="String" resultType="com.jxdd.mybatis.po.User">
10         SELECT * FROM USER WHERE username LIKE '%${value}%'
11     </select>

4.3.8 编写测试程序

 1 @Test
 2     public void findUsersByNameTest() throws Exception{
 3         //1.读取配置文件
 4         InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
 5         //2.根据配置文件创建SqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //3.SqlSessionFactory创建SqlSession
 8         SqlSession sqlSession = sqlSessionFactory.openSession();
 9         //4.SqlSession执行statement,并返回映射结果
10         //第一个参数:statement的id,建议: namespace.statementId(确保唯一)
11         //第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致
12         List<User> users = sqlSession.selectList("findUsersByName", "小明");
13         //打印输出结果集
14         System.out.println(users);
15         //5.关闭SqlSession
16         sqlSession.close();
17     }

如果执行成功的话,不出意外会出现三条数据

 

(3)添加用户

4.3.9 编写映射文件

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

1 <!-- 添加用户 -->
2     <!-- 如果主键的值是通过MySQL自增机制生成的,那么我们此处不需要再显示的给ID赋值 -->
3     <insert id="insertUser" parameterType="com.jxdd.mybatis.po.User">
4         INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
5     </insert>

 

4.3.10 编写测试程序

 1 @Test
 2     public void insertUserTest() throws Exception{
 3         //1.读取配置文件
 4         InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
 5         //2.根据配置文件创建SqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //3.SqlSessionFactory创建SqlSession
 8         SqlSession sqlSession = sqlSessionFactory.openSession();
 9         //4.SqlSession执行statement,并返回映射结果
10         //构建user参数,没有赋值的属性采取默认值
11         User user = new User();
12         user.setUsername("qt");
13         user.setAddress("北京市海淀区");
14         // 第一个参数:statement的id,建议:namespace.statementId(确保唯一)
15         // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致
16         sqlSession.insert("insertUser", user);
17         //切记:增删改操作时,要执行commit操作
18         sqlSession.commit();
19         //5.关闭SqlSession
20         sqlSession.close();
21     }
test3

去数据库,看看到底有没有添加成功

 

 

(4)修改用户(根据用户id修改用户信息)

4.3.11编写映射文件

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

1 <!-- 编辑用户 -->
2 <update id="updateUser" parameterType="com.jxdd.mybatis.po.User">
3     UPDATE USER SET username=#{username},address=#{address} WHERE id=#{id}
4 </update>

4.3.12 编写测试程序

 1 @Test
 2     public void updateUserTest() throws Exception{
 3         //1.读取配置文件
 4         InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
 5         //2.根据配置文件创建SqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //3.SqlSessionFactory创建SqlSession
 8         SqlSession sqlSession = sqlSessionFactory.openSession();
 9         //4.SqlSession执行statement,并返回映射结果
10         //构建user参数,没有赋值的属性采取默认值
11         User user = new User();
12         user.setId(27);
13         user.setUsername("qtqt");
14         user.setAddress("北京市大兴区");
15         // 第一个参数:statement的id,建议:namespace.statementId(确保唯一)
16         // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致
17         sqlSession.update("updateUser", user);
18         //切记:增删改操作时,要执行commit操作
19         sqlSession.commit();
20         //5.关闭SqlSession
21         sqlSession.close();
22     }
test4

去数据库,看看到底有没有添加成功

 

 

(5)删除用户(根据用户id删除用户)

4.3.11编写映射文件

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

1 <!-- 删除用户 -->
2 <delete id="deleteUser" parameterType="int">
3     DELETE FROM USER WHERE id=#{id}
4 </delete>

4.3.13 编写测试程序

 1 @Test
 2     public void deleteUserTest() throws Exception{
 3         //1.读取配置文件
 4         InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
 5         //2.根据配置文件创建SqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //3.SqlSessionFactory创建SqlSession
 8         SqlSession sqlSession = sqlSessionFactory.openSession();
 9         //4.SqlSession执行statement,并返回映射结果
10         // 第一个参数:statement的id,建议:namespace.statementId(确保唯一)
11         // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致
12         sqlSession.delete("deleteUser", 27);
13         //切记:增删改操作时,要执行commit操作
14         sqlSession.commit();
15         //5.关闭SqlSession
16         sqlSession.close();
17     }
test5

如果执行成功,可以去数据库看一下是否还有新增加的那条数据

 

 

4.4 主键返回---MySql自增主键

思路

MySql自增主键,是指在insert之前MySql会自动生成一个自增主键.

我们可以通过MySql的函数获取刚插入的自增主键:LAST_INSERT_ID()

这个函数是在insert语句之后与调用

4.4.1 编写映射文件

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

 1 <!-- 添加用户之自增主键返回(selectKey方式) -->
 2     <!-- 
 3             [selectKey标签]:通过select查询来生成主键
 4             [keyProperty]:指定存放生成主键的属性
 5             [resultType]:生成主键所对应的Java类型
 6             [order]:指定该查询主键SQL语句的执行顺序,相对于insert语句
 7             [last_insert_id]:MySQL的函数,要配合insert语句一起使用
 8     -->
 9     <insert id="insertUserReturnId" parameterType="com.jxdd.mybatis.po.User">
10         <selectKey keyProperty="id" resultType="int" order="AFTER">
11             SELECT LAST_INSERT_ID()
12         </selectKey>
13         INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
14     </insert>

4.4.2 编写测试程序

 1 @Test
 2     public void insertUserReturnIdTest() throws Exception{
 3         //1.读取配置文件
 4         InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
 5         //2.根据配置文件创建SqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //3.SqlSessionFactory创建SqlSession
 8         SqlSession sqlSession = sqlSessionFactory.openSession();
 9         //4.SqlSession执行statement,并返回映射结果
10         //构建user参数,没有赋值的属性采取默认值
11         User user = new User();
12         user.setUsername("qt");
13         user.setAddress("北京市海淀区");
14         // 第一个参数:statement的id,建议:namespace.statementId(确保唯一)
15         // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致
16         sqlSession.insert("insertUserReturnId", user);
17         //切记:增删改操作时,要执行commit操作
18         sqlSession.commit();
19         //打印返回结果
20         System.out.println(user.getId());
21         //5.关闭SqlSession
22         sqlSession.close();
23     }
test6

4.5 主键返回---MySql函数UUID

 1 <!-- 添加用户之UUID主键返回 -->
 2     <!-- 
 3         [uuid]:MySQL的函数,生成的主键是35位的字符串,所以使用它时要修改id的类型为字符类型
 4         注意:
 5             1、此时order采用BEFORE,因为需要先生成出主键,再执行insert语句
 6             2、显式的给ID赋值
 7     -->
 8     <insert id="insertUserReturnId" parameterType="com.jxdd.mybatis.po.User">
 9         <selectKey keyProperty="id" resultType="string" order="BEFORE">
10             SELECT UUID()
11         </selectKey>
12         INSERT INTO USER(id,username,sex,birthday,address) VALUES (#{id},#{username},#{sex},#{birthday},#{address})
13     </insert>

4.6主键返回---Oracle序列返回

 

1 <!-- 
2         通过Oracle的sequence获取主键方式与MySQL的uuid方式基本一致    
3     -->
4     <insert id="insertUserReturnId" parameterType="com.jxdd.mybatis.po.User">
5         <selectKey keyProperty="id" resultType="int" order="BEFORE">
6             SELECT user_seq.nextval() FROM dual
7         </selectKey>
8         INSERT INTO USER(id,username,sex,birthday,address) VALUES (#{id},#{username},#{sex},#{birthday},#{address})
9     </insert>

 

4.7小结

1.parameterType和resultType

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

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

2.#{} 和 ${}

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

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

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

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

  #{}可以防止sql注入

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

  ${}会引起sql注入,所以要慎用.

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

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

3.selectOne和selectList

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

selectList:可以查询0或N条记录

 

posted @ 2016-12-01 16:20  qttttt  阅读(213)  评论(1)    收藏  举报