之前的时候写过一篇关于mybatis插件--mybatis plus的文章:
我自己的博客平台发布之后,有小粉丝跟我说,现在刚开始学习Java,是不是可以不用学mybatis了直接学这个啊,听得我心里一阵后怕,总感觉自己带偏了他们的想法
其实我个人觉得,这不仅仅是他这种初学者,也是很多人的错误想法,就是觉得新的技术就是好的,不信?看这个,这也是一个初学者,在写代码的过程中遇到这样一个问题
原因,我直接上聊天记录吧
怎么样,这个问题简单吗?但是也凸显了一个问题,学习,尤其是开发这一行,真的不能激进,所以我借着今天的这个引子,整理今天的这份文章--mybatis,从最一开始的mybatis入门直到整合spring,并且附代码实现,刚开始学习的朋友可以实际操作一下,老牌程序员可以回顾一下当年的青葱岁月,哈哈哈哈哈
我们来看今天的正题吧
MyBatis前世
原生JDBC操作数据库的流程
加载驱动
获取链接 connection
获取statement
设置sql
给占位符 set值
执行sql,获取结果集
对结果集进行解析、封装
释放资源
原生的jdbc操作数据库的缺点:
频繁地进行获取链接、关闭链接,资源浪费。 数据库连接池
sql语句属于硬编码,维护不方便。并且需求变得可能性大,要经常地修改sql
占位符设置参数也属于硬编码,维护不方便
结果集解析过程也是硬编码,希望是能够自动地封装成我们自己开发的pojo对象中去
mybatis入门
mybatis 是一个持久层框架 ORM,他可以对jdbc的操作过程进行封装,使开发者只需关注sql本身,而无需去处理 注册驱动、获取链接、获取statement、结果集解析、资源释放等工作。
ORM :Object Ralational Mapping 对象关系映射
简单地说,是通过描述
对象和关系数据库之间的元数据的映射关系,将java中的对象持久化到关系数据库中。
mybatis配置
1、全局配置文件mybatis.xml(名字任意)
配置mybatis的运行环境,包括连接池、事务等。
2、配置映射文件(配置sql)mapper.xml
3、SqlSessionFactory(会话工厂,通过配置文件获取的)
创建SqlSession。
4、SqlSession(会话)
操作数据库。
5、Executor(执行器)
sqlSession是通过执行器来操作数据库的。
6、mapped Statement(底层封装对象)
对数据库的操作进行封装,包括sql、输入参数、输出结果。
支持的输入输出参数类型
java基本类型
hashmap
自定义pojo对象
简单的Mybatis入门程序
项目架构
jar包
log4j.properties
# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?><!--mybatis的运行环境
mybatis与Spring整合后就不需要了
--><!-- 事务--><!--数据库连接池-->
Users.java
publicclassUsers {privateStringusername;privateDatebirthday;privateStringsex;privateStringaddress;publicStringgetUsername() {returnusername; }publicvoidsetUsername(Stringusername) {this.username = username; }publicStringgetSex() {returnsex; }publicvoidsetSex(Stringsex) {this.sex = sex; }publicDategetBirthday() {returnbirthday; }publicvoidsetBirthday(Datebirthday) {this.birthday = birthday; }publicStringgetAddress() {returnaddress; }publicvoidsetAddress(Stringaddress) {this.address = address; }}
Users.mapper
<?xml version="1.0" encoding="UTF-8" ?><!--
namespace;命名空间
作用:分割sql
--><!--根据姓名查询用户信息--><!--
id用于标识映射文件中的sql,其实是statement的id
parameterType:参数类型
resultType:输出结果类型,单条结果的类型
#{}:占位符。如果为简单类型,则可以通过#{value}来取值,也可以通过#{任意名字}来取值
-->select * from users where id=#{id}<!--${}字符串拼接,不能防止sql注入-->/*传参为‘李%’*/ select * from users where username like #{value} /*传参为‘李’*/ /*select * from users where username like '${value}%'*/
UsersTest.java
package com.me.test;importcom.me.pojo.Users;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Before;importorg.junit.Test;importjava.io.IOException;importjava.io.InputStream;importjava.util.List;publicclassUsersTest{privateSqlSessionFactorysqlSessionFactory; @Beforepublicvoidinit()throwsIOException{//获取全局配置文件InputStreamin=Resources.getResourceAsStream("mybatis.xml");//获取SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(in); } @Testpublicvoid test()throwsIOException{//获取sqlSessionSqlSessionsqlSession=sqlSessionFactory.openSession();//执行sqlUsersuser=sqlSession.selectOne("UsersMapper.selectById",1);System.err.println(user.getUsername()); sqlSession.close(); } @Testpublicvoid test2(){SqlSessionsqlSession=sqlSessionFactory.openSession();List usersList=sqlSession.selectList("UsersMapper.selectByUserName","李%");/*List<Users> usersList=sqlSession.selectList("UsersMapper.selectByUserName","李");*/System.err.println(usersList);/*System.out.println(usersList.get(0).getUsername());
System.out.println(usersList.get(1).getUsername());*/}}
mybatis对数据库的常用操作
一、查询
select*fromuserswhereid=#{id} /*传参为‘李%’*/select*fromuserswhereusername like#{value}/*传参为‘李’*//*select * from users where username like '${value}%'*/
测试方法
@TestpublicvoidselectByUserName(){ SqlSession sqlSession=sqlSessionFactory.openSession(); List usersList=sqlSession.selectList("UsersMapper.selectByUserName","李%");/*List<Users> usersList=sqlSession.selectList("UsersMapper.selectByUserName","李");*/System.err.println(usersList);/*System.out.println(usersList.get(0).getUsername());
System.out.println(usersList.get(1).getUsername());*/}
二、新增
<!--添加用户信息-->insert into users(id,username,password,address,birthday,sex) values(#{id},#{username}, # {password},#{address},#{birthday},#{sex})insert into users(id,username,password,address,birthday,sex) values(#{id},#{username},# {password},#{address},#{birthday},#{sex})
测试方法
@TestpublicvoidaddUser(){ SqlSession sqlSession=sqlSessionFactory.openSession(); Users users=newUsers(4,"王五","123",newDate(),"男","北京");intres=sqlSession.insert("UsersMapper.addUser",users); sqlSession.commit(); sqlSession.close(); }@TestpublicvoidaddUser2(){ SqlSession sqlSession=sqlSessionFactory.openSession(); Users user=newUsers(5,"王五","123",newDate(),"男","北京");intres=sqlSession.insert("UsersMapper.addUser",user); System.err.println("res:"+res); System.err.println("users.getId:"+user.getId()); sqlSession.commit(); sqlSession.close(); }
三、修改
update userssetpassword=#{password},address=#{address} where id=#{id}
测试方法
@TestpublicvoidupdateUser(){ SqlSession sqlSession=sqlSessionFactory.openSession(); Users user=newUsers(); user.setPassword("newPass123456"); user.setAddress("济南"); user.setId(4);intres=sqlSession.update("UsersMapper.updateUser",user); sqlSession.commit(); sqlSession.close(); }
四、删除
/*这里是简单类型,# { value } 中的value可以任意写*/deletefrom users where id=#{id}
测试方法
@TestpublicvoiddeleteUser(){ SqlSession sqlSession=sqlSessionFactory.openSession();intres=sqlSession.delete("UsersMapper.deleteUser",5); System.err.println("res:"+res); sqlSession.commit(); sqlSession.close(); }
mybatis.xml的一些配置项
1、加载外部资源文件
2、起别名
<!--
起别名第一种方式
type:给哪个类起别名 alias:别名
--><!--<typeAlias type="com.me.pojo.Users" alias="user"></typeAlias>--><!--
起别名第二种方式:批量起别名
name:包,起的别名就是类名的全名,首字母大写、小写皆可
-->
3、SqlSessionFactory和SqlSession
//获取全局配置文件InputStream in= Resources.getResourceAsStream("mybatis.xml");//获取SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(in);//获取sqlSessionqlSession sqlSession=sqlSessionFactory.openSession();//执行sql
SqlSessionFactory:它是通过全局配置文件获取的,SqlSessionFactoryBuilder创建的。一旦它被创建,就会在程序的执行期一直存在,因此只需要一个实例。也就是说希望它是单例的。
SqlSession:作用是操作数据库,是线程不安全的。因而希望每个线程都有自己的sqlSession的实例。
4、工具类
package com.me.utils;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importjava.io.IOException;importjava.io.InputStream;publicclassMybatisUtils{privatestaticSqlSessionFactorysqlSessionFactory;static{try{//获取全局配置文件InputStreamin=Resources.getResourceAsStream("mybatis.xml");//获取SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(in); }catch(IOExceptione) { e.printStackTrace(); } }publicstaticSqlSessionFactorygetSqlSessionFactory(){returnsqlSessionFactory; }}
5、测试类
@TestpublicvoidselectById()throwsIOException{//获取sqlSessionSqlSession sqlSession= MybatisUtils.getSqlSessionFactory().openSession();//执行sqlUsers user=sqlSession.selectOne("UsersMapper.selectById",1); System.err.println(user.getUsername()); sqlSession.close(); }
Spring与Mybatis整合
mybatis:dao层,操作数据库,需要单例的SqlSessionFactory工厂。
spring:容器,管理对象。
可以将SqlSessionFactory、事务、连接池以及mapper的动态代理交给spring来做。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/spring-aop.xsd"><!--加载外部资源文件--><!--数据库连接池--><!--配置SqlSessionFactory,通过Spring来管理会话工厂--><!--配置数据源:因为要使用SqlSession操作数据库--><!--加载mybatis的全局配置文件--><!--<property name="configLocation" value="classpath:mybatis.xml"></property>--><!--Spring起别名--><!--mapper动态代理 通过扫描批量加载mapper接口来创建代理bean,这些bean的名字是接口名字(首字母小写)--><!--指定mapper接口的包路径--><!--注解扫描-->
UsersService.java
publicinterfaceUsersService{publicUsersselectById(intid);}
UsersServiceImpl
@Service("userService")publicclassUsersServiceImplimplementsUsersService{@AutowiredprivateUsersMapper usersMapper;@OverridepublicUsersselectById(intid){returnusersMapper.selectById(id); }}
测试类
publicclassAppTest{@TestpublicvoidselectById(){ ApplicationContext applicationContext=newClassPathXmlApplicationContext("applicationContext.xml"); UsersService usersService= (UsersService) applicationContext.getBean("userService"); Users user=usersService.selectById(1); System.err.println(user.getUsername()); }}
总结
好了,不知道看完今天的内容大家感觉怎么样,有没有收获,我基本是按照从入门开始,逐步的往里面填充一些知识的顺序将mybatis进行了整理,那这个时候,我想,在实际的学习过程中你肯定还会遇到一些这样那样的问题,但是千万不要突进,脚踏实地,就从一些基础的,无聊的东西开始一点点的学习,网络上那些说这个牛,哪个好的,他肯定有一门傍身的技术作为基础,所以才能打到他说的那个层次
最后,所有程序员都能当架构师,哈哈哈哈哈
网友评论