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 }
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&characterEncoding=utf8"/> 15 <property name="username" value="root"/> 16 <property name="password" value="root"/> 17 </dataSource> 18 </environment> 19 </environments>
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>
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 }
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 }
去数据库,看看到底有没有添加成功

(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 }
去数据库,看看到底有没有添加成功

(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 }
如果执行成功,可以去数据库看一下是否还有新增加的那条数据
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 }

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条记录

浙公网安备 33010602011771号