小白学习Java第18天(上):mybatis
之前对于javaweb开发,在写dao层的是非常麻烦,而且有个不好就是你的SQL语句是和代码捆绑在一起,耦合性很强,因此对于持久层开发我们更希望有一个框架去代理它。详细我们可以查看mybatis的中文文档https://mybatis.net.cn/getting-started.html
1.创建一个SqlSession的对象
XML文件
下面是代码的实现:
package com.xcl.MybatisUtils;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 java.io.IOException;
import java.io.InputStream;public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory = null;static {try {//获取工厂对象sqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}//有了工厂对象,就可以获取SqlSession对象了,有了这个就可以进行操作,就相当于connectionpublic static SqlSession getSqlSession() {SqlSession sqlSession = sqlSessionFactory.openSession();return sqlSession;}
}
下面我们就进行演示一下增删改查是什么:
首先创建相应的接口方法:
package com.xcl.dao;import com.xcl.pojo.User;import java.util.List;public interface UserMapper {/** 登录验证、查询密码、查询信息*/List<User> getList();User getUserById(int id);int addUser(User user);int updateUser(User user);int deleteUser(int id);}
然后进行xml文件配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--首先就是进行接口的绑定,原来就是用一个类进行实现UserDaoImp,但是现在就用接口与xml进行绑定就可以-->
<mapper namespace="com.xcl.dao.UserMapper">
<!--查询所有的--><select id="getList" resultType="com.xcl.pojo.User">select * from stusystem.user</select><!--查询指定的id--><select id="getUserById" resultType="com.xcl.pojo.User" parameterType="int">select * from stusystem.user where user_id=#{id}</select><!--添加对象--><insert id="addUser" parameterType="com.xcl.pojo.User">insert into stusystem.user(user_num,user_name,password,phone,role_id) values(#{user_num},#{user_name},#{password},#{phone},#{role_id})</insert><!--修改对象--><update id="updateUser" parameterType="com.xcl.pojo.User">update stusystem.user set user_num=#{user_num},user_name=#{user_name},password=#{password},phone=#{phone},role_id=#{role_id} where user_id=#{user_id}</update><!--删除对象--><delete id="deleteUser" parameterType="int">delete from stusystem.user where user_id=#{id}</delete>
</mapper>
然后就是进行测试:
package com.xcl;import com.xcl.MybatisUtils.MybatisUtils;
import com.xcl.dao.UserMapper;
import com.xcl.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class daoUserMapperTest {@Testpublic void test1() {//获得操作sql语句的对象SqlSession sqlSession = MybatisUtils.getSqlSession();//执行sql语句,给他得到了一个实体类userDaoUserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userLsit = userMapper.getList();for (User user : userLsit) {System.out.println(user);}//关闭sqlSessionsqlSession.close();}@Testpublic void test2() {//获得操作sql语句的对象SqlSession sqlSession = MybatisUtils.getSqlSession();//执行sql语句,给他得到了一个实体类userDaoUserMapper userMapper = sqlSession.getMapper(UserMapper.class);User userById = userMapper.getUserById(3);System.out.println(userById);//关闭sqlSessionsqlSession.close();}@Testpublic void test3() {//获得操作sql语句的对象SqlSession sqlSession = MybatisUtils.getSqlSession();//执行sql语句,给他得到了一个实体类userDaoUserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User(0,"152818", "向传龙", "123456", "123456789", "1");int i = userMapper.addUser(user);if (i > 0){System.out.println("添加成功");//提交事务sqlSession.commit();}else {System.out.println("添加失败");}//关闭sqlSessionsqlSession.close();}@Testpublic void test4() {//获得操作sql语句的对象SqlSession sqlSession = MybatisUtils.getSqlSession();//执行sql语句,给他得到了一个实体类userDaoUserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User(42,"11668", "小李文", "123456", "123456789", "1");int i = userMapper.updateUser(user);if (i > 0){System.out.println("修改成功");//提交事务sqlSession.commit();}else {System.out.println("修改失败");}}@Testpublic void test5() {//获得操作sql语句的对象SqlSession sqlSession = MybatisUtils.getSqlSession();//执行sql语句,给他得到了一个实体类userDaoUserMapper userMapper = sqlSession.getMapper(UserMapper.class);int i = userMapper.deleteUser(42);if (i > 0){System.out.println("删除成功");//提交事务sqlSession.commit();}else {System.out.println("删除失败");}}
}
自此上述增删改查就可以用mybatis进行解决!!
【有一个小的知识点就是,我们在进行查询的时候,一个小的知识点就是我想进行模糊查询,而不是输入全部我才能查询出来】
xml实现:
<!-- 进行模糊查询--><select id="getLikeList" resultType="com.xcl.pojo.User" parameterType="String">select * from stusystem.user where user_name like concat('%',#{name},'%')</select>
@Testpublic void test6() {//获得操作sql语句的对象SqlSession sqlSession = MybatisUtils.getSqlSession();//执行sql语句,给他得到了一个实体类userDaoUserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userLsit = userMapper.getLikeList("李");for (User user : userLsit) {System.out.println(user);}//关闭sqlSessionsqlSession.close();}
2.配置(这个是比较常用还有一些就是看那个mybatis中文文档就行)
2.1properties
首先第一步我就不太喜欢里面驱动写死,因此我们在外面写一个配置文件properties文件,然后进行读取!
2.2然后就是设置别名
一种就是对于实体类直接起个别名
第二种就是直接扫描包,然后就是实体类,别名就用小写就行
<typeAliases><typeAlias type="com.xcl.pojo.User" alias="User"/><package name="com.xcl.pojo.User"/></typeAliases>
3.结果集映射
背景就是,不知道你们有没有遇到过就是你使用mybatis的时候你的数据库字段column和实体类的property属性对不上,那怎么办呢?
和它一样就可能对得上,但是不一样就可以就是为空!!!
解决方案就是我们需要在我们UserMapper里面xml文件进行配置,结果集进行改变
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--首先就是进行接口的绑定,原来就是用一个类进行实现UserDaoImp,但是现在就用接口与xml进行绑定就可以-->
<mapper namespace="com.xcl.dao.UserMapper">
<!-- 结果集映射--><resultMap id="UserMap" type="User">
<!-- column数据库中的字段,property实体类中的属性--><id property="userID" column="user_id"/><id property="userNum" column="user_num"/><id property="userName" column="user_name"/><id property="password" column="password"/><id property="phone" column="phone"/><id property="roleID" column="role_id"/></resultMap><!--查询所有的--><select id="getList" resultMap="UserMap">select * from stusystem.user</select>
</mapper>
小结一下就是:
mybatis就是需要配置两个xml文件(大的xml文件就是进行数据库的连接,小的xml文件就是对于sql语句进行操作,两者之间是需要进行绑定的,然后就是就是对于SqlSession进行创建。我们手首先是对于SqlSessionFactory创建,然后就是SqlSession进行创建。。。)