学习日记第七天—MyBatis

MyBatis

什么是MyBatis?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis的使用

1、用maven导入相关包
	<dependency>
  		<groupId>org.mybatis</groupId>
  		<artifactId>mybatis</artifactId>
  		<version>3.4.6</version>
  	</dependency> //mybatis包
  	
  	<dependency>
  		<groupId>mysql</groupId>
  		<artifactId>mysql-connector-java</artifactId>
  		<version>5.1.27</version>
  	</dependency>//mysql包
2、配置mybatis全局文件,以及在创建映射后关联映射文件
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd"> //文档标签规则dtd文档
 <configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="MySql的URL"/>						
        <property name="username" value="账号"/>
        <property name="password" value="密码"/>
      </dataSource>
    </environment>
  </environments>
  
  <mappers>
  	<mapper resource="com/sxt/pojo/userMapper.xml"/>//关联映射文件
  </mappers>
  
</configuration>
3、创建对应映射,即写sql语句
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sxt.pojo.userMapper">
  <insert id="adduser" parameterType="com.sxt.pojo.User">
  	insert into mybatis(name,password) values(#{name},#{password}) //数据库插入语句
  </insert>
</mapper>
4、测试
//1、加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-cfg.xml");
//2、获取SqlSessionFactory对象
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//3、通过SqlSessionFactory对象获取SqlSession对象
SqlSession ss=factory.openSession();
//4、通过session对象的API来执行操作
User user=new User();
user.setName("张三");
user.setPassword("123");
int insert = ss.insert("com.sxt.pojo.userMapper.adduser", user); //映射中配置的信息
//因为自动提交默认是关闭的,所以这里需要手动提交
ss.commit();
System.out.println(insert);//打印结果

使用的优化

在上面的代码中,有很多重复的地方,所以我们可以封装起来,还有一些我们可以使用动态代理来得到,这样就可以做到一些代码的简化

1、创建一个工具类DbUtils
public class DbUtils {
	private static SqlSessionFactory factory;
	public static SqlSessionFactory getSessionFactory(){
		if (factory==null) {
			try {
				InputStream in=Resources.getResourceAsStream("mybatis-cfg.xml");
				return new SqlSessionFactoryBuilder().build(in);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return factory;
	}
}
2、创建一个接口
public interface MyBatisDao {
	public int adduser(User user);
}
3、测试代码
public static void main(String[] args) {
		MyBatisDao md=(MyBatisDao) Proxy.newProxyInstance
		(Test2.class.getClassLoader(), new Class[]{MyBatisDao.class}, new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// TODO Auto-generated method stub
				System.out.println("方法名:"+method.getName());
				System.out.println("接口全路径:"+MyBatisDao.class.getName());
				String methodName=method.getName();
				String namespace=MyBatisDao.class.getName()+"."+methodName;
				SqlSession session = DbUtils.getSessionFactory().openSession(true);
				if (methodName.contains("add")) {
					return session.insert(namespace,args[0]);
				}
				return null;
			}
		});
		User user=new User();
		user.setName("周5");
		user.setPassword("12110");
		md.adduser(user);
	}
4、注意事项

这里的xml配置文件必须和接口放在同一包下,而且还与接口名同一名称。如果在查询方法时遇到错误,就将配置改成 < select id=“ID” parameterType=“java.util.Map” resultType=“java.util.Map” > 试一下。
我们还可以在全局配置文件中给别名

<typeAliases>
		<typeAlias type="com.sxt.pojo.User" alias="user"/>
		//大量情况下可以给个包路径
		<package name="com.sxt.pojo"/>
</typeAliases>

当我们在配置文件中使用到com.sxt.pojo.User时可以用别名user代替

存贮集合

存贮集合时我们需要用到类型转换,我们也可以使用系统提供的转换器,也可以自定义一个转换器。

1、创建

创建一个类继承BaseTypeHandler<List < String > >,然后添加注解
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
这是两个类型处理器注解

2、代码

在setNonNullParameter方法中写代码

@Override
	public void setNonNullParameter
	(PreparedStatement ps, int i, List<String> list, JdbcType jdbcType)
			throws SQLException {
		// TODO Auto-generated method stub
		if (list!=null && list.size()>0) {
			StringBuilder sbu=new StringBuilder();
			for (String msg : list) {
				sbu.append(msg+";");
			}
			ps.setString(i, sbu.toString() );
		}
	}

在全局配置文件中添加配置

<typeHandlers>
		<typeHandler handler="com.sxt.typehandler.ListToVarcharHandler"/>
</typeHandlers>

测试代码

public static void main(String[] args) {
		SqlSession session =DbUtils.getSessionFactory().openSession(true);
		User user=new User();
		user.setName("周5");
		user.setPassword("12110");
		user.setGames(Arrays.asList("ab","dc","bs"));
		MyBatisDao mapper = session.getMapper(MyBatisDao.class);
		System.out.println(mapper+"mapper");
		mapper.adduser(user);
	}

数据库存贮样例
在这里插入图片描述

取出存贮的集合信息

在ListToVarcharHandler类中的两个方法

@Override
	public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
		// TODO Auto-generated method stub
		String msg=rs.getString(columnName);
		if (msg!=null&&!"".equals("msg")) {
			return Arrays.asList(msg.split(";"));
		}
		return null;
	}

	@Override
	public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		// TODO Auto-generated method stub
		String msg=rs.getString(columnIndex);
		if (msg!=null&&!"".equals("msg")) {
			return Arrays.asList(msg.split(";"));
		}
		return null;
	}

测试

SqlSession session =DbUtils.getSessionFactory().openSession(true);
MyBatisDao md = session.getMapper(MyBatisDao.class);
List<User> list=md.query();
for (User user : list) {
	System.out.println(user);
}

利用这种方式我们也能实现数据的插入和查询。

log4j

在程序的运行的过程中为了便于查询sql的输出,需要引入log4j,使用以后它会打印SQL语句

导入依赖

在这里插入图片描述

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
</dependency>
// maven坐标
创建一个File文档

在这里插入图片描述

然后再创建的File文档中添加代码
log4j.rootCategory=debug, stdout , R 	 //debug是级别  stdout和R是日志的输出方式
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender      ///将日志输出到控制台
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout		//输出的布局
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n	//输出的内容格式
 
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender		//按天将日志信息输入进文件
log4j.appender.R.File=C:\\tools\\logs\\dpb.log		//输出的目录
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值