mybatis配置文件:
- 导入依赖jar包
- 配置SqlMapConfig.xml
- 配置log4j.properties,用来输出sql
4.pojo工程目录下,创建对象 - 配置sql查询的映射文件user.xml
- 加载映射文件
2.配置SqlMapConfig.xml的细节
<!-- environments环境 default=代表使用哪个环境-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mybatis/user.xml"/>
</mappers>
3.配置log4j.properties
Global logging configuration
log4j.rootLogger=DEBUG, stdout
Console output…
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
5.加载映射文件
<!-- parameterType入参的结果数据类型 resultType返回结果的数据类型 #{}占位符,相当于jdbc的? -->
<select id="getUserByid" parameterType="int"
resultType="com.itheima.mybatis.pojo.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM
`user`
WHERE
`id`=#{id1}
</select>
<!-- resultType:如果返回结果为集合,只需设置为每一个的数据类型 -->
<select id="getUserByUserName" parameterType="String"
resultType="com.itheima.mybatis.pojo.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM
`user`
<!-- WHERE username LIKE #{name} -->
WHERE username LIKE '%${value}%'
</select>
为什么用selectKey标签?
有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了。
这时候,通过一些设置,mybatis可以将insert的数据的主键返回,直接拿到新增数据的主键,以便后续使用。
当一个表没有唯一标识的时候,可以加UUID即SELECT UUID();
SELECT LAST_INSERT_ID();内置函数,为线程安全的 -->
selectKey:主键返回
keyProperty:user中的主键属性
resultType=:所返回的主键的数据类型
order:在何时运行
<insert id="insertUser" parameterType="com.itheima.mybatis.pojo.User" useGeneratedKeys="false" keyProperty="id">
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey> -->
INSERT INTO `user` (
`username`,
`birthday`,
`sex`,
`address`
)
VALUES
(
#{username},
#{birthday},
#{sex},
#{address}
);
</insert>
</mapper>
Dao架构体系
:
其中SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例.同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.在应用运行期间不要重复创建多次,建议使用单例模式.SqlSessionFactory是创建SqlSession的工厂.
SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句.每个线程都应该有它自己的SqlSession实例.SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中.也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它.
关于MyBatis常用对象SqlSessionFactory和SqlSession介绍和运用原文链接:https://blog.youkuaiyun.com/u013412772/article/details/73648537
原始Dao开发方法
1 使用原有的user映射文件,不需修改
2 新建个Dao接口
3 新建个DaoImpl接口实现类(与动态代理dao开发的区别)
动态代理dao开发规则
- namespace必需是接口的全路径名
- 接口的方法名必需与映射文件的sql id一致
- 接口的输入参数必需与映射文件的parameterType类型一致
- 接口的返回类型必须与映射文件的resultType类型一致
开发步骤:
5. 创建UserMapper.xml映射文件(把原来的user.xml复制按开发规则要求修改一下)
6. 创建UserMapper接口(把原来的UserDao.java复制按开发规则要求修改一下)
7. 加载UserMapper.xml
另外:
properties:
typeAliases:
<!-- 单个别名定义不区分大小写<typeAlias type="com.itheima.mybatis.pojo.User" alias="user"/> -->
<!-- 别名包扫描器(推荐使用此方式),整个包下的类都被定义别名,别名为类名,不区分大小写-->
<package name="com.itheima.mybatis.pojo"/>
mappers:
<mapper resource="mapper/user.xml"/>
<!-- 第一种方式,加载 resource-->
<!-- 第二种方式,class扫描器要求:
1、映射文件与接口同一目录下
2、映射文件名必需与接口文件名称一致
-->
<!-- <mapper class="com.itheima.mybatis.mapper.UserMapper"/> -->
<!-- 第三种方式,包扫描器要求(推荐使用此方式):
1、映射文件与接口同一目录下
2、映射文件名必需与接口文件名称一致
-->
<package name="com.itheima.mybatis.mapper"/>