mybatis的配置
三、配置文件
1.namespace
namespace要与我们的接口名一一对应;
2.select
- id:要与接口的方法名一致,作为一个我们唯一的标识;
- resultType:返回值,如果是集合,写集合类型里面的东西;
- parameterType:参数的类型
<select id="getUserID" parameterType="int" resultType="com.saxon.pojo.User">
select * from mybatis.saxon where id=#{id};
</select>
public void test () {
SqlSession sqlSession=null;
//关闭ssqlsession,这个关闭很重要
try {
//获得sqlsession对象
sqlSession = MybatisUnit.getSqlSession ();
//获得mapper对象,为了得到userdao,使用里面的方法;
UserDao mapper = sqlSession.getMapper (UserDao.class);
User userID = mapper.getUserID (2);
System.out.println (userID);
} finally {
if (sqlSession!=null){
sqlSession.close ();
}
}
}
3.insert
4.update
5.delete
除了查找之外,其他的都要提交事务,提交的话就是一句 sqlsession.commit()
6.MAP 的使用
在一个实体类属性太多的时候,我们就可以用一个集合来添加属性;
直接利用key-value取出我们要的值;
<update id="update" parameterType="map">
update mybatis.saxon set user=#{user} ,pwd=#{pwd} where id=#{id};
</update>
public void testMap(){
SqlSession sqlSession = MybatisUnit.getSqlSession ();
UserDao mapper = sqlSession.getMapper (UserDao.class);
Map<String, Object> map = new HashMap<> ();
map.put ("id",2);
map.put ("user","saxon");
map.put ("pwd","441564161");
mapper.update (map);
sqlSession.commit ();
sqlSession.close ();
}
"#{user}":里面的值就是你集合里面设置的值;
使用#{}与*{}的区别就在与前者是预编译,更加安全,防止sql注入问题
7.模糊查询
1.在给出变量的时候拼接出来。例如String str="%李%";但是这个会存在sql注入的问题;
2.在我们写查询语句的时候,就在值的左右把他写成固定的;就是“%”#{value}“%”;可以避免一些注入问题;
8.核心配置文件(mybatis-config.xml)
1.properties 配置
我们的配置文件可以自己写成一个配置文件,也可以自己直接赋值
关于配置properties的位置,一定要放在第一位,他的位置有规定的
1.配置文件法
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://rm-wz917wbvou67a757quo.mysql.rds.aliyuncs.com:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=true
username=saxon
password=111111
引用:
<properties resource="db.properties">
<!-- 读取配置文件 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
2.直接写
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:localhost:3306/smbms?useUnicode=true&characterEncoding=utf8&useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value=""/>
2.environments 环境
这个标签是关于环境的标签,我们可以配置多套环境但是只能使用一套环境;
<environments default="development">
<environment id="development">
environments和environment通过id选择环境;你可以自定义环境;
3.transactionManager 事务管理
<transactionManager type="JDBC"/>
事务的管理者,有两种,但是mybatis默认的是JDBC,还有另外一种叫做 MANGED
4.dataSource 数据源
<dataSource type="POOLED">
默认的是pooled还有其他两种,一共是[UNPOOLED|POOLED|JNDI]这三种;
5 .typeAliases.别名
第一种:直接配置
<typeAliases>
<typeAlias type="com.saxon.pojo.User" alias="user"/>
</typeAliases>
第二种:扫描包
<typeAliases>
<package name="com.saxon.pojo"/>
</typeAliases>
取别名就是为了在我们使用的时候,避免重复的写一些冗长的代码,比如com.saxon.pojo.Use,我们取得别名就是user,那么我们在resultType要使用com.saxon.pojo.Use就可以使用user。
两种配置的区别:
1.第一种可以自己写名字,第二种的默认是类名的首字母大写,如果要自定义的话,可以在类名上加上一个注解@Aliases("");
2.当我们类名比较少的时候就可以用第一种,当我们类名比较多的时候,直接使用扫描包就可以了,id就是你的类名的小写;
6.setting设置
1.mapUnderscoreToCamelCase:把only_name变成onlyName,把有下划线的命名取成驼峰命名;
2.logImpl:日志的输出可以取的值有:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
7.mapper映射器
第一种:
<mappers>
<mapper resource="com/saxon/Dao/UserMapper.xml"/>
</mappers>
第二种:
<mappers>
<mapper class="com.saxon.Dao.UserMapper"/>
</mappers>
使用第二种的时候必须保证两点:1.映射和实体类必须要在同一个包里;2.并且要和这个类的名字相符;简单来说就是通过你绑定的这个类,去找和这个类名一样的文件xml文件
第三种:
<mappers>
<package name="com.saxon.Dao"/>
</mappers>
使用第三种的要求和第二种是一样的;
所以一般推荐使用第一种
8.作用域(Scope)和生命周期SqlSessionFactoryBuilder
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:
每次的一个sqlsession都是为了完成一次的任务,CRUD
9.结果集映射
就是数据库里面的字段和实体类里面的属性的映射;
<resultMap id="users" type="com.saxon.pojo.User">
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserList" resultMap="users"><!-- the must match with a pojo-->
select * from mybatis.saxon
</select>
//获得sqlsession对象
sqlSession = MybatisUnit.getSqlSession ();
//获得mapper对象,为了得到userdao,使用里面的方法;
UserMapper mapper = sqlSession.getMapper (UserMapper.class);
List<User> userList = mapper.getUserList ();
User user = userList.get (1);
System.out.println (user.getPassword ());
System.out.println (userList);
自学整理
学习地址:狂神说Java