? 一旦创建了SqlSessionFactory, 就不再需要了,设置成局部变量
? 想象成数据库连接池, 一旦创建就应该一直存在, 没有理由重新建造一个, 设置为全局作用域.
? 使用单例模式或者静态单例模式, 既可以保证只有一份, 又是全局作用域
pom.xml
<!--防止报错用的-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
mybatis-config.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">
<configuration>
<!--每一个xml的作用是等地位的,但是由于这个xml通过标签引入了别的xml,
就相当于这是个主xml的意味了,同时需要注意的是xml文件中各个标签的位置非常重要,否则会报错-->
<!--引入外部配置文件,由于在一个包下,所以不用去写路径,
相当于把测试一中的value专门写到一个地方去,并且外部配置的优先级更高-->
<properties resource="config.properties"/>
<!--取别名-->
<typeAliases>
<!--当类名比较少的时候,分别给每一个类取上别名-->
<typeAlias type="com.xiong.pojo.User" alias="User"/>
<!--当类名比较多的时候,通过引入包,使得自动扫描对应包下类,
这种默认不可以自定义别名,除非再额外使用@Alias的注解-->
<package name="com.xiong.pojo"/>
</typeAliases>
<!-- 对数据库连接的配置文件 -->
<environments default="development2">
<!--测试一-->
<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?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<!--测试二-->
<environment id="development2">
<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>
<!-- mapper.xml文件的路径配置 -->
<mappers>
<mapper resource="com/xiong/dao/UserMapper.xml"/>
</mappers>
</configuration>
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">
<!--用配置文件的方式来取代接口的实现类-->
<!--使用别名来减少完全限定名的冗余,别名在mybatis-config.xml中设置-->
<!--绑定对应的接口-->
<mapper namespace="com.xiong.dao.UserMapper">
<!--这里已经使用了别名进行优化-->
<insert id="addUser" parameterType="User">
-- 在这里对象的属性可以直接用,直接写User类中的id,name和pwd,这里需要与属性名相对应
insert into mybatis.user(id, name, pwd) value (#{id},#{name},#{pwd})
</insert>
<!--使用map自定义程度高,可以不用User类对象中的属性-->
<insert id="addUserSimple" parameterType="map">
insert into user (id, name, pwd) values (#{userId},#{username},#{password});
</insert>
<update id="updateUser" parameterType="User">
update mybatis.user set name = #{name},pwd=#{pwd} where id=#{id} ;
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
<!--id就是对应的方法名,相当于用下面的sql语句重写了该方法
resultType是sql语句的返回值
parameterType是对应的参数类型-->
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
<select id="getUserById" resultType="User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
<select id="getUserLike" resultType="User">
-- 模糊查询的sql,拼接的时候需要防止sql注入
select * from mybatis.user where name like #{value}
</select>
</mapper>
public class MybatisUtils {
//提升作用域
private static SqlSessionFactory sqlSessionFactory;
static {
//使用Mybatis第一步,获取sqlSessionFactory
//固定代码
InputStream inputStream = null;
try {
String resource = "mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// org.apache.ibatis.session.SqlSession 提供了在数据库执行 org.apache.ibatis.jdbc.SQL 命令所需的所有方法。
// 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
原文:https://www.cnblogs.com/yimeisuren/p/12640077.html