MyBatis学习day2-通过sqlSession文件进行增删改查操作
上来就是一手紧接上文-----解释一下上篇博客创建的各类文件都有什么用处( ̄_, ̄ )怎么说
MyBatis基本文件构成及运行原理
主配置文件sqlMapConfig.xml
头部的文件类型以及约束暂且不说。
<?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">
environments标签内的任务主要是建立数据库的连接以及驱动的加载,如下(类似于JDBC中的Connection对象的建立)
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--使用连接池连接数据库-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm_mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
mappers标签里存放的是各种映射文件的路径,而映射文件的作用就是承载sql文件,完成各种sql操作
映射文件Mapper.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">
映射文件中的主要标签是mapper,其中包含各种sql语句。mapper标签有一个namespace属性,可理解为一种索引,当需要用到其中的sql语句时要通过namespace值指定,如下代码
<mapper namespace="Mapper1">
<select id="select1">
select * from tablename
</select>
</mapper>
若要在Java代码中应用上述select标签下的语句,就需要session.select(“Mapper1.select1”);执行
*session的用法后面会讲到。
运行原理
既然已经知道了主配置文件和映射文件的作用,接下来就来看看他们是如何与Java代码产生联系的。
首先我们要先创建一个SqlSessionFactoryBuilder实例,这个对象有什么用呢? 他可以通过读入主配置文件流来建立一个SqlSessionFactory,用于生产SqlSession对象,然后再通过获得的SqlSession执行各个映射文件中的sql语句。看到session我们可以回想到曾经在学习web相关知识的时候我们提到过在整个客户端与服务器之间建立链接并交换信息的过程称为一个session,当客户端关闭与服务器的链接,这个session也就结束了。同样的,Sqlsession也是建立了一个桥梁,我们可以通过它对数据库进行操作,Sqlsession关闭的时候我们就无法从数据库获取信息了。总结如下
基本增删改查操作
知道了运行原理之后我们就尝试着做一些曾经学习JDBC时的一些基本数据库操作,首先在src下创建包com.mybatis.test用于存放测试用例。再在包下创建一个java文件用于本次案例测试(随便去个名字HelloMyBatis)
创建好文件之后我们在测试文件中创建一个@Test测试方法test()用于测试(也可以用main,@Test需要设置JUnit4包依赖)。接着根据上述原理,我们一步步操作,建立一个SQLSession,具体代码如下:
@Test
public void test() throws IOException {
//读取配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//生成sqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//创建sqlSessionFactory
SqlSessionFactory factory=builder.build(in);
//生产一个sqlSession
SqlSession session=factory.openSession();
}
建立好链接以后,我们还需要给映射文件的mapper标签中的namespace属性赋值,用于标记该mapper标签,方便查询的时候寻找,如在UserMapper.xml文件中给mapper标签加上namespace=“UserMapper”,如下
之后我们就可以用session调用映射文件中的sql语句了,我们来尝试一下。
1.查询数据
对应select标签
a)条件查询
需求:根据记录的u_id属性查找数据
实现如下,其中,标签id用于充当session的内部方法的参数,parameterType属性规定sql语句的备用参数类型,resultType规定了返回值的类型,这里选择了User类,mybatis会直接将记录的值对应赋值给User对象的成员变量并返回一个User实例。
<!--UserMapper.xml-->
<select id="selectUserById" parameterType="Integer" resultType="com.mybatis.beans.User">
select * from user where u_id=#{id}
</select>
//HelloMyBatis.java
//参数:要操作的sql语句,sql语句的参数
User user=session.selectOne("UserMapper.selectUserById",1);
System.out.println(user);
sql语句中的参数由#{形参名}来表示,值得注意的是
以这种方式传入的参数都会自动被单引号包裹,如以上例子组成的sql语句为:
select * from user where u_id='1’
查询结果:
b)模糊搜索(集合返回)
我们的mysql语句除了用确定的列名确定的值来查找确定的记录意外,还可以用like关键字进行模糊搜索,如下列代码,我们要找出用户名中带“王”字的记录:
<select id="selectUserByName" parameterType="String" resultType="com.mybatis.beans.User">
select * from user where u_username like "%${value}%"
</select>
List<User> list=session.selectList("UserMapper.selectUserByName","王");
for(User u:list){
System.out.println(u);
}
查询结果如下:
这里需要注意的是,${value}用于字符串拼接,是直接把string的双引号去掉放进去的,即最终sql语句为:
select * from user where u_username like “%王%”;
这里的参数名必须为value,否则自己随便写会出错,具体原因见https://www.cnblogs.com/orac/p/6726323.html
但是我们知道,用字符串连接的方式传参很容易被不法分子用sql注入破解,所以我们可以用下面这种方式
<select id="selectUserByName" parameterType="String" resultType="com.mybatis.beans.User">
select * from user where u_username like "%"#{username}"%"
</select>
这样子最终的sql语句为
select * from user where u_username like “%” ‘王’ “%”
2.插入数据
如要在表中插入数据,则需要用到insert标签。案例中我们需要插入一条包含用户名、密码、性别、城市id、注册时间的记录,这些参数的类型各不相同,而传入不同类型参数是我们可以直接传入一个包含这些参数的类,并且要让sql语句中的参数名要与类中的成员变量名一致,这样mybatis才能帮我们完成填充。具体实现方法如下
<insert id="insertUser" parameterType="com.mybatis.beans.User">
insert into user values (null,#{u_username},#{u_password},#{u_sex},#{u_createTime},#{u_cid});
</insert>
User u=new User();
u.setU_username("Ame");//阿么老粉了
u.setU_password("123456");
u.setU_sex("1");
u.setU_cid(1);
u.setU_createTime(new Date());
session.insert("UserMapper.insertUser",u);
session.commit();
执行结果
注:所有能让数据表发生变化的操作都需要session.commit()之后才有效;
3.根据其他列名修改记录
对应的标签为update,其他过程与上述操作相同,如下
<update id="updateUser" parameterType="com.mybatis.beans.User">
update user set u_username=#{u_username} where u_id=#{u_id}
</update>
User u=new User();
u.setU_id(15);
u.setU_username("王淳煜");
session.update("updateUser",u);
session.commit();
执行结果
4.删除数据
对应的标签为delete,其他过程与上述操作相同,如下
<delete id="deleteUser" parameterType="Integer">
delete from user where u_id=#{id}
</delete>
User u=new User();
u.setU_id(15);
session.delete("deleteUser",u.getU_id());
session.commit();
执行结果
好!结束!╰( ̄ω ̄o)