文章目录
MyBatis
1.开发dao两种方法:
原始dao开发方法(程序需要编写dao接口和dao实现类)
mybaits的mapper接口(相当于dao接口)代理开发方法
2.特点:
mybatis是一个持久层的框架,是apache下的顶级项目
通过mybatis提供的映射方式,可以自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句
可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
3.SSM框架开发:Spring√+SpringMVC√+Mybatis
原生态jdbc程序中的问题
1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能
解决:数据库连接池
2.将sql语句和preparedStatement向占位符号位置和设置参数值,硬编码到java代码中,不利于系统维护
解决:将sql语句及占位符号和参数全部配置在xml中
3.从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护
解决:将查询的结果集,自动映射成java对象
mybatis框架原理
mybatis架构案例
加入mybatis核心包、依赖包、数据驱动包
参照原理,使用案例用户增删改查
解决:原生态jdbc程序中的问题
log4j.properties的使用
# Global logging configuration
# 开发环境下日志级别为DEBUG,生产环境下设置为info
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
SqlMapConfig.xml的使用
1.配置驱动参数
2.加载映射文件
<?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>
<!-- 和spring整合后 environments配置将废除-->
<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="123" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
po类和映射文件的使用
1.po类(映射类):
public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
...//get、set方法
}
2.User.xml,注:mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml
在映射文件中配置sql语句:
<?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 namespace="test"><!-- namespace :命名空间,用于隔离sql语句 -->
<!-- 根据id获取用户信息 -->
<select id="findUserById" parameterType="int" resultType="cn.moke.mybatis.po.User">
select * from user where id=#{id}
</select>
<!-- 自定义条件查询用户列表 -->
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="cn.moke.mybatis.po.User">
select * from user where username like '%${value}%'
</select>
<!--
parameterType:定义输入到sql中的映射类型
#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql
//占位符接收输入参数类型可以为简单类型,pojo(普通javabean),hashmap;可以写成value或者其他名称
resultType:定义结果映射类
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中,有sql注入风险,不建议使用
${value}:如果传入类型是简单类型,${}中只能使用value
-->
<!-- 添加用户 -->
<insert id="insertUser" parameterType="cn.moke.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
<!--
keyProperty:返回的主键存储在pojo中的哪个属性
order:selectKey的执行顺序,是相对与insert语句来说
由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
resultType:返回的主键是什么类型
LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值
-->
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!-- 更新用户 -->
<update id="updateUser" parameterType="cn.moke.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>
3.非自增主键使用uuid():
<insert id="insertUser" parameterType="cn.moke.mybatis.po.User">
<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
select uuid()
</selectKey>
insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
4.通过oracle的序列生成主键:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
SELECT 自定义序列.NEXTVAL FROM DUAL
</selectKey>
insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
创建会话操作数据库
1.根据用户id(主键)查询用户信息
2.根据用户名称模糊查询用户信息
3.添加用户
3.删除用户
public class MybatisFirst {
//根据id查询用户信息
public void fingUserByIdTest() throws IOException {
//加载配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库
User user = sqlSession.selectOne("test.fingUserById",1);//selectOne:查询出一条记录进行映射,单记录也可以使用selectList
//第一个参数为映射文件statement的id(namespqce+"."+id)
// 第二个指定映射文件中所匹配parameterType类型的参数
//结果为映射文件中的resultType类型的对象
System.out.print(user);
sqlSession.close();
}
//根据用户名称模糊查询
public void findUserByNameTest() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> userList = sqlSession.selectList("test.findUserByUsername","小明");//selectList:查询多条记录进行映射
System.out.print(userList);
sqlSession.close();
}
//添加用户
public void insertUserTest() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user