1. 映射文件
- 映射文件命名:User.xml
- mapper代理开发映射文件名:XXXMapper.xml (UserMapper.xml、ItemsMapper.xml)
- 在映射文件中配置sql语句。
2. 映射文件具体配置
- 我们需要将查询得到的结果映射为一个对象,创建一个包(com.chinglee.mybatis.pojo)里面存放所有的对象类型。
- 在pojo包中创建User类对应User表
package com.chinglee.mybatis.pojo;
import java.util.Date;
/**
* Created by Administrator on 2017/10/18 0018.
*/
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 在sqlmap中创建User.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">
<!--namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注:使用mapper代理方法开发,namespace有特殊作用
-->
<mapper namespace="user">
<!--映射文件中配置很多的sql语句-->
<!--需求:通过id查询用户表的记录-->
<!--通过select执行数据库查询
id:标识映射文件的sql
parameterType:指定输入参数类型,这里输入的id是int型
#{}表示占位符
#{id}其中的id表示接收输入的参数,参数名称就是id
resultType:指定查询结果映射的java对象类型,这里是单条对象
-->
<select id="findUserById" parameterType="int" resultType="com.chinglee.mybatis.pojo.User">
SELECT * FROM user WHERE id=#{id}
</select>
</mapper>
- 在SqlMapConfig.xml中加载映射文件
<!--加载映射文件-->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
3. 根据id查询用户代码实现
package com.chinglee.mybatis.first;
import com.chinglee.mybatis.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by Administrator on 2017/10/19 0019.
*/
public class MybatisFirst {
//根据id查询用户信息,得到一条记录结果
@Test
public void findUerByIdTest() throws IOException {
//mybatis配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过会化工厂得到sqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//通过sqlSession操作数据库
//第一个参数:映射文件中statement的id,等于namespace+"."+statement的id
//第二个参数:指定和映射文件中所匹配的parameterType类型的参数
//sqlSession.selectOne()结果就是与映射文件中所匹配的resultType类型的对象
User user=sqlSession.selectOne("user.findUserById",1);
System.out.println(user);
//释放资源
sqlSession.close();
}
}
4. 根据用户名模糊查询
- 在User.xml中添加查询
<!--根据用户名查询信息
resultType:指定的单条记录所映射的java对象类型
${}:表示拼接sql串,将接收到的参数不加任何修饰拼接在sql中。
使用${}拼接sql,引起sql注入
${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只能使用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.chinglee.mybatis.pojo.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
- 在MybatatisFirst.java类中添加方法
//根据用户名称模糊查询用户列表
@Test
public void findUserByNameTest() throws IOException {
//获取mybatis配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过会话工厂得到会话sqlsession
SqlSession sqlSession=sqlSessionFactory.openSession();
List<User> list=sqlSession.selectList("user.findUserByName","小明");
System.out.println(list);
sqlSession.close();
}
5. 添加用户
- 自增主键返回
User.xml添加statement
<!--
parameterType:指定输入参数类型是pojo
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
-->
<insert id="insertUser" parameterType="com.chinglee.mybatis.pojo.User">
<!--
将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,
只适用于自增主键
keyProperty:将查询到主键值设置到parameterType指定的对象的
哪个属性
order: SELECT LAST_INSERT_ID()相对于INSERT INTO user的执行顺序
指定结果类型 resultType="java.lang.Integer"
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(username,birthday,sex,address) VALUE (#{username},#{birthday},#{sex},#{address})
</insert>
在MybatisFirst类中加入addUserTest方法
//添加用户信息
@Test
public void addUserTest() throws IOException {
//获取mybatis配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过会话工厂得到会话sqlsession
SqlSession sqlSession=sqlSessionFactory.openSession();
//插入用户对象
User user=new User();
user.setUsername("王小军");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("河南郑州");
sqlSession.insert("user.insertUser",user);
//提交事务
sqlSession.commit();
System.out.println(user.getId());
//关闭会话
sqlSession.close();
}
- 非自增主键返回(使用uuid)
使用mysql的uuid()函数生成主键,需要修改id字段类型为String,长度设置为35
<!--非自增主键
使用musql的uuid生成主键
执行过程:
首先通过uuid()得到主键,将主键设置到user对象的id属性中
其次在insert执行时,从user对象中取出id属性值
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT uuid()
</selectKey>
INSERT INTO user(id,username,birthday,sex,address) VALUE (#{id},#{username},#{birthday},#{sex},#{address})
-->
6. 删除用户
- 映射文件User.xml
<!--delete删除用户,根据id删除用户,需要输入id值-->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM user WHERE id=#{id};
</delete>
- 测试类MybatisFirst.java
@Test
public void deleteUserTest() throws IOException {
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
sqlSession.delete("user.deleteUser",28);
//提交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
}
7. 更新用户
- 映射文件User.xml
<!--更新用户,传入id,传入用户的更新信息,parameterType指定user对象,注意id必须存在
#{id}表示更新user的id值
-->
<update id="updateUser" parameterType="com.chinglee.mybatis.pojo.User">
UPDATE user SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}WHERE id=#{id}
</update>
- java类
@Test
public void updateUserTest() throws IOException {
String resouce="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resouce);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=new User();
user.setId(29);
user.setUsername("王大军");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("河南郑州");
sqlSession.update("user.updateUser", user );
//提交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
}
8. 入门总结
parameterType:指定输入参数类型
resultType:指定查询结果映射的java对象类型
-
.#{}表示一个占位符,接收输入参数,类型可以是简单类型,pojo、hashmap。
- 如果接收简单类型,#{}中可以写成value或其他名称。
- .#{}接收pojo对象值,通过UGNL读取对象中的属性值。
-
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
- ${}接收输入参数,类型可以是简单类型,pojo,hashmap。
- 如果接收简单类型,${}中只能写成value
selectOne表示查询出的一条记录。如果使用selectone可以实现,使用selectList也可以实现。
selectList查询一个列表(多条记录)进行映射