目录:
1、mybatis简介:
?2、入门程序
3、模糊查询和注入问题? ?? (${ } 和 #{? }的区别)
4、怎样返回自增主键
5、dao层的开发
????????1)原始的方式
? ? ? ? 2)mapper代理的方式(不用创建dao 的实现类,直接创建接口就可以,实现类由mybatis帮? 我们创建)?
6.mybatis主配置文件的其他配置??
????????? Properties 主要用于配置属性信息
? ? ? ? settings 主要用于配置mybatis的运行时的一些方式
? ? ? ? typeAliases 用于配置类别名
? ? ? ? typeHandlers 用于配置类型处理器
? ? ? ? plugins 用于配置一些插件,比如分页插件
? ? ? ? environments 用于配置一些数据源,连接池等信息
? ? ? ? mappers? 配置映射文件
1、mybatis简介:
?? ?MyBatis 本是 apache的一个开源项目iBatis, 2010年这个项目由 apache software foundation 迁移到了google code, ?? ??? ?并且改名为 MyBatis ?, 2013年11月迁移到Github , iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 ?? ??? ?iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) ?? ??? ?MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索 ?? ??? ?MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录
半ORM框架:ORM对象模型到关系模型的转换
对象模型: 类和对象
class UserInfo{
id
name
}
关系模型:数据库表和数据
table userinfo id,name
2、入门程序
1)首先在项目中建一个和src同级的目录lib,将mysql的驱动包和mybatis的驱动包放进去,添加至构建路径
2)建一个和src同级目录的源文件夹config(当然你可以叫其他名):源文件夹就是新建文件夹的时候点击Source Folder
3)config文件下建一个db.properties文件(数据库配置文件)
mysql8的配置
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
db.username=root
db.password=root
mysql5的配置
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8
db.username=root 你的数据库用户名
db.password=root 你的数据库密码
4)建mybatis的主配置文件 就在config的文件夹下建,比如我建的名字叫mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?> <!--这一行叫文档类型声明,必须在第一行,前面不能有空格有空行,要求非常严格-->
<!--DOCTYPE 说明这个文档接受的校验规则是什么样的-->
<!--configuration 说明这个文档的根节点目录,比如<configuration></configuration> -->
<!-- PUBLIC 表示这个规则,这个规范的名字叫"-//mybatis.org//DTD Config 3.0//EN" ,遵守的规则是"http://mybatis.org/dtd/mybatis-3-config.dtd" 这个规则约束了你可以写什么 -->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--将数据库的配置文件引过来-->
<properties resource="db.properties" />
<environments default="development">
<environment id="development">
<!--使用mybatis内置的一个事物管理器-->
<transactionManager type="JDBC"/>
<!--使用mybatis内置的一个数据源-->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
5)编写映射文件(通常来说,一个表对应一个)
? ? ? ? 随便在哪建一个目录放映射文件
? ? ? ? 我就在config下面建一个mappings的文件来放所有的映射文件
? ? ? ? 映射文件的命名规则
? ? ? ? (1)非mapper代理的方式
? ? ? ? ? ? ? ? UserInfo ==> UserInfo.xml
? ? ? ? ? (2)mapper代理的方式
????????????????Dao 层接口 ==> ?UserMapper ?==> UserMapper.xml
例:UserInfo.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的 -->
<mapper namespace="xxx">
<select id="getUserById" parameterType="int" resultType="com.beans.UserInfo">
select *from userInfo where id=#{id}
</select>
</mapper>
测试文件
public class Test {
public static void main(String[] args) throws IOException {
//加载主配置文件
InputStream in=Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactory
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//得到SqlSession
SqlSession sqlsession=factory.openSession();
//进行数据库操作
UserInfo user=sqlsession.selectOne("xxx.getUserById", 1);//要带上名称空间
System.out.println(user);
//清理
sqlsession.close();
}
}
运行:报错Mapped Statements collection does not contain value for getUserById ? ? ? ? ? ? ? ? ? ?说找不到名为getUserById的值
这是什么原因呢?
因为我们虽然写了mapper文件,但是我们没有在主配置文件里面引入
将mapper的映射文件在配置文件中声明引入
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>
<properties resource="db.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappings/UserInfo.xml"></mapper>
</mappers>
</configuration>
? ? ? 说明? ? ? ? 1) ?parameterType="int" 是用来指明传入的参数的类型 ,本例中,可以省略 ? ? ? ? ? resultType="com.beans.UserInfo" 指的是返回的数据要处理成什么类型 ,一般都不可以省 ? ? ? ? ? ?#{id} 这个写法相当于运去的 ? 占位符,当参数类型是简单类型的时候,里面的 id 可以写成任何字符串 ? ? ? ? ? ? ?? ? ? ? ? ?<select id="getUserById" ?parameterType="int" resultType="com.beans.UserInfo"> ?? ??? ??? ??? ??? ??? ?select * from userInfo where id = #{id}? ?? ??? ??? ??? ??? ?</select>
? ? ? 2) 如果指明了 parameterType="int" ,则在传参的时候,必须传int型,如果传String 将出错? ? ? ?? ? ? ? 3) mybatis中的几个重要角色 ? ? ? ? ?(1) 主配置文件 mybatis-config.xml ? ? ? ? ? ? ? ? 它的名字任意,主要用来配置数据源,事务等运行时环境 ,引入映射文件 (比如上例中的 UserInfo.xml ) ? ? ? ? ? ? ? ? ? ?(2) SqlSessionFactory ? ? ? ? ? ? ? 会话工厂, 它是根据配置文件创建的 ,用来创建 SqlSession ? ? ? ? ? ? ? ?? ? ? ? ? ?(3) SqlSession ? ? ? ? ? ? ? 称为会话, 是一个接口,用来操作数据库,进行增,删,改,查等操作 ,它类似于过去JDBC中的 Connection 对象 ? ? ? ? ? ? ? 一定要注意,它的HttpSession没有任何关系? ? ? ? ? ? ? ? 它是线程不安全的? 3、模糊查询和注入问题? ? ? ? ?
? ?
<select id="getUserByName" resultType"com.beans.UserInfo">
select *from userinfo where userName like #{userName}
</select>
? ? 1)它的返回结果应该是个List<UserInfo>
? ? ?2)#{}这样的占位,相当于jdbc中的? ?
关于#{ }和${value}这两种写法
? ? ? ? #{ }这样的写法,完全相当于jdbc中的 ? 占位
? ? ? ? ${ value }mybatis会直接将传过来的结果拼到字符串中(所以有注入问题),如果参数是简单类型,${ }里面的值必须叫value
select * from userinfo where userName like '%${ value }%'
注入问题:
例如:使用${value}方式传参引起的注入问题
List<UserInfo> userList=session.selectList("xxx.getUserByName","1'or'1'='1'or'1=");
可以发现,出现注入问题
可以这样写
select * from good where goodName like "%"#{searchmessage}"%" ?or ?goodClassify like "%"#{searchmessage}"%"
<!--也可以用concat这个函数-->
select * from userInfo where username like concat('%',#{userName},'%')
4、返回自增主键 ?
<insert id="addUser" parameterType="com.beans.UserInfo" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
insert into userInfo (userName,password,note) values (#{userName},#{password},#{note} )
</insert>
?? ?keyProperty="id" 表示生成的主键,对应的 ?UserInfo 的属性是 id 这个字段 ?? ?keyColumn="id" 指的是表中id这列是主键
怎么获得自增主键呢?
static void testAdd() {
SqlSession session=MybatisUtil.oppenSession();
UserInfo user=new UserInfo();
user.setUserName("姜博文");
user.setPassword("1357");
user.setNote("哈学院");
int result=session.insert("xxx.addUser",user);
session.commit();
System.out.println(result==1?"添加成功":"添加失败");
System.out.println("生成的自增主键是" +user.getId());
session.close();
}
5、dao层的开发
sqlSessionFactory 应该是单例的,将来要交给spring管理
sqlsession是线程不安全的,要做成局部变量
mybatis开发dao层,有两种方式
? ? ? ? 1)原始的方式
? ? ? ? 2)mapper代理的方式(不用创建dao 的实现类,直接创建接口就可以,实现类由mybatis帮我们创建)
1)原始的方式
? ? ? ? (1)dao层接口? ? ??
public interface UserDao {
UserInfo getUserById(int id);
int addUser(UserInfo user);
void delete(int id);
int updateUser(UserInfo user);
List<UserInfo> getAllUsers();
}
? ? ? ? (2)实现类
public class UserDaoImpl implements UserDao{
UserDaoImpl(SqlSessionFactory factory){
this.factory=factory;
}
private SqlSessionFactory factory;
public UserInfo getUserById(int id) {
SqlSession s=factory.openSession();
UserInfo user=s.selectOne("xxx.getUserById",id);
return null;
}
public int addUser(UserInfo user) {
return 0;
}
public void delete(int id) {
}
public int updateUser(UserInfo user) {
return 0;
}
public List<UserInfo> getAllUsers() {
return null;
}
}
2)mapper代理的方式
使用mapper代理的好处就是不用再写dao层的实现类了,,mybatis会帮我们自己生成
我们只要编写dao层接口就可以
几个原则:
? ? ? ? 1)映射文件的namespace属性,要和mapper接口的全名称一致? ? ? ??
xml配置文件中指向的是com.mapper.UserMapper接口
?<mapper namespace="com.mapper.UserMapper">
? ? ? ? 2)mapper接口中方法的名称和映射文件中的SQL的id要相同
mapper中
public interface UserMapper {
UserInfo getUserById(int id);
}
xml中
<!--id的名字和UserMapper中的方法名一样-->
<select id="getUserById" resultType="com.beans.UserInfo">
select * from userInfo where id = #{id}
</select>
? ? ? ? 3)接口中方法的返回值类型,要和映射文件中的resultType一致,参数类型要和ParameterType一致
? ? ? ? 只要符合上面的规则,mybatis就会帮我们实现这个接口的实现类
不要忘了在主配置文件里面注入UserMapper.xml文件
<mappers>
<mapper resource="mappers/UserMapper.xml" />
</mappers>
6.mybatis主配置文件的其他配置
? ? ? ? Properties 主要用于配置属性信息
? ? ? ? settings 主要用于配置mybatis的运行时的一些方式
? ? ? ? typeAliases 用于配置类别名
? ? ? ? typeHandlers 用于配置类型处理器
? ? ? ? plugins 用于配置一些插件,比如分页插件
? ? ? ? environments 用于配置一些数据源,连接池等信息
? ? ? ? mappers? 配置映射文件
1)properties 主要用于配置属性信息
? ? ? ? 可以引入外部的属性文件,或者直接在<property name="" value=""/>
mybatis-config.xml中
<properties resource="db.properties" >
<property name="cat" value="tomCat"/> //property里面的属性可以用${cat}这样的方式来取
<property name="fish" value="sharkFish"/>
<property name="db.password" value="xxxxx"/> //如果这里的属性和外部文件中的属性同名,则优先使用外部文件中的配置,如果外部文件没有配置,则使用的是当前文件的
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/> //这里用到了配置的属性
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
?2) settings:?? ?主要用于配置mybatis的运行时的一些方式 ?? ? ? ?? ??? ???
?<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="defaultExecutorType" value="SIMPLE" />
?? ??? ??? ??? ??? ? ?<setting name="defaultStatementTimeout" value="25" />
?? ??? ??? ??? ??? ? ?<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>??
?3)typeAlice? 配置文件的别名
<typeAliases>
//单个别名的定义
<typeAlias type="com.beans.UserInfo" alias="userInfo"/>
//批量定义别名,别名的名称是类的简单名称,首字母大小写均可
<package name="com.beans"/>
</typeAliases>
定义完别名以后 程序中就可以使用这个别名了 ,resultType里面的UserInfo就是上面配置的别名
<select id="getUserById" resultType="userInfo">
select * from userInfo where id = #{id}
</select>
4)typeHandlers:类型处理器
? ? ? ? 类型处理器,mybatis中内置的就可以了,不用在定义了
5)plugins? 插件
下面定义了一个分页插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<property name="offsetAsPageNum" value="false"/>
<property name="rowBoundsWithCount" value="false"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="true"/>
<property name="supportMethodsArguments" value="false"/>
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
6)environments:用于配置一些数据源,连接池等相关信息
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
7)mappers: 用于引入映射文件?
? ? ? ? 引入映射文件的方式:
? ? ? ? (1)相对路径的方式? ? ? ?
<mappers>
<mapper resource="mappers/UserMapper.xml" />
<mapper resource="mappers/GoodsMapper.xml" />
</mappers>
? ? ? ? (2)使用全路径的方式引入
? ? ? ? ? ? ? ? 比如c:/java/mapper/..........
? ? ? ? ?(3)使用类名包名的方式引入,要求映射文件和接口名必须相同,且在同一个包下
??
<mappers>
<mapper class="com.mapper.UserMapper" />
</mappers>
? ? ?
?????????(4) 使用 mapper 的方式批量加载??
? ???<mappers>
?? ??? ??? ??? <package name="com.mapper"/>
?? ??</mappers>
? ? ? 上例是加载 com.mapper 这个包下所有的映射文件
?? ??? ??? ??? ???
|