Mybatis
一、官方文档地址
- Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
- GitHub : https://github.com/mybatis/mybatis-3
二、原生使用
1、第一个程序
-
搭建数据库 create datebase `mybatis`
use `mybatis`
drop table if exists `user`;
create table `user`(
`id` int(20) not null
`name` varchar(30) default null
`pwd` varchar(30) default null,
primary key(`id`)
)engine=InnoDB default charset=utf-8;
insert into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),
(2,'张三','abcdef'),
(3,'李四','987654');
-
导入jar包 <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
-
编写mybatis核心配置文件 <?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">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kuang/dao/userMapper.xml"/>
</mappers>
</configuration>
-
编写工具类 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;
static{
try{
string resource ="mybatis-config.xml";
InputStream inputStream = Resources.getReSourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
catch(IOException e){
e.printStackTrace();
}
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
-
创建实体类 public class User {
private int id;
private String name;
private String pwd;
}
-
编写Mapper接口类 import com.kuang.pojo.User;
import java.util.List;
public interface UserMapper{
List<User> selectUser();
}
-
编写userMapper.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 namespace="com.kuang.dao.UserMapper">
<select id="selectUser" resultType="com.kuang.pojo.User">
select * from user
</select>
</mapper>
-
编写测试类 public class Mytest{
@Test
public void selectUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUser();
for (User user: users){
System.out.println(user);
}
session.close();
}
}
-
运行测试 -
注意点 可能出现问题,原因为mapper.xml在java包下无法解析,导致mapper无法生效(maven静态资源过滤问题)
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
2、CRUD 操作
-
userMapper 接口添加方法 public interface UserMapper {
List<User> selectUser();
User selectUserById(int id);
int addUser(User user);
int deleteUser(int id);
}
-
在UserMapper.xml中添加Select语句 <select id="selectUserById" resultType="com.kuang.pojo.User">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="com.kuang.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
-
测试类中测试 注意点:其中增删改需要提交事务 @Test
public void tsetSelectUserById() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5,"王五","zxcvbn");
int i = mapper.addUser(user);
System.out.println(i);
session.commit();
session.close();
}
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int i = mapper.deleteUser(5);
System.out.println(i);
session.commit();
session.close();
}
**练习:**根据密码和名字查询用户
-
方法一:在方法里传参数
-
在接口方法的参数前加 @Param属性 -
Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型 //通过密码和名字查询用户
User selectUserByNP(@Param("username") String username,@Param("pwd") String pwd);
/*
<select id="selectUserByNP" resultType="com.kuang.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
*/
-
方法二:用Map
-
用Map传参 User selectUserByNP2(Map<String,Object> map);
-
编写sql语句的时候,需要传递参数类型,参数类型为map <select id="selectUserByNP2" parameterType="map" resultType="com.kuang.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
-
在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求! Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明");
map.put("pwd","123456");
User user = mapper.selectUserByNP2(map);
如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
小结:
- 所有的增删改操作都需要提交事务!
- 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
- 有时候根据业务的需求,可以考虑使用map传递参数!
- 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!
3、配置文件详解
核心配置文件
- mybatis-config.xml 系统核心配置文件
- MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
- 能配置的内容如下:
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->
我们可以阅读 mybatis-config.xml 上面的dtd的头文件!
environments元素
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
mappers元素
mappers
- 映射器 : 定义映射SQL语句文件
- 既然 MyBatis 的行为其他元素已经配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括
file:/// 的 URL),或类名和包名等。映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始,还支持接口映射器,这种映射器方式允许以Java代码的方式注解定义SQL语句,非常简洁。
引入资源方式
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!--
使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!--
将包内的映射器接口实现全部注册为映射器
但是需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
Mapper文件
<?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 namespace="com.kuang.mapper.UserMapper">
</mapper>
-
namespace中文意思:命名空间,作用如下: -
- namespace的命名必须跟某个接口同名
- 接口中的方法与映射文件中sql语句id应该一一对应
-
- namespace和子元素的id联合保证唯一 , 区别不同的mapper
- 绑定DAO接口
- namespace命名规则 : 包名+类名
MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。
Properties优化
数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。具体的官方文档
我们来优化我们的配置文件
第一步 ; 在资源目录下新建一个db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456
第二步 : 将文件导入properties 配置文件
<configuration>
<!--导入properties文件-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
更多操作,可以查看官方文档!【演示带领学习】
typeAliases优化
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
<!--配置别名,注意顺序-->
<typeAliases>
<typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>
当这样配置时,User 可以用在任何使用com.kuang.pojo.User 的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="com.kuang.pojo"/>
</typeAliases>
每一个在包 com.kuang.pojo 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
若有注解,则别名为其注解值。见下面的例子:
@Alias("user")
public class User {
...
}
去官网查看一下Mybatis默认的一些类型别名!
其他配置浏览
设置
-
设置(settings)相关 => 查看帮助文档 -
-
一个配置完整的 settings 元素的示例如下: <settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
类型处理器
- 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
- 你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。【了解即可】
对象工厂
- MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。
- 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。
- 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。【了解即可】
生命周期和作用域
作用域(Scope)和生命周期
理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。
我们可以先画一个流程图,分析一下Mybatis的执行过程!

作用域理解
- SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
- SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。
- 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。
- 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。
- 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
- 所以 SqlSession 的最佳的作用域是请求或方法作用域。

4、resultMap和注解开发
解决Javabean的属性名与数据库表的字段不一致问题
public class User {
private int id; //id
private String name; //姓名
private String password; //密码和数据库不一样!
//构造
//set/get
//toString()
}
<resultMap id="UserMap" type="User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="selectUserById" resultType="map">
select id , name , pwd
from user
where id = #{id}
</select>
**注意:**利用注解开发就不需要mapper.xml映射文件了 .
1、我们在我们的接口中添加注解
@Select("select id,name,pwd password from user")
public List<User> getAllUser();
三、在spring集成Mybatis
1、整合说明解释
官方文档: mybatis-spring
-
Spring整合MyBatis, 主要目的就是把MyBatis核心配置文件中的内容,交给Spring来处理; 再简单点来说, 将MyBatis的SqlSessionFactory 和Mapper 的创建交给Spring处理; -
要和Spring 一起使用MyBatis,需要在Spring应用上下文中定义至少两样东西:一个sqlsessionFactory 和至少一个数据映射器类。 在MyBatis-Spring 中,可使用sqlsessionFactoryBean 来创建sqlsessionFactory 。
注意:
-
sqlsessionFactory 需要一个Datasource (数据源)。这可以是任意的DataSource ,只需要和配置其它Spring 数据库连接―样配置它就可以了。 -
在基础的MyBatis用法中,是通过SqlSessionFactoryBuilder 来创建SqlSessionFactory 的。而在 MyBatis-Spring 中,则使用SqlSessionFactoryBean 来创建。 -
在MyBatis 中,你可以使用SqlSessionFactory 来创建SqlSession 。一旦你获得―个session之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭session。 -
SqlSessionFactory 有一个唯一的必要属性:用于JDBC的DataSource 。这可以是任意的DataSource 对象,它的配置方法和其它Spring 数据库连接是―样的。 -
一个常用的属性是configLocation ,它用来指定MyBatis的XML配置文件路径。它在需要修改MyBatis 的基础配置非常有用。通常,基础配置指的是或元素。 -
需要注意的是,这个配置文件并不需要是一个完整的MyBatis配置。确切地说,任何环境配置( ),数据源( )和 MyBatis 的事务管理器()都会被忽略。SqlSessionFactoryBean会创建它自有的 MyBatis 环境配置( ) ,并按要求设置自定义环境的值。 -
sqlsessionTemplate 是MyBatis-Spring 的核心。作为Sqlsession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的sqlsession . -
模板可以参与到Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用sqlSessionTemplate来替换 MyBatis 默认的Defaultsqlsession实现。在同一应用程序中的不同类之间混杂使用可能会引起数据—致性的问题。 -
可以使用 sqlsessionFactory作为构造方法的参数来创建SqlSessionTemplate对象。
2、整合方式
注意:(下列步骤中省略mapper.xml的编写,可以参考上面例子中的编写)
1. 方法一
通过SqlSessionFactoryBean 创建sqlSessionFactory ,再通过它创建sqlSessionTemplate。通过mapper实现类注入sqlSessionTemplate
-
创建Spring配置文件applicationContext.xml <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="url" value="${jdbc.url}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="typeAliasesPackage" value="com.sunny.ssm"/>
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="userMapperImpl" class="com.sunny.ssm.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
-
增加Mapper(Dao)接口的实现类;私有化sqlSessionTemplate public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectAll() {
return sqlSession.getMapper(UserMapper.class).selectAll();
}
}
-
测试 @Test
public void test2() throws Exception{
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = context.getBean("userMapperImpl", UserMapper.class);
for (User user : userMapper2.selectAll()) {
System.out.println(user);
}
}
结果成功输出!现在我们的Mybatis配置文件的状态!发现都可以被Spring整合! <?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">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
其实我们可以通过Spirng完全将mybatis配置文件去除,这里还是保留一个配置吧!
2. 方法二
让Dao继承Support类 , 直接利用 getSqlSession() 获得 , 然后直接注入SqlSessionFactory . 比起方式1 , 不需要管理SqlSessionTemplate , 而且对事务的支持更加友好
官方文档截图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYGvw2U7-1628175901098)(C:\Users\superstrong\AppData\Roaming\Typora\typora-user-images\image-20210804150820165.png)]
-
修改UserMapperImpl public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
public List<User> selectAll() {
return getSqlSession().getMapper(UserMapper.class).selectAll();
}
}
-
修改bean的配置 <bean id="userMapperImpl" class="com.sunny.ssm.mapper.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
3. 方法三
前两种的整合实现方式,都创建了Dao接口的实现类,通过实现类来获取mapper对象; 使用整合方式三,我们告诉Spring,让他来帮我们创建mapper的代理对象即可!
-
配置MapperFactoryBean,Spring帮我们创建 Mapper的代理对象
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="mySqlSessionFactory"/>
<property name="mapperInterface" value="com.sunny.ssm.mapper.UserMapper"/>
</bean>
或者采用下面扫描的方式
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.sunny.mapper"/>
</bean>
四、Spring + jdbctemplate
1、 jdbcTemplate更新数据库常用方法
- update (更新数据)
- batchUpdate (批量更新数据库)
- queryForObject (查询单行)
- query (查询多行)
- queryForObject (单值查询)不同的
2、Spring数据访问过程
Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类
- 模板(template) :模板管理过程中固定的部分
- 回调(callback) :回调处理自定义的数据访问代码
3、spring中实现jdbcTemplate对数据库操作(采用c3p0连接池)
-
导入jar包 MySQL的驱动包,spring-jdbc
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
-
src下创建配置db.properties jdbc.user=root
jdbc.password=Hudie
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/jdbctemplate
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
-
配置xml <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
-
测试1中的方法 import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class testJDBC {
private JdbcTemplate jdbcTemplate;
private ApplicationContext context = null;
{
context = new ClassPathXmlApplicationContext("applicationContext.xml");
jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
}
@Test
public void testUpdate() {
String sql = "update student set name = ? where num = ?";
jdbcTemplate.update(sql, "pink",0001);
System.out.println("success");
}
@Test
public void testBatechUpdate() {
String sql = "insert into student(num,password,name,age,score) value(?,?,?,?,?)";
List<Object[]> batchArgs = new ArrayList<Object[]>();
batchArgs.add(new Object[] {"007","123","pojp",23,99});
batchArgs.add(new Object[] {"008","123","trtp",23,99});
batchArgs.add(new Object[] {"009","123","QQQp",23,99});
jdbcTemplate.batchUpdate(sql, batchArgs);
}
String sql = "select count(name) from student";
Long count = jdbcTemplate.queryForObject(sql, Long.class);
String sql = "select num,name,age from student where id > ?";
RowMapper<stu> rowMapper = new BeanPropertyRowMapper<stu>(stu.class);
List<stu> s = jdbcTemplate.query(sql, rowMapper,0);
String sql = "select num,name,age from student where id = ?";
RowMapper<stu> rowMapper = new BeanPropertyRowMapper<stu>(stu.class);
stu s = jdbcTemplate.queryForObject(sql, rowMapper,5);
}
五、springboot+Mybatis
可以查看下面这篇csdn博客
参考链接
六、总结
原生mybatis:
-
主要为在工具栏中先通过配置文件获得SqlSessionFactoryBuilder ----->SqlSessionFactory ------>SqlSession -
其中通过mapper.xml交给mybatis创建mapper接口的实现类,并在主配置文件中通过mapper.xml配置注册mapper -
通过SqlSession .getmapper获得mapper
spring+mybatis:
- 将原生的mybatis中的配置文件交给spring处理,SqlSessionFactoryBuilder变成了spring中的SqlSessionFactoryBean,SqlSession在spring中有一个sqlsessionTemplate实现类
- mapper.xml 变成了一个实现类,通过注册实现类组件和注入(DI) sqlsessionTemplate,从而达到和前者一样的效果
spring jdbctemplate
- 主要是spring将jdbc的复杂操作编写成了一个template(模板)即class,通过数据源外部属性的注入注册其对象,将对象注入到mapper中,跟mybatis中的Sqlsession一样,就可以实现各个crud方法的调用
springboot +mybatis
-
其实就是将上述的spring的第三种整合方式(包扫描的方式)中的mybatis配置文件的配置信息移到到application.yml中,springboot会根据application.yml的配置更改自动配置时的信息 -
application.yml
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/zzz?useUnicode=true & characterEncoding=utf-8 &
useSSL=true & serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis:
mapper-locations: classpath:/mapper/*.xml
type-aliases-package: com.example.entity
-
在mapper的接口上加上**@mapper或者@MapperScan(“com.atguigu.admin.mapper”)**
小结:
所有说只要掌握了mybatis的实现过程,spring+mybatis的整合就会了,而springboot+mybatis的整合完全就是与spring大致相同,只是基于其的自动配置的特点发生了简单的变化,其底层的原理还是spring
|