mybaits学习笔记之二
mybaits学习过程及项目需求分析
需求
- 通过id查询用户
- 通过名称模糊查询用户
- 插入用户信息
- 更新用户信息
- 删除用户信息
通过id查询用户
创建数据库作查询
优化后的数据库连接池放于单独的文件以便修改操作,学习中自己注意到,url中要正确填写数据库表名
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybaits?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=354719
创建User类
User.java类用于将数据库中的信息映射为java对象,set,get,toString方法自动生成
public class User {
private int id;
private String name;
private String sex;
private Date birthday;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address
+ "]";
}
}
创建User.xml文件对数据库进行操作,为核心
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="test">
<!-- 在映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过select执行数据库查询
id:标识映射文件中的sql
将sql语句封装到mappedStatement对象中,所以将id称为Statement的id
parameterType:指定输入参数的类型,这里指定int型
#{}表示一个占位符号
#{id}:其中的id表示接收输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意
可以value或其他名称
resultType:指定sql输出结果所映射的java对象类型,select指定resultType表示将单条记录映射成java对象
-->
<select id="findUserById" parameterType ="int" resultType="user">
SELECT * FROM USER WHERE id=#{id}
</select>
<!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定的就是单条记录所映射的Java对象类型
${}:拼接字符串,但是会造成sql注入风险
-->
<select id = "findUserByName" parameterType = "String" resultType = "user">
SELECT * FROM USER WHERE name LIKE #{name}
</select>
<!-- 添加用户信息
parameterType:指定输入参数类型是pojo(包括用户信息)
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybaits通过OGNL获取对象的属性值
-->
<insert id="insertUser" parameterType = "user" >
<!-- 将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID():得到insert进去记录的主键值,只适用于自增主键
KeyProperty:将查询到主键值设置到parameterType指定的对象的那个属性
order:LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定LAST_INSERT_ID()结果类型
-->
<selectKey keyProperty = "id" order="AFTER" resultType = "Integer">
SELECT LAST_INSERT_ID()
</selectKey>
<!-- 非主键的id获取方式
使用mysql的uuid()生成主键
执行过程:
首先通过uuid()得到主键,将主键设置到user对象的id属性中
其次在insert执行时,从user对象中取出id属性值
<selectKey keyProperty = "id" order = "BEFORE" resultType = "String">
SELECT uuid()
</selectKey>
insert into user(id,name,birthday,sex,address) value(#{id},#{name},#{birthday},#{sex},#{address})
-->
insert into user(name,birthday,sex,address) value(#{name},#{birthday},#{sex},#{address})
</insert>
<!-- 删除用户
根据id删除用户,需要输入id值
-->
<delete id = "deleteUser" parameterType = "Integer">
delete from user where id = #{id}
</delete>
<!-- 更新用户
分析:
需要传入用户的id
需要传入用户的更新信息
parameterType指定user对象,包括id和更新信息,注意:id必须存在
#{id}:从输入的usr对象中获取id属性值
-->
<update id = "updateUser" parameterType ="user">
update user set name=#{name},birthday=#{birthday},sex=#{sex},address=#{address}
where id = #{id}
</update>
</mapper>
在SqlMapConfig.xml中进行加载映射文件(很重要)
优化方法将在以后的学习中记录
<!-- 加载映射文件 -->
<mappers>
<!-- 通过resource方法加载单个映射文件 -->
<!-- 通过mapper接口加载
规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中(一个包中且同名)
上边规范的前提是:使用的是mapper代理方法
-->
<mapper class = "com.shagou.mybaits.mapper.UserMapper"/>
<!-- 批量加载
指定mapper接口的包名,mybaits自动扫描
规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中(一个包中且同名)
上边规范的前提是:使用的是mapper代理方法
-->
<!-- <package name = "com.shagou.mybaits.mapper"/> -->
<mapper resource="sqlmap/User.xml"/>
<!-- 很重要 -->
<!-- <mapper resource="mapper/UserMapper.xml"/> -->
</mappers>
创建java类进行测试
- 注意:若方法对数据库中的数据进行了更改之类的操作,提交事务必不可少,sqlSession.commit();
- 注意:测试方法结束后记得关闭资源,sqlSession.close();
public class MybaitsFirst {
@Test
public void findUserByIdTest() throws IOException{
//mybaits配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybaits的配置文件信息
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("test.findUserById",1);
System.out.println(user);
//释放资源
sqlSession.close();
}
//根据用户名称模糊查询用户列表
@Test
public void findUserByName() throws IOException {
//mybaits配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybaits的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//list中的user和映射文件中的resultType所指定的类型一致
List<User> list = sqlSession.selectList("test.findUserByName","%小明%");
System.out.println(list);
sqlSession.close();
}
//添加用户信息
@Test
public void insertUser() throws IOException {
//mybaits配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybaits的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//插入用户对象
User user = new User();
user.setName("陈三愣子");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("北京");
sqlSession.insert("test.insertUser",user);
//提交事务
sqlSession.commit();
//获取用户信息主键
System.out.println(user.getId());
//关闭会话
sqlSession.close();
}
//根据id删除用户信息
@Test
public void deleteUser() throws IOException {
//mybaits配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybaits的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//传入id删除用户
sqlSession.delete("test.deleteUser",8);
//提交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
}
//更新用户信息
@Test
public void updateUser() throws IOException {
//mybaits配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybaits的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//更新用户对象,必须设置id
User user = new User();
user.setId(4);
user.setName("刘晓军");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("上海");
sqlSession.insert("test.updateUser",user);
//提交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
}
}