Mybatis基础配置
Mybatis基础配置
目录
生命周期和作用域
SqlSessionFactoryBuilder :
一旦创建了SqlSessionFactory, 就不再需要了,设置成局部变量
SqlSessionFactory :
想象成数据库连接池, 一旦创建就应该一直存在, 没有理由重新建造一个, 设置为全局作用域.
使用单例模式或者静态单例模式, 既可以保证只有一份, 又是全局作用域
SqlSession :
- 连接到连接池的一个请求
- SqlSession的实例不是线程安全的, 因此是不能被共享的, 所以它的最佳作用域是请求或方法作用域
- 用完之后需要赶紧关闭, 否则资源被占用, 这个操作十分重要!!!
编写mybatis核心配置文件
-
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>
编写mybatis工具类
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();
}
}